Pycrypto AES GCM 加密和 Java 解密

Ala*_*ack 3 python java encryption aes-gcm pycryptodome

我正在使用 Pycryptodome(一个 PyCrypto fork)来创建 AES-GCM 密文。我使用以下 Python 代码进行加密:

cek = os.urandom(16)
nonce = os.urandom(12)

cipher = AES.new(cek, AES.MODE_GCM, nonce=nonce, mac_len=16)
ciphertext = cipher.encrypt(message)
Run Code Online (Sandbox Code Playgroud)

然后我将其传递给 Java 进行解密:

byte[] nonce = new byte[12];

Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");
GCMParameterSpec gcmSpec = new GCMParameterSpec(128, iv);
SecretKeySpec secretKeySpec = new SecretKeySpec(cek, "AES");

IvParameterSpec ivParameterSpec = new IvParameterSpec(nonce);
cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, gcmSpec);

byte[] decBytes = mCipher.doFinal(cipherText);
Run Code Online (Sandbox Code Playgroud)

但是,我收到以下错误:

Exception in thread "main" javax.crypto.AEADBadTagException: Tag mismatch!
    at com.sun.crypto.provider.GaloisCounterMode.decryptFinal(GaloisCounterMode.java:524)
    at com.sun.crypto.provider.CipherCore.finalNoPadding(CipherCore.java:1023)
    at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:960)
    at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:824)
    at com.sun.crypto.provider.AESCipher.engineDoFinal(AESCipher.java:436)
    at javax.crypto.Cipher.doFinal(Cipher.java:2165)
Run Code Online (Sandbox Code Playgroud)

Ala*_*ack 5

您错过了一件事:Pycryptodome 不会将哈希标签添加到消息中 - 您必须将其附加到加密消息中:

例如

ciphertext, tag = cipher.encrypt_and_digest(message)
ciphertext = ciphertext + tag
Run Code Online (Sandbox Code Playgroud)