Encryption 无填充的16字节AES加密

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

这应该是一个简单的问题,但我无法从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_encryptInit_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 EncryptInit\u ex
  • 在上下文中调用
    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()为加密或解密设置上下文后,应调用此函数