Encryption 无填充的16字节AES加密
这应该是一个简单的问题,但我无法从openssl文档中找到任何示例或答案 我想加密精确的128位,它应该适合一个加密块 所以我打电话给EVP\u EncyptInit\u ex,然后呢 我是否调用Encryption 无填充的16字节AES加密,encryption,openssl,aes,Encryption,Openssl,Aes,这应该是一个简单的问题,但我无法从openssl文档中找到任何示例或答案 我想加密精确的128位,它应该适合一个加密块 所以我打电话给EVP\u EncyptInit\u ex,然后呢 我是否调用EVP\u EncryptUpdate\u ex(对128位块进行加密)和EVP\u EncryptFinal\u ex(即使没有其他东西需要加密) 或者仅执行副总裁加密更新\u ex? 或者只有EVP\u EncryptFinal\u ex?在这里,您已经了解了步骤。 因此,它将是 EVP_encry
EVP\u EncryptUpdate\u ex
(对128位块进行加密)和EVP\u EncryptFinal\u ex
(即使没有其他东西需要加密)
或者仅执行副总裁加密更新\u ex
?
或者只有
EVP\u EncryptFinal\u ex
?在这里,您已经了解了步骤。
因此,它将是
EVP_EncryptFinal_ex
还要注意数据不是块长度的倍数
在我看来,如果您只需要在没有填充的情况下使用AES(EVP_uu.interfaces负责填充),那么就选择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);
无填充的16字节AES加密
使用EVP.*
接口并禁用块上的填充
使用EVP.*
接口,因为它支持引擎和硬件加速,如AES-NI。AES\u encrypt
函数基于软件,不支持替代实现。此外,它并不明显,但AES_encrypt不可移植-一些平台存在持久性问题
您需要调用EVP\u CIPHER\u CTX\u set\u padding
以确保不添加填充。从手册页:
EVP_CIPHER_CTX_set_padding()启用或禁用填充。默认情况下
加密操作使用标准块填充和
解密时会检查并删除填充。如果pad参数
为零,则不执行填充,即数据总量
然后,加密或解密必须是块大小的倍数或
错误将会发生。
应在为设置上下文后调用此函数
使用EVP_EncryptInit_ex()进行加密或解密
因此,您的步骤是:
EVP\u CIPHER\u CTX\u new
创建上下文EVP\u CIPHER\u CTX\u set\u padding
EVP\u EncryptUpdate\u ex
加密数据EVP\u EncryptFinal\u ex
检索密码文本另请参见OpenSSL wiki。不过,我已经介绍了这一部分。要像我刚才尝试的那样对此添加注释,需要根据文档翻转步骤2和步骤3。EVP_CIPHER_CTX_set_padding()启用或禁用填充。在使用EVP_EncryptInit_ex()为加密或解密设置上下文后,应调用此函数