首页 > 解决方案 > 线程“主”javax.crypto.AEADBadTagException 中的异常:标记不匹配

问题描述

我正在尝试使用 GCM 解密密码,但出现 TAG 不匹配的异常。早些时候,我们使用 CBC 进行解密及其工作。

public static String getDcryptedGCMPassword(String password,String secretKey) {
    try {
        byte[] cipherData = Base64.getDecoder().decode(password);
        byte[] saltData = Arrays.copyOfRange(cipherData, 8, 16);

        MessageDigest md5 = MessageDigest.getInstance("MD5");
        final byte[][] keyAndIV = GenerateKeyAndIV(32, 16, 1, saltData, secretKey.getBytes(StandardCharsets.UTF_8), md5);
        SecretKeySpec key = new SecretKeySpec(keyAndIV[0], "AES");
        if (cipherData.length < 12 + 16) throw new IllegalArgumentException();
        GCMParameterSpec params = new GCMParameterSpec(128, keyAndIV[1], 0, keyAndIV[1].length);
        Cipher cipher = Cipher.getInstance("AES/GCM/PKCS5Padding");
        cipher.init(Cipher.DECRYPT_MODE, key, params);
        byte[] decryptData = cipher.doFinal(cipherData);
        String decript = new String(decryptData, StandardCharsets.UTF_8);
        return decript;
    } catch (Exception e) {
        log.error("AESGCM256 decrypted text processing failed, error: {}", e);
        return null;
    }
}

例外是:

Exception in thread "main" javax.crypto.AEADBadTagException: Tag mismatch!
   at com.sun.crypto.provider.GaloisCounterMode.decryptFinal(GaloisCounterMode.java:578)
   at com.sun.crypto.provider.CipherCore.finalNoPadding(CipherCore.java:1116)
   at com.sun.crypto.provider.CipherCore.fillOutputBuffer(CipherCore.java:1053)
   at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:853)
   at com.sun.crypto.provider.AESCipher.engineDoFinal(AESCipher.java:446)
   at javax.crypto.Cipher.doFinal(Cipher.java:2164)
   at com.hp.lh.reports.util.EncryptorAESGCM.decrypt(EncryptorAESGCM.java:74)
   at com.hp.lh.reports.util.EncryptorAESGCM.decryptWithPrefixIVNew(EncryptorAESGCM.java:112)
   at com.hp.lh.reports.util.EncryptorAESGCM.main(EncryptorAESGCM.java:209)

标签: javaencryptionaes-gcm

解决方案


推荐阅读