据我所知,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)时,我在输出缓冲区中得到一个不一致的(每次运行时输出不同)。
我正在使用OpenSSL版本1.0.2k。
什么可能导致这种行为?
答案 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。
中的示例