【问题标题】:FIPS_mode_set function affects encryptionFIPS_mode_set 函数影响加密
【发布时间】:2017-05-24 15:25:26
【问题描述】:

据我所知,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:

密钥文件:

输入文本:

加密输出没有 'FIPS_mode_set'(1):

加密输出带有 'FIPS_mode_set'(1):

我使用的是 OpenSSL 版本 1.0.2k。

什么可能导致这种行为?

【问题讨论】:

  • “输出不一致”是什么意思?你有一个期望值(+推理你为什么期望它)和实际结果吗?如果你这样做,请将它包含在问题中
  • @MaartenBodewes - 我添加了更多信息来回答您的所有问题。

标签: encryption openssl fips


【解决方案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 中的示例。

【讨论】:

  • 我从链接中复制了代码,只更改了使用的密码(EVP_aes_128_cbc 而不是 EVP_aes_256_cbc)。我想出了两件事:1. EVP_EncryptInit_ex 失败,这就是为什么我在输出中得到垃圾 2. 这是我得到的输出:'139693591844832:error:2D078072:lib(45):func(120):reason (114):fips.c:311:139693591844832:error:2D06D073:lib(45):func(109):reason(115):fips_enc.c:124:'
猜你喜欢
  • 2011-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-02
  • 2016-10-27
  • 1970-01-01
  • 2016-08-09
相关资源
最近更新 更多