сбой расшифровки шифра python

#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. тогда, конечно, ваши тестовые данные неверны