首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在Java中使用AAD解密AES-GCM编码消息

如何在Java中使用AAD解密AES-GCM编码消息
EN

Stack Overflow用户
提问于 2022-03-03 02:55:12
回答 1查看 343关注 0票数 0

我有一些现有的C++代码,使用openssl发送加密消息。

我正在编写一个新的基于Java的客户端来接收此消息,但无法正确解密该消息。我得到了javax.crypto.AEADBadTagException: Tag mismatch错误。

该消息的结构如下:

代码语言:javascript
运行
复制
header info (21 bytes)
nonce (12 bytes)
tag data (16 bytes)
encrypted payload (n bytes)

头和无字节作为附加的经过身份验证的数据输入。

要解密的Java代码:

代码语言:javascript
运行
复制
    Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");
    cipher.init( Cipher.DECRYPT_MODE,
                 aesKey,
                 new GCMParameterSpec( 96, packet.getNonce() ));

    cipher.updateAAD( packet.getHeaderAndNonce() );
    return cipher.doFinal( packet.getEncryptedData() );

我在https://stackoverflow.com/a/26370130/212589中提到,在Java中,加密时在密码文本的末尾添加标记数据。我尝试更改packet.getEncryptedData()以返回以下内容:

bytes)

  • encrypted标记数据(16字节)+加密有效载荷(n个有效载荷(n字节)+标记数据(16字节))

但这两种情况都失败了,只有相同的坏标记例外。

我做错了什么?

作为参考,下面是执行加密的C++代码:

代码语言:javascript
运行
复制
const unsigned int NONCE_LEN = 12;
const unsigned int TAG_DATA_LEN = 16;
const unsigned int DATA_PACKET_HEADER_LEN = 49;
const unsigned int DATA_NONCE_OFFSET = 21;
const unsigned int DATA_TAG_DATA_OFFSET = 33;

std::array<byte, NONCE_LEN> randomNonce = getRandomNonce();
std::copy(randomNonce.begin(), randomNonce.end(), _data.begin() + DATA_NONCE_OFFSET);

EVP_EncryptInit_ex(cipherContext, EVP_aes_256_gcm(), nullptr, encryptionKey.data(), randomNonce.data());

int outlen;
EVP_EncryptUpdate(cipherContext, nullptr, &outlen, _data.data(), DATA_PACKET_HEADER_LEN - TAG_DATA_LEN);    
EVP_EncryptUpdate(cipherContext, _data.data() + DATA_PACKET_HEADER_LEN, &outlen,
        _payloadPlaintext.data(), _payloadPlaintext.size() );

EVP_EncryptFinal_ex(cipherContext, nullptr, &outlen);
EVP_CIPHER_CTX_ctrl(cipherContext, EVP_CTRL_GCM_GET_TAG, TAG_DATA_LEN, &_data[DATA_TAG_DATA_OFFSET]);
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-03-03 16:17:29

我的解决方案有两个问题(见@_085的评论)

  1. 传递给GCMParameterSpec的标记长度参数是错误的。应该是128个
  2. ,Java解密假定标记数据位于密文的末尾,所以在我的示例中,我必须从一开始就移动标记数据字节。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71331595

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档