【发布时间】:2014-12-08 15:21:42
【问题描述】:
我们计划使用 BouncyCastle v1.51 在 Java 中使用 "AES/GCM/NoPadding"。有人可以阐明关于附加认证数据 (AAD) 和认证标签的使用和生成的理想实施/最佳实践吗?
- 应该在什么时候在加密过程中使用 AAD?
- 根据文档,身份验证标签是加密输出的一部分。它以什么格式附加到加密输出?
- 解密时如何处理认证标签?
以下是加密代码:
private static byte[] encryptGCM(byte[] plaintext,
byte[] randomKeyBytes, byte[] randomIvBytes) throws Exception{
SecretKey randomKey = new SecretKeySpec(randomKeyBytes, "AES");
Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding", new BouncyCastleProvider());
cipher.init(Cipher.ENCRYPT_MODE, randomKey, new IvParameterSpec(
randomIvBytes)); //TODO: here IvParamSpec could also be gcmP = new GCMParameterSpec(12, keys, 32, 12);
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
CipherOutputStream cipherOutputStream = new CipherOutputStream(byteArrayOutputStream, cipher);
cipherOutputStream.write(plaintext);
cipherOutputStream.close();
return byteArrayOutputStream.toByteArray();//this is the encrypted text
}
【问题讨论】:
-
本网站不适用于此类代码审查问题。当用户询问有关特定问题的特定问题时,它的效果最好。请将您的问题细化为更具体、更易回答的问题。
-
您可能想看看this page。然而,示例程序没有使用 Bouncy Castle。
-
不,相反,我确信柜台会重复=) 不是早晚都会做吗?在this document 中,我尽我所能“争辩”一个IV 足以容纳68.72 gig 数据。鉴于我的最终目标是分块文件传输(每个块为 1 MB 或其他大小),并且一个会话合理地不会超过传输的 Long.MAX_VALUE 文件片段,我愿意相信代码“非常安全”。
-
如果是您的应用程序,您会跟踪计数器并在计数器重复之前需要新的会话密钥吗?感谢您的代码审查!非常感谢,我感到很荣幸 =)
-
抱歉,忘记了 CTR IV 是根据给定的 IV 计算的,您的代码非常安全。正如我所说,漫长的一天。
标签: java aes google-cloud-messaging bouncycastle