1. Си / Говнокод #18293

    +141

    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
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    WIN32DLL_DEFINE int _mcrypt_set_key(RI * rinst, byte * key, int nk)
    {				/* blocksize=32*nb bits. Key=32*nk bits */
    	...
    
    	int nb = 8;		/* 256 block size */
    	int i, j, k, m, N;
    	int C1, C2, C3;
    	word32 CipherKey[8];
    
    	nk /= 4;
    
    	...
    
    	rinst->Nb = nb;
    	rinst->Nk = nk;
    
    	...
    
    	if (rinst->Nb < 8) { /* что-что? */
    		...
    	} else {
    		...
    	}
    
    	...
    
    	N = rinst->Nb * (rinst->Nr + 1);
    
    	for (i = j = 0; i < rinst->Nk; i++, j += 4) { /* а вдруг Nk больше 8? */
    		CipherKey[i] = pack(&key[j]);
    	}
    	
    	...
    }

    Реализация блочного симметричного шифрования Rijndael-256 в libmcrypt.
    Прим.: libmcrypt используется как "криптографическое расширение" в PHP.

    Запостил: denisss025, 08 Июня 2015

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

    • > что-что?
      Возможно, раньше nb можно было передать параметром. А потом код тупо раскопипастили на 3 файла и забыли выпилить проверки.

      > а вдруг Nk больше 8?
      А вдруг k не делится на 4? Чуваки, походу, на проверки вообще забили.

      > modified 2007-02-19
      Зачем могилки раскапываешь?
      Ответить
      • > А вдруг k не делится на 4? Чуваки, походу, на проверки вообще забили.
        В теории, nk должен делиться на 4, потому что nk - это размер ключа в битах, и должен быть кратен 8-ми.

        >> modified 2007-02-19
        > Зачем могилки раскапываешь?
        Крик души или что-то вроде того. К сожалению, библиотека Mcrypt поставляется вместе с PHP и, если я правильно понимаю, PHP-сообществом рассматривается как криптографическая библиотека по умолчанию (некоторые PHP-программисты мне называли её "стандартной").
        И спасибо за аналогию... Теперь буду называть любителей Mcrypt некрофилами))
        Ответить
        • >> В теории, nk должен делиться на 4, потому что nk - это размер ключа в битах, и должен быть кратен 8-ми.

          Вот как раз в теории ключ может быть любого размера, а на практике юзают кратные
          Ответить
          • > кратные
            Я бы даже сказал, что фиксированные. Когда рижднаэль стал стандартом, в нём всего 3 варианта оставили.
            Ответить
            • Немного уточню, по терминологии libmcrypt Rijndael-256 - это Rijndael с 256-битным блоком, а стандартом стал Rijndael с 128-битным блоком.
              Ответить
              • Ну эту либу, походу, до принятия стандарта пилили... Ибо АЕС тут вообще не упоминается.
                Ответить
                • Если говорить про "вообще", то вообще упоминается в документации + есть файл aes_test.c, который проверяет работу Rijndael-128.
                  Ответить
        • В байтах, кстати. Поэтому лучше проверить.
          Ответить
          • Да, верно, в байтах. Попутал из-за комментария в коде:
            > Key=32*nk bits
            Ответить
            • Комментарий врёт, да. Там 32*rinst->Nk должно быть. Ну или 8*nk.
              Ответить

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