【问题标题】:Usage of additional authenticated data & authentication tag for AES-GCM using BouncyCastle使用 BouncyCastle 为 AES-GCM 使用额外的认证数据和认证标签
【发布时间】:2014-12-08 15:21:42
【问题描述】:

我们计划使用 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
}

【问题讨论】:

  • 本网站不适用于此类代码审查问题。当用户询问有关特定问题的特定问题时,它的效果最好。请将您的问题细化为更具体、更易回答的问题。
  • 您可能想看看this page。然而,示例程序没有使用 Bouncy Castle。
  • 不,相反,我确信柜台会重复=) 不是早晚都会做吗?在this document 中,我尽我所能“争辩”一个IV 足以容纳68.72 gig 数据。鉴于我的最终目标是分块文件传输(每个块为 1 MB 或其他大小),并且一个会话合理地不会超过传输的 Long.MAX_VALUE 文件片段,我愿意相信代码“非常安全”。
  • 如果是您的应用程序,您会跟踪计数器并在计数器重复之前需要新的会话密钥吗?感谢您的代码审查!非常感谢,我感到很荣幸 =)
  • 抱歉,忘记了 CTR IV 是根据给定的 IV 计算的,您的代码非常安全。正如我所说,漫长的一天。

标签: java aes google-cloud-messaging bouncycastle


【解决方案1】:

我会按顺序回答问题:

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

【讨论】:

  • 请注意,我正在尝试查看是否可以重写 Bouncy Castle 轻量级 API,以便能够通过保持密文和标签分开来直接返回纯文本。这大大简化了密码。但是因为 Java Cipher 类确实将标签包含在密文中,所以这不会影响 Bouncy Castle provider。使用 EAX 可以减少 30% 的代码,稍微加快操作速度,并使密码更加在线。
猜你喜欢
  • 2019-01-01
  • 2021-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-14
  • 2013-07-17
  • 2020-05-29
相关资源
最近更新 更多