首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于BouncyCastle的AES-GCM附加认证数据及认证标签的使用

基于BouncyCastle的AES-GCM附加认证数据及认证标签的使用
EN

Stack Overflow用户
提问于 2014-12-08 15:21:42
回答 1查看 3.4K关注 0票数 3

我们计划在Java中使用"AES/GCM/NoPadding",使用BouncyCastle v1.51。有人能说明一些关于额外认证数据(AAD)和身份验证标记的使用和生成的理想实现/最佳实践吗?

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

以下是加密代码:

代码语言:javascript
复制
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
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-12-08 20:19:11

我会按顺序回答这些问题:

  1. AAD根本不需要使用,IV已经包含在GCM模式的加密中。对于GCM,您应该始终在任何明文之前指定AAD。Bouncy城堡稍后确实会处理AAD的更新,但是这样做需要模块幂运算。换句话说,它可能大大减慢加密操作的速度。
  2. 使用了总标记的最左边位,没有任何特定的格式设置。比特(或者更准确地说,是字节)只是附加到密文中。注意,这不是以这种方式为算法指定的,附加标记只是一个临时标准。
  3. 一个完整的密文块将被缓冲,并且在解密过程中不会以明文形式返回,以防它包含标记。在doFinal上,从密文中提取正确的字节数,并将其解释为标记,并输出明文的最后一部分。请注意,密文的缓冲是特定于实现的,但是按照定义Cipher的方式,必须进行一些缓冲。
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27361148

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档