这应该是一个简单的问题,但我找不到任何例子或从openssl文档中找出答案。
我想加密完全 128位,这应该适合一个加密块。
所以我打电话给EVP_EncyptInit_ex
,然后打电话给什么?
我是否呼叫EVP_EncryptUpdate_ex
(加密128位阻止)和EVP_EncryptFinal_ex
(即使没有其他内容可以加密)?
或仅EVP_EncryptUpdate_ex
?
或者只有EVP_EncryptFinal_ex
?
答案 0 :(得分:2)
在这里,您已经找到了相应的步骤。 所以,它将是
EVP_EncryptFinal_ex
还要注意数据不是块长度的多个事实。
在我看来,如果您只使用AES而没有填充(EVP_接口负责填充),那么请转到AES_encrypt
。
它们相当容易使用。
//Step 1: Set encrypt key.
AES_KEY aeskey;
AES_set_encrypt_key(key, bits, &aeskey);
//Step2: Encrypt exactly 128 bits.
AES_encrypt(data, dataout, &aeskey);
答案 1 :(得分:1)
16位字节的AES加密,无填充
使用EVP_*
接口并禁用块上的填充。
使用EVP_*
界面,因为它支持引擎和硬件加速,如AES-NI。 AES_encrypt
函数是基于软件的,不支持其他实现。此外,它不是很明显,但AES_encrypt
不可移植 - 某些平台遭遇了字幕问题。
您需要致电EVP_CIPHER_CTX_set_padding
以确保不添加填充。从EVP_CIPHER_CTX_set_padding(3)
手册页:
EVP_CIPHER_CTX_set_padding()启用或禁用填充。默认情况下 加密操作使用标准块填充和填充 在解密时检查并删除填充。如果是pad参数 为零,则不执行填充,即数据总量 加密或解密必须是块大小的倍数或 会发生错误。 应在设置上下文后调用此函数 使用EVP_EncryptInit_ex()加密或解密。
所以你的步骤是:
EVP_CIPHER_CTX_new
以创建背景EVP_EncryptInit_ex
EVP_CIPHER_CTX_set_padding
EVP_EncryptUpdate_ex
加密数据EVP_EncryptFinal_ex
以检索密文另请参阅OpenSSL wiki上的EVP Symmetric Encryption and Decryption。