我在我的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解密的在线性质变得混乱 – 需要内部缓冲而不是直接返回明文.另一方面,在解密期间自动验证标签.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。