1. C++ / Говнокод #22714

    −16

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    void subBytes(uint8_t* block, size_t count) {
    	for (int i = 0; i < count; i++) {
    		size_t x, y;
    		char *temp = new char[2];
    		sprintf(temp, "%02x", block[i]);
    		temp = new char[4]{ temp[0], 0x00, temp[1], 0x00 };
    		x = stoi(temp, 0, 16);
    		y = stoi(temp + 2, 0, 16);
    		block[i] = sBox[x][y];
    		delete[] temp;
    	}
    
    }
    void invSubBytes(uint8_t* block, size_t count) {
    	for (int i = 0; i < count; i += 1) {
    		size_t x, y;
    		char *temp = new char[4];
    		sprintf(temp, "%02x", block[i]);
    		temp = new char[4]{ temp[0], 0x00, temp[1], 0x00 };
    		x = stoi(temp, 0, 16);
    		y = stoi(temp + 2, 0, 16);
    		block[i] = invSbox[x][y];
    		delete[] temp;
    	}
    }

    https://github.com/VenkuSkirata/MyAES/blob/5f9161551f1a743c7ca6b0ebdf492904cc097d8d/AES.cpp#L123-L147

    Тут один человек просил покритиковать его код, нувыпонели

    Запостил: j123123, 31 Марта 2017

    Комментарии (27) RSS

    • > Bytes
      > uint8_t*
      > stoi

      Начали за здравие, кончили за упокой.
      Ответить
      • там еще и утечка памяти есть
        Ответить
        • Да ты что??? А где?
          Ответить
          • Чуть ниже того места, где он своим sprintf-ом залазит за границу массива. Что характерно, в функции invSubBytes в начале выделяется аж целых 4 байта (хотя хватило бы 3 с учетом нуль-терминированности), и там уже ошибки вылезания за границы нет, но вот только память будет быстрее вытекать.

            Это вообще надо талант иметь, чтобы столько говна натворить в столь коротком фрагменте
            Ответить
        • >>> Implementation of AES (FIPS 197)
          Ничего вы не понимаете, это там по стандарту FIPS 197 утечка!
          Ответить
    • > MyAES
      Уже смешно. Ок, прежде чем лезть в кишки реализации, давайте посмотрим интерфейс.
      namespace AES {
      	void encrypt(uint8_t* text, uint8_t* cipherKey);
      	void decrypt(uint8_t* text, uint8_t* cipherKey);
      }
      О, тут явно линкуется libvanga, иначе как мы узнаем длину ключей и plaintext? Посмотрим пристальнее
      switch (strlen((char*)cipherKey)) {
      Действительно, ключи же не могут содержать нулевых байтов, это нонсенс. Да и шифровать бинарные файлы мы тоже никогда не захотим, тим uint8_t* нам толсто на это намекает.
      Ответить
      • > Да и шифровать бинарные файлы мы тоже никогда не захотим, тим uint8_t* нам толсто на это намекает.
        Зачем над автором издеваетесь, это же для целочисленных файлов. Жаль только, что в C++ нет шаблонов, чтобы написать универсальный код для работы и с целыми, и с вещественными файлами. То ли дело C#, там даже объектные файлы можно шифровать.
        Ответить
        • > это же для целочисленных файлов
          для строковых файлов
          Ответить
        • в c++17 появился новый std::byte на замену char/unsigned char/int8_t/uint8_t, как раз для бинарных данных. Точнее, чтобы еще раз толсто намекнуть, что там не строка
          Ответить
        • Для натуральных файлов, раз уж не могут 0 содержать.
          Ответить
          • 0 давно уже считается натуральным числом почти везде, только особо упоротые его исключают из ℕ
            Ответить
            • Ну, значит для целых положительных файлов.
              Ответить
              • Для файлов, не делящихся на 256
                Ответить
                • показать все, что скрытоНе, их же потом ещё расшифровывать надо. А т.к. распределение шифротекста близко к случайному, то часть из них получится с нулями и не расшифруется.

                  Надо всё-таки в GF(255) переходить, чтобы ноль оставить специальным значением.
                  Ответить
      • показать все, что скрытоА каждый 256й файл и расшифровать не получится...
        Ответить
      • показать все, что скрытоКстати, а можно ведь попробовать заменить GF(256) на GF(255)...
        Ответить
    • sprintf(temp, "%02x", block[i]);
      		temp = new char[4]{ temp[0], 0x00, temp[1], 0x00 };


      Кэп я нихера не понял ? Это как?
      Ответить
      • Ну тут же все очевидно.

        Он спринтф-ом получает из 8-битного uint числа строку, например если число было 63 то в 16-ричной системе это будет 3f. Потом он аллоцирует опять 4 байта, в первый элемент сует первый кусочек, во второй - второй кусочек. Ну т.е. если block[i] равен 0x3f то фактически получается:
        temp = new char[4]{ '3', 0x00, 'f', 0x00 };

        После чего сие говно читается через stoi, иными словами он таким вот способом получает половинки байта
        Сдвиги и битовые маски для лохов
        Ответить
        • А питушня вида x = new T[N]{ x[i] }, если забыть про утечки памяти, корректна? Как и когда вычисляются выражения в фигурных скобках?
          Ответить
          • https://ru.wikipedia.org/wiki/%D0%9E%D0%BF%D0%B5%D1%80%D0%B0%D1%82%D0%BE%D1%80%D1%8B_%D0%B2_C_%D0%B8_C%2B%2B#.D0.9F.D1.80.D0.B8.D0.BE.D1.80.D0.B8.D1.82.D0.B5.D1.82.D1.8B_.D0.BE.D0.BF.D0.B5.D1.80.D0.B0.D1.82.D0.BE.D1.80.D0.BE.D0.B2

            У new приоритет больший, чем у присваивания = и получается, что выполняемая внутри new питушня будет выполнена раньше, чем произойдет присваивание, и питушня в new будет отталкиваться от старого значения temp.
            Ответить
            • Хотя вообще хуй знает, может это хуита из серии i = ++i + ++i
              В любом случае, лучше такого говна не писать. Тут надо учитывать порядок вычисления, а не приоритет операторов
              Ответить
              • Вот-вот, я за возможную неразбериху с точками следования беспокоюсь. Посчитать, выделить, скопировать или выделить, посчитать, скопировать - математически эквивалентно; второй вариант кажется более привлекательными с из-за отсутствия лишнего копирования.
                Ответить
                • Хотя, насколько я понял зарубежные тексты, инициализационная питушня считается заранее, и всё должно быть в порядке.
                  Ответить
                • показать все, что скрытоМожет с более привычной конструкцией тебе будет понятнее:
                  i = i + 1;


                  Видишь, это код, который каждый писал в своей жизни хотя бы раз. Разница между этим кодом и i = ++i в том, что первый мутирует i только один раз в рамках точки следования, а второй два. Использовать старое значение i для вычисления нового значения абсолютно нормально, это не UB.
                  Ответить
        • Кэп вас ненавидит: вы забираете у него работу
          Ответить
    • > throw invalid_argument("Password lenght is incorrect:
      А, ну понятно, ещё один умник, не понимающий разницы между "паролем" и "ключом".
      Ответить
      • зато как секьюрно!
        throw invalid_argument("password: letter 6 is incorrect");
        Ответить

    Добавить комментарий