使用Java中的身份验证标记实现AES GCM

前端之家收集整理的这篇文章主要介绍了使用Java中的身份验证标记实现AES GCM前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

我在我的android项目中使用AES GCM身份验证,它工作正常.但与openssl API生成标记相比,在验证标记时遇到一些问题.请在下面找到java代码

SecretKeySpec skeySpec = new SecretKeySpec(key,"AES");
byte[] iv = generateRandomIV();
IvParameterSpec ivspec = new IvParameterSpec(iv);
Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");
cipher.init(Cipher.ENCRYPT_MODE,skeySpec,ivspec);
int outputLength = cipher.getOutputSize(data.length); // Prepare output buffer
byte[] output = new byte[outputLength];
int outputOffset = cipher.update(data,data.length,output,0);// Produce cipher text
outputOffset += cipher.doFinal(output,outputOffset);

我在iOS中使用openssl,并使用下面的代码生成身份验证标记

NSMutableData* tag = [NSMutableData dataWithLength:tagSize];
EVP_CIPHER_CTX_ctrl(&ctx,EVP_CTRL_GCM_GET_TAG,[tag length],[tag mutableBytes])

在java或bouncy castle中,无法获得openssl返回的确切身份验证标记,并且可以帮助我解决此问题.谢谢

最佳答案
在Java中,遗憾的是,在密文的末尾添加标记.您可以使用GCMParameterSpec配置大小(以位为单位,使用8的倍数).因此,如果你真的想要,你可以使用Arrays.copyOfRange(密文,密文长度 – (tagSize / Byte.SIZE),ciphertext.length)来获取它.

遗憾的是,标签不必放在最后,这会使GCM解密的在线性质变得混乱 – 需要内部缓冲而不是直接返回明文.另一方面,在解密期间自动验证标签.

原文链接:https://www.f2er.com/android/431084.html

猜你在找的Android相关文章