gpt4 book ai didi

java - 在 Java 中检查 AEAD 密码中的标签和关联数据

转载 作者:行者123 更新时间:2023-12-01 20:05:19 28 4
gpt4 key购买 nike

我需要使用 AEAD 在两个用户之间共享信息,部分信息必须加密,部分信息应以明文形式保存。

一旦使用 AES/GCM 加密消息,是否有 API 可以检查密文标签并访问相关数据?

更详细:

我使用 Java 7 和 bouncycaSTLe 作为提供程序,并且我已成功使用相应的 API 加密和解密我的数据:

private byte[] encrypt(SecretKey key, byte[] nonce, byte[] message, byte[] associatedData) throws ... {
Cipher aeadCipher = Cipher.getInstance(AES_GCM_NOPADDING);
aeadCipher.init(Cipher.ENCRYPT_MODE, kint, new GCMParameterSpec(GCM_MAC_SIZE, nonce);
aeadCipher.updateAAD(associatedData);
return aeadCipher.doFinal(message);
}

private byte[] decrypt(SecretKey key, byte[] nonce, byte[] cipherText, byte[] associatedData) throws ... {
Cipher aeadCipher = Cipher.getInstance(AES_GCM_NOPADDING);
aeadCipher.init(Cipher.DECRYPT_MODE, kint, new GCMParameterSpec(GCM_MAC_SIZE, nonce);
aeadCipher.updateAAD(associatedData);
return aeadCipher.doFinal(cipherText);
}

但是,据我了解,AES/GCM 密文应该已经包含可能影响解密的参数(随机数和关联数据)。因此,我希望能够从密文中检索它们,而不是必须将它们与密文一起存储并将它们传递给解密函数。此外,我希望能够运行完整性检查(计算标签)并对关联数据运行一些检查,而不必完全解密消息。

是否有一个 API 可以实现这一点,但我可能错过了?

到目前为止,我已经检查过:

最佳答案

由于 Java API 会自动将该标签放在末尾,因此您只需从加密结果中提取该标签,如下所示:

private byte[] getTag(SecretKey key, byte[] nonce, byte[] message,   byte[] associatedData) throws ... {
Cipher aeadCipher = Cipher.getInstance(AES_GCM_NOPADDING);
aeadCipher.init(Cipher.ENCRYPT_MODE, kint, new GCMParameterSpec(GCM_MAC_SIZE, nonce);
aeadCipher.updateAAD(associatedData);
byte[] encrypted = aeadCipher.doFinal(message);
// Assuming you have an AAD_SIZE = 128 bits (16 bytes)
return Arrays.copyOfRange (encrypted, encrypted.length-16, encrypted.length)

}

关于java - 在 Java 中检查 AEAD 密码中的标签和关联数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23933582/

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