#python #encryption
#python #шифрование
Вопрос:
byte[] decoded = Base64.getDecoder().decode(encodedString);
GCMParameterSpec initialVector = new GCMParameterSpec(16 * 8, Arrays.copyOf(decoded, 16));
SecretKeySpec skeySpec = new SecretKeySpec(Base64.getDecoder().decode(key), "AES");
Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");
cipher.init(Cipher.DECRYPT_MODE, skeySpec, initialVector);
byte[] decrypted = cipher.doFinal(Arrays.copyOfRange(decoded, 16, decoded.length));
return new String(decrypted, UTF_8);
Пытаюсь написать эквивалентный код python для приведенного выше. У меня есть следующее, но с дополненными специальными символами.
def decrypt(ciphertext, key):
decoded_text = base64.b64decode(ciphertext)
key = base64.b64decode(key)
iv, ciphertext = decoded_text[:16], decoded_text[16:]
cipher = AES.new(key, AES.MODE_GCM, iv)
return cipher.decrypt(ciphertext)
Пробовал со следующими тестовыми данными…
encodedString = "828OCywY/fz6UbNgdKm6kt7Sag21tu0RJC/Xal3vStGBG9XU89w="
key = "2/2Qhzrz1 9YbvafpTaGUH3tHrxwFVwenqVQOlXyNWI="
expected = "AU5432"
but getting "b'AU5432JSx9eG|2*amp;xaexe6 x02xd1xe55e'". Tried to encode but failed
Any help please ?
Комментарии:
1.
pad(ciphertext)
: Это кажется неправильным, поскольку здесь не выполняется заполнение или удаление. Обратите внимание, что в Java ваша строка преобразования шифрования"AES/GCM/NoPadding"
.2. да. извините, это была ошибка. исправлено. Спасибо
Ответ №1:
получилось — подумал, что это может быть полезно для других
def decrypt(encoded_value, key:str):
decoded_text = base64.b64decode(encoded_value)
decoded_key = base64.b64decode(key)
nonce, tag = decoded_text[:16], decoded_text[-16:]
cipher = AES.new(decoded_key, AES.MODE_GCM, nonce)
return cipher.decrypt_and_verify(decoded_text[16:-16], tag)
Ответ №2:
Вот что я написал некоторое время назад. Это работает 🙂
import base64
from Crypto.Cipher import AES
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives.asymmetric import ec
from cryptography.hazmat.primitives import padding, serialization
class AESCipher2(object):
def __init__(self, key, vector):
self.key = key
self.init_vector = vector
def encrypt(self, payload, hashed=False):
padder = padding.PKCS7(128).padder()
padded_payload = padder.update(payload)
padded_payload = padder.finalize()
cipher = AES.new(self.key, AES.MODE_CBC, self.init_vector)
if hashed:
return base64.b64encode(cipher.encrypt(padded_payload))
else:
return cipher.encrypt(padded_payload)
def decrypt(self, payload, hashed=False):
unpadder = padding.PKCS7(128).unpadder()
if hashed:
payload = base64.b64decode(payload)
cipher = AES.new(self.key, AES.MODE_CBC, self.init_vector)
decrypted_message = cipher.decrypt(payload)
unpadded_payload = unpadder.update(decrypted_message)
unpadded_payload = unpadded_payload unpadder.finalize()
return unpadded_payload
Комментарии:
1. Спасибо за это. Но ваш пример кода против моих тестовых данных, похоже, не дает ожидаемых результатов.
2. тогда, конечно, ваши тестовые данные неверны