gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 04:47:31 42 4
gpt4 key购买 nike

我正在开发使用 AES-CCM 模式的安全应用程序。申请要求如图。

enter image description here

我对解密感到震惊,因为我的应用程序在解密时也需要一个 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只是一个组合AES-CTR 和 CBC-MAC,根据 RFC3610 组合.因此,您也可以通过这种方式实现 CCM 并使用AES-CTR 和 CBC-MAC 所需的 EVP_methods:

  • 对于 AES-256-CTR,有 EVP_aes_256_ctr()
  • 对于 CBC-MAC,需要 AES-256-CBC。为此,有 EVP_aes_256_cbc()
  • 以下是 CBC-encryption 的示例和 CBC-decryption使用 EVP 方法。 CTR结果对应的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解密的Tag信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56209532/

42 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com