Я пытался выполнить шифрование 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)
0
необходимо использовать\0
, т.е. IV в обоих кодах на данный момент разные. На практике GCM обычно применяет 12-байтовый IV, и IV, конечно, не должен быть статическим. - person user 9014097   schedule 21.10.20200
должно быть\0
? - person BlueHam   schedule 21.10.2020nonce=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