Python UnicodeEncodeError с использованием PyCrypto в App Engine - PullRequest
2 голосов
/ 13 ноября 2011

Я пытаюсь передать зашифрованную строку запроса на другой URL.

Следующий код дает мне эту ошибку:

UnicodeEncodeError: кодек 'ascii' не может кодировать символ u '\ u04b7' в позиция 7: порядковый номер вне диапазона (128)

Модуль шифрования PyCrypto

Запуск Python 2.5.2 в App Engine

СТРАНИЦА A

    import Crypto
    from Crypto.Cipher import ARC4

    obj=ARC4.new('stackoverflow')
    msg = 'This is my secret msg'
    encrypted = obj.encrypt(msg);

    self.redirect('/pageb?' + urllib.urlencode({'q': encrypted}))

СТРАНИЦА B

    import Crypto
    from Crypto.Cipher import ARC4

    encrypted = self.request.get('q')
    obj=ARC4.new('stackoverflow')
    decrypted = obj.decrypt(encrypted)

    get_data = cgi.parse_qs(decrypted)

    self.response.out.write(decrypted)
    self.response.out.write(pprint.pprint(get_data))

Traceback

Traceback (most recent call last):
  File "C:\Program Files\Google\google_appengine\google\appengine\ext\webapp\_webapp25.py", line 701, in __call__
    handler.get(*groups)
  File "C:\Program Files\Google\google_appengine\demos\guestbook\guestbook.py", line 47, in get
    decrypted = obj.decrypt(encrypted)
UnicodeEncodeError: 'ascii' codec can't encode character u'\u04b7' in position 7: ordinal not in range(128)

Ответы [ 2 ]

6 голосов
/ 13 ноября 2011

Общие рекомендации: добавьте шаг кодирования / декодирования base64 в ваш зашифрованный материал.

import base64

base64_encrypted_message = base64.b64encode(encrypted_message)
// send your message via POST as GET can be seen on system logs

encrypted_message = base64.b64decode(base64_encrypted_message)
// decrypt your message

Для другой ошибки попробуйте прочитать кодировку unicode & utf-8 персонажи ascii.Этот шаг необходим перед передачей его в функцию дешифрования.

1 голос
/ 13 ноября 2011

Все, что можно вывести из доступной информации, это то, что что-то ожидает строку байта, но вы передали ему объект unicode, содержащий символ Unicode U + 04B7 КИРИЛЛИЧЕСКОЕ МАЛЕНЬКОЕ ПИСЬМО ЧЕ С ДЕСКЕНДЕРОМ ... это, конечно, нет кодируется в ASCII (кодировка по умолчанию), отсюда и сообщение об ошибке.

Лучший ответ на данный момент: не делай этого.

Обновление 1: Вы еще не задали вопрос. Тем не менее:

Так что "что-то" - это метод decrypt какого-то крипто-гаджета. Это, безусловно, нуждается в str объекте. Что print repr(encrypted) говорит вам? Если это выглядит как случайный мусор (как должно быть зашифровано), то каким-то образом он был преобразован из объекта str в объект unicode. Вы должны вернуться назад, чтобы увидеть, как это происходит. Если encrypted выглядит как значимый текст, то ваш процесс шифрования нарушен.

Шаг 1. Начните с некоторого известного открытого текста, зашифруйте его и снова расшифруйте с помощью простого сценария вне аппарата GAE. Используйте print repr () на каждом этапе, чтобы иметь разумные ожидания для следующего шага.

Шаг 2: Повторите шаг 1, используя GAE, проверяя тип и содержимое каждого фрагмента данных.

Обновление 2 Похоже, у вас есть urlencode на странице A, но нет соответствующего urldecode на странице B; это (часть) проблема?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...