我正在研究使用AES-CCM模式的安全性应用程序。该应用程序的要求如图所示。
我对解密感到震惊,因为我的应用程序在解密时也应该是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还原为客户端代码。
答案 0 :(得分:1)
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_method:
EVP_aes_256_ctr()
。 EVP_aes_256_cbc()
。EVP_aes_256_cbc()
替换为EVP_aes_256_ctr()
时。EVP_aes_256_cbc()
之外,这里不需要其他EVP方法。由于在各自的EVP方法中已经实现了AES-CTR和AES-CBC,因此这两种机制的输入格式都需要付出最大的努力。在NIST Special Publication 800-38C中可以找到很好的描述。应该注意的是,今天AES-GCM已经成为最受欢迎的AE(AD)模式,例如this post。