在AES/GCM/NoPadding解密过程中,需要使用相同的密钥、初始化向量(IV)和认证标签(Tag)来解密密文。为了找到正确的标签,可以通过以下步骤实现:
SecretKey secretKey = new SecretKeySpec(keyBytes, "AES");
Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");
cipher.init(Cipher.DECRYPT_MODE, secretKey, new GCMParameterSpec(128, ivBytes));
byte[] decryptedBytes = cipher.doFinal(ciphertextBytes);
getAuthenticationTag
方法获取解密过程中生成的认证标签。byte[] tag = cipher.getAuthenticationTag();
完整示例代码如下:
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.spec.GCMParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;
public class AESGCMNoPaddingExample {
public static void main(String[] args) throws Exception {
byte[] keyBytes = Base64.getDecoder().decode("your_key_base64");
byte[] ivBytes = Base64.getDecoder().decode("your_iv_base64");
byte[] ciphertextBytes = Base64.getDecoder().decode("your_ciphertext_base64");
SecretKey secretKey = new SecretKeySpec(keyBytes, "AES");
Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");
cipher.init(Cipher.DECRYPT_MODE, secretKey, new GCMParameterSpec(128, ivBytes));
byte[] decryptedBytes = cipher.doFinal(ciphertextBytes);
byte[] tag = cipher.getAuthenticationTag();
// 输出解密后的明文和标签
System.out.println("Decrypted plaintext: " + new String(decryptedBytes));
System.out.println("Authentication tag: " + Base64.getEncoder().encodeToString(tag));
}
}
请注意,解密过程中需要提供正确的密钥、IV和密文。此外,标签是在解密过程中自动生成的,因此只能在解密完成后获取。