FIPS_mode_set函数会影响加密

时间:2017-05-24 15:25:26

标签: encryption openssl fips

据我所知,OpenSSL的函数FIPS_mode_set不应影响加密。如果使用弱密码,它所做的只是终止程序。

我有一段使用EVP_aes_128加密的代码:

EVP_CIPHER_CTX ctx;// = EVP_CIPHER_CTX_new();
EVP_CIPHER_CTX_init(&ctx);
const EVP_CIPHER *cipher = EVP_aes_128_cbc();
EVP_EncryptInit(&ctx, cipher, key, IV);
EVP_CIPHER_CTX_set_padding (&ctx, 0);
EVP_EncryptUpdate(&ctx, encrypted.get(), &encrypted_size, paddedPlain.get(), encrypted_size);
return encrypted;

此代码是一致的(我在每次运行时获得相同的输出)并始终按预期工作(解密功能正在解密它而没有任何问题)。但是当我在运行开始时调用FIPS_mode_set(1)时,我在输出缓冲区中得到一个不一致的(每次运行时输出不同)。

输入IV: IV file contents in HexEditor view

密钥文件: key file contents in HexEditor view

输入文字: the input text

加密输出没有'FIPS_mode_set'(1): the encryption output without FIPS_mode_set

加密输出 with 'FIPS_mode_set'(1): the encryption output  with FIPS_mode_set

我正在使用OpenSSL版本1.0.2k。

什么可能导致这种行为?

1 个答案:

答案 0 :(得分:1)

您没有正确使用API​​,因为您忘记致电EVP_EncryptFinal_ex()。 FIPS模式对清除缓冲区有更严格的要求,所以也许这就是为什么在调用EVP_EncryptFinal_ex()之前没有得到任何密文 - 你似乎没有使用它。

此外,您使用的是过时的功能:

  

函数EVP_EncryptInit()EVP_EncryptFinal()EVP_DecryptInit()EVP_CipherInit()EVP_CipherFinal()已过时但保留以与现有代码兼容。新代码应使用EVP_EncryptInit_ex()EVP_EncryptFinal_ex()EVP_DecryptInit_ex()EVP_DecryptFinal_ex()EVP_CipherInit_ex()EVP_CipherFinal_ex(),因为他们可以重用现有的上下文而无需分配和释放每次通话都会。

请确保尽可能多地保留OpenSSL (EVP) Wiki

中的示例