Соответствует ли PHP расширение mcrypt FIPS 197? - PullRequest
3 голосов
/ 08 ноября 2011

Я использую следующий код шифрования, который работает как брелок, но я должен подтвердить, что он соответствует FIPS 197, иначе Legal убьет меня.

mcrypt_encrypt(MCRYPT_RIJNDAEL_256, SALT, $plaintext, MCRYPT_MODE_ECB,
               mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB),
                                MCRYPT_RAND))

и

mcrypt_decrypt(MCRYPT_RIJNDAEL_256, SALT, $plaintext, MCRYPT_MODE_ECB,
               mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB),
                                MCRYPT_RAND))

Ответы [ 3 ]

6 голосов
/ 08 ноября 2011

Алгоритм Mcrypt RIJNDAEL_256 является версией алгоритма Rijndael с размером блока 256 бит.AES (это то, что определяет FIPS 197) имеет только версии с 128-битным размером блока (и тремя различными размерами ключа).

Так что нет, вы здесь не используете AES.Вместо этого используйте RIJNDAEL_128, что аналогично AES.

В вашем коде есть и другие проблемы:

  • Никогда не используйте ECB, если вы шифруете более одногоблок с тем же ключом.Так что никогда.Вместо этого используйте безопасный режим работы, такой как CBC или CTR.

  • Как прокомментировал CodeInChaos, вы обычно хотите убедиться, что у вас также есть аутентичность, а не только конфиденциальность (и в зависимости от вашего протокола,вам может даже понадобиться аутентификация для конфиденциальности).Поэтому добавьте MAC к своему сообщению или используйте режим работы, который также обеспечивает аутентификацию вместе с конфиденциальностью (например, CCM или GCM) - не уверен, какие из них включены в mcrypt.

  • Вы генерируете случайный вектор инициализации при шифровании (хорошо) и дешифровании (плохо).Это не имеет значения для ECB, поскольку он не использует вектор инициализации, но в любом другом режиме вы получите разные векторы инициализации для обоих действий, а это означает, что дешифрование даст разные результаты.С CBC только первый блок будет мусором, в то время как с CTR все будет мусором (а CCM / GCM просто сообщит «сбой»).

    Поскольку вектор инициализации не должен быть секретным (просто не-предсказуемый или неповторяющийся, в зависимости от режима), обычно либо отправлять его вместе с сообщением (в качестве префикса), либо извлекать его (с обеих сторон) из общего секрета (как первые векторы инициализации вSSL / TLS, которые являются производными от главного секрета, так же как ключи шифрования и ключи MAC).

1 голос
/ 08 ноября 2011

FIPS 197 определяет только алгоритм Rijndael, а не реализацию.Так что да, это соответствует.

Реализация, однако, указана в NIST SP 800-38A.

Я не знаю об остальном (заполнение открытым текстом, сила PRNG и т. Д.), но ECB - это очень, очень плохая вещь , которую нужно делать в 99% реализаций Rijndael и поэтому не рекомендуется.

1 голос
/ 08 ноября 2011

Зависит от того, что ваше определение «соответствует».Соответствует ли оно всем правилам, установленным в FIPS 197 - да, я верю в это.

Это не FIPS 197 подтверждено .Подтвержденная реализация означает, что она была специально протестирована NIST / CST Labs и сертифицирована на соответствие требованиям FIPS pub 197. Вы можете использовать этот список для получения списка всех поставщиков и продуктов, прошедших проверку FIPS 197.

...