我有一些现有的C++代码,使用openssl发送加密消息。
我正在编写一个新的基于Java的客户端来接收此消息,但无法正确解密该消息。我得到了javax.crypto.AEADBadTagException: Tag mismatch
错误。
该消息的结构如下:
header info (21 bytes)
nonce (12 bytes)
tag data (16 bytes)
encrypted payload (n bytes)
头和无字节作为附加的经过身份验证的数据输入。
要解密的Java代码:
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)
但这两种情况都失败了,只有相同的坏标记例外。
我做错了什么?
作为参考,下面是执行加密的C++代码:
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]);
发布于 2022-03-03 16:17:29
我的解决方案有两个问题(见@_085的评论)
GCMParameterSpec
的标记长度参数是错误的。应该是128个https://stackoverflow.com/questions/71331595
复制相似问题