Как расшифровать строку с помощью PyCrypto?

Пытаюсь в питоне декодировать рельсовую куку, но столкнулся со сложностями.

iv декодируется из base64.b64decode, возвращается строка вида
\xe7^t\xd1\xad\xf7o\x8fw\xf3V\xbby\xa7\x1ei\xce8\xe3}\x1b\xeb\xb7\x9e\x7f\xce^\xe7\xdd\xfd


AES.new(key, AES.MODE_CBC, iv)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.7/dist-packages/Crypto/Cipher/AES.py", line 94, in new
    return AESCipher(key, *args, **kwargs)
  File "/usr/lib/python2.7/dist-packages/Crypto/Cipher/AES.py", line 59, in __init__
    blockalgo.BlockAlgo.__init__(self, _AES, key, *args, **kwargs)
  File "/usr/lib/python2.7/dist-packages/Crypto/Cipher/blockalgo.py", line 141, in __init__
    self._cipher = factory.new(key, *args, **kwargs)
ValueError: IV must be 16 bytes long


Как я понял, какая-то проблема с типами, но как её решить, не знаю.

  • Вопрос задан
  • 3110 просмотров
Пригласить эксперта
Ответы на вопрос 1
sheknitrtch
@sheknitrtch
Проблема в том, что вы неправильно используете библиотеку для AES дешифрации. В сообщении об ошибки чётко написано, что в переменной iv должно быть ровно 16 байт. Код дешифрации должен выглядеть следующим образом:
key = 'some secret key'
iv = '0123456789012345' #Вектор инициализации.
             #Его длина должна быть 16 байт ровно
ciphertext = '\xe7^t\xd1\xad\xf7o\x8fw\xf3V\xbby\xa7\x1ei\xce8\xe3}\x1b\xeb\xb7\x9e\x7f\xce^\xe7\xdd\xfd'
aes = AES.new(key, AES.MODE_CBC, iv)
text = aes.decrypt(ciphertext)

key - это секретный ключ
iv - это вектор инициализации. Где его брать в вашем случае - не знаю. Это не обязательный параметр. Как написано в документации, можно его не передавать в метод new.
ciphertext - это зашифрованный текст.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы