aes-gcm加密和解密的互兼容性



请分享node js中加密和java AES/GCM/NoPadding 中解密的工作代码

节点js中:

function createCipherCommon(text, alg, key, iv) {
var cipher = crypto.createCipheriv(alg, key, iv);
cipher.setAAD(Buffer.from("aad", 'utf8'));
return {
enc: cipher.update(text, 'utf8', 'base64') + cipher.final('base64'),
tag: cipher.getAuthTag().toString('base64')
};
}

Java中,下面的代码给出了javax.crypto.AEADBadTagException:标记不匹配!

public static String createDecipherCommon(byte[] text, byte[] key, String iv, String tag) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException, NoSuchProviderException, InvalidAlgorithmParameterException, UnsupportedEncodingException, DecoderException {
byte[] ivBytes = Base64.getDecoder().decode(iv.getBytes());
byte[] tagBytes = Base64.getDecoder().decode(tag.getBytes());
Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");
cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(key, "AES"), new GCMParameterSpec(128, ivBytes, 0, ivBytes.length));
cipher.updateAAD("aad".getBytes());
return new String(cipher.doFinal(text, 0, text.length));
}

Nodejs中,我做了这些更改,现在它运行良好:

function createCipherCommon(text, alg, key, iv) {
var cipher = crypto.createCipheriv(alg, key, iv);
cipher.setAAD(Buffer.from("aad", 'utf8'));
return {
encwithtag: Buffer.concat([cipher.update(text, 'utf8'), cipher.final(), cipher.getAuthTag()]).toString('base64')
};
}

Java中,未更改

public static String createDecipherCommon(byte[] text, byte[] key, String iv, String tag) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException, NoSuchProviderException, InvalidAlgorithmParameterException, UnsupportedEncodingException, DecoderException {
byte[] ivBytes = Base64.getDecoder().decode(iv.getBytes());
byte[] tagBytes = Base64.getDecoder().decode(tag.getBytes());
Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");
cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(key, "AES"), new GCMParameterSpec(128, ivBytes, 0, ivBytes.length));
cipher.updateAAD("aad".getBytes());
return new String(cipher.doFinal(text, 0, text.length));
}

最新更新