我正在使用AES-CCM模式的安全应用程序上工作。该应用程序的要求如图所示。

c++ - 如何使用openssl获取AES-CCM解密的标签信息-LMLPHP

我对解密感到震惊,因为我的应用程序也应该是TAG,而解密也是如此。

根据openssl EVP Authenticated Encryption and Decryption,我们应提供TAG和TAG长度,如下所示。

/* Set expected tag value. */
if(1 != EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_CCM_SET_TAG, 14, tag))
    handleErrors();

如果未设置标签信息,则结果将全为零。我在e_aes.c at line 3835处浏览了AES-CCM的实现细节,发现如果期望的标记与生成的标记匹配,则仅更新结果。 (是我的理解)

您能否建议我如何处理此问题。

编辑
我已经根据要求创建了图像。实际上,在客户端代码中,它们存储来自加密的TAG值,并与描述时生成的TAG进行比较。即,比较发生在客户端代码处。因此,我需要将在解密中生成的TAG还原为客户端代码。

最佳答案

CCM(带有CBC-MAC的计数器)在RFC3610中定义。 EVP_Authenticated_Encryption_and_Decryption中描述的带有EVP的CCM实现如下:

  • 加密:在encryption期间生成标签:
    int ccm_encrypt(...){
        ...
        /* Set tag length */
        EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_CCM_SET_TAG, 14, NULL);
        ...
        /* Get the tag */
        EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_CCM_GET_TAG, 14, tag);   // tag is generated here
        ...
    }
    
  • 然后,将标签与密文一起传输到接收者。
  • 解密:在decryption期间,接收到的标签用于身份验证:
    int ccm_decrypt(...){
        ...
        /* Set expected tag value. */
        EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_CCM_SET_TAG, 14, tag);   // tag is provided here
        ...
        /* ...obtain the plaintext output...*/
        ret = EVP_DecryptUpdate(ctx, plaintext, &len, ciphertext, ciphertext_len);   // tag is verified here
        ...
    }
    

    仅当解密中使用的标签与加密期间创建的标签相同时,解密才有效。否则,EVP_DecryptUpdate返回0,并为解密的数据提供零值数组。

  • 我不知道图像从哪里来,但是IMO没有正确描述使用EVP_aes_256_ccm()进行的AES-CCM解密。

    编辑:

    使用EVP_aes_256_ccm()时,必须知道解密的加密标签(如上所述),因为解密和身份验证
    只需一步即可完成。

    当然,解密和认证也可以分两个步骤进行:在第一步中,使用AES-CTR进行解密,即确定明文和标签(CBC-MAC 1)。在第二步中,使用CBC-MAC从明文中再次计算标签(CBC-MAC 2)(就像在加密过程中所做的那样)。如果两个标签(CBC-MAC 1和CBC-MAC 2)相同,则身份验证成功。

    据我所知,没有直接支持这种方法的EVP方法。但是,CCM只是一种组合
    根据RFC3610组合的AES-CTR和CBC-MAC。因此,您也可以以这种方式实现CCM并使用
    AES-CTR和CBC-MAC所需的EVP_method:
  • 对于AES-256-CTR,有EVP_aes_256_ctr()
  • 对于CBC-MAC,需要AES-256-CBC。为此,有EVP_aes_256_cbc()
  • 以下是使用EVP方法的CBC-encryptionCBC-decryption的示例。点击率结果对应的EVP方法
    EVP_aes_256_cbc()替换为EVP_aes_256_ctr()时。
  • CBC-MAC的确定本质上是CBC加密,因此,除了EVP_aes_256_cbc()外,这里不需要其他EVP方法。

  • 由于AES-CTR和AES-CBC已经在各自的EVP方法中实现,因此这两种机制的输入格式都需要付出最大的努力。可以在NIST Special Publication 800-38C中找到很好的描述。应当指出,今天AES-GCM已成为最受欢迎的AE(AD)模式,请参见例如this post

    关于c++ - 如何使用openssl获取AES-CCM解密的标签信息,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56209532/

    10-12 04:18