使用其他经过验证的数据&使用BouncyCastle的AES-GCM的身份验证标记

时间:2014-12-08 15:21:43

标签: java aes google-cloud-messaging bouncycastle

我们计划使用BouncyCastle v1.51在Java中使用"AES/GCM/NoPadding"。有人可以了解有关使用情况的理想实施/最佳实践吗?生成额外的认证数据(AAD)&身份验证标签?

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

    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 个答案:

答案 0 :(得分:2)

我将按顺序回答问题:

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