Шифрование Pycryptodome AES_GCM для расшифровки Java

Я пытался выполнить шифрование AES_GCM в Python и дешифрование в Java, ниже приведен соответствующий фрагмент кода для того, что я пытаюсь выполнить, я также проверил вопрос по адресу: Pycrypto AES GCM-шифрование и дешифрование Java это похоже на мою проблему. Я подозреваю, что IV/nonce, который я установил для Python, неверен, любая помощь будет принята с благодарностью.

Код шифрования Python:

from Crypto.Cipher import AES
from base64 import b64encode
someKey = 'Sixteen byte key'
cipher = AES.new(someKey, AES.MODE_GCM, nonce='0000000000000000', mac_len=16)
ciphertext, tag = cipher.encrypt_and_digest(data)
ciphertext = ciphertext + tag
print b64encode(ciphertext)

Код расшифровки Java:

private static byte[] initializationVector = new byte[16];


Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding"); 
 
SecretKeySpec keySpec = new SecretKeySpec(someKey, "AES"); 

GCMParameterSpec gcmParameterSpec = new GCMParameterSpec(128, initializationVector);  
     
cipher.init(Cipher.DECRYPT_MODE, keySpec, gcmParameterSpec);

byte[] bytesString = Base64.getDecoder().decode(theString);  
 
return new String(cipher.doFinal(bytesString), "UTF-8");

Однако я не могу расшифровать это на Java, я получаю следующую ошибку:

javax.crypto.AEADBadTagException: Tag mismatch!
at java.base/com.sun.crypto.provider.GaloisCounterMode.decryptFinal(GaloisCounterMode.java:623)
at java.base/com.sun.crypto.provider.CipherCore.finalNoPadding(CipherCore.java:1116)
at java.base/com.sun.crypto.provider.CipherCore.fillOutputBuffer(CipherCore.java:1053)
at java.base/com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:853)
at java.base/com.sun.crypto.provider.AESCipher.engineDoFinal(AESCipher.java:446)
at java.base/javax.crypto.Cipher.doFinal(Cipher.java:2202)

person BlueHam    schedule 21.10.2020    source источник
comment
В коде Python зашифрованный текст не кодируется Base64, тогда как в коде Java он декодируется Base64. Кроме того, для значения 0x00 в IV вместо 0 необходимо использовать \0, т.е. IV в обоих кодах на данный момент разные. На практике GCM обычно применяет 12-байтовый IV, и IV, конечно, не должен быть статическим.   -  person user 9014097    schedule 21.10.2020
comment
Спасибо за ваш вклад, отредактировал сообщение для кодировки Base64 для фрагмента Python (у меня это есть в моем исходном коде). Вы имеете в виду, что для каждого 0 должно быть \0?   -  person BlueHam    schedule 21.10.2020
comment
Да, nonce=b'\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0' будет соответствовать IV, используемому в коде Java.   -  person user 9014097    schedule 21.10.2020
comment
Спасибо, ваш ответ на другой вопрос (stackoverflow.com/questions/58814261/), и ваш ответ здесь помог мне решить мою проблему. Ваше здоровье!   -  person BlueHam    schedule 21.10.2020