gpt4 book ai didi

java - 使用 BouncyCaSTLe 为 AES-GCM 使用额外的认证数据和认证标签

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:22:25 34 4
gpt4 key购买 nike

我们计划使用 BouncyCaSTLe v1.51 在 Java 中使用 "AES/GCM/NoPadding"。有人可以阐明有关使用和生成附加身份验证数据 (AAD) 和身份验证标签的理想实现/最佳实践吗?

  1. 在加密过程中应该在什么时候使用 AAD?
  2. 根据文档,身份验证标签是加密输出的一部分。它以什么格式附加到加密输出?
  3. 在解密过程中如何处理身份验证标签?

加密代码如下:

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
}

最佳答案

我会按顺序回答问题:

  1. AAD 根本不需要使用,IV 已经包含在 GCM 模式加密中。对于 GCM,您应该始终在任何明文之前指定 AAD。 Bouncy CaSTLe 稍后会处理 AAD 的更新,但这样做需要模幂运算。换句话说,它可能会显着降低加密操作的速度。
  2. 使用总标记最左边的位,没有任何特定格式。位(或更准确地说,字节)只是附加到密文。请注意,算法并未以这种方式指定,附加标签只是一个临时标准。
  3. 一个完整的密文 block 被缓冲并且在解密过程中不会作为明文返回,以防它包含标签。在 doFinal 上,从密文中取出正确数量的字节并将其解释为标签,然后输出明文的最后部分。请注意,密文的缓冲是特定于实现的,但是 Cipher 的定义方式,一些缓冲必须发生。

关于java - 使用 BouncyCaSTLe 为 AES-GCM 使用额外的认证数据和认证标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27361148/

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