AES加密16字节,无填充

时间:2013-11-15 12:07:51

标签: encryption openssl aes

这应该是一个简单的问题,但我找不到任何例子或从openssl文档中找出答案。

我想加密完全 128位,这应该适合一个加密块。

所以我打电话给EVP_EncyptInit_ex,然后打电话给什么?

我是否呼叫EVP_EncryptUpdate_ex(加密128位阻止)和EVP_EncryptFinal_ex(即使没有其他内容可以加密)?

或仅EVP_EncryptUpdate_ex? 或者只有EVP_EncryptFinal_ex

2 个答案:

答案 0 :(得分:2)

在这里,您已经找到了相应的步骤。 所以,它将是

  1. EVP_encryptInit_ex
  2. EVP_EncryptUpdate_ex
  3. EVP_EncryptFinal_ex
  4. 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()加密或解密。

所以你的步骤是:

  1. 致电EVP_CIPHER_CTX_new以创建背景
  2. 使用上下文
  3. 调用EVP_EncryptInit_ex
  4. 在上下文
  5. 上调用EVP_CIPHER_CTX_set_padding
  6. 致电EVP_EncryptUpdate_ex加密数据
  7. 致电EVP_EncryptFinal_ex以检索密文
  8. 另请参阅OpenSSL wiki上的EVP Symmetric Encryption and Decryption