在App Engine上使用PyCrypto的Python UnicodeEncodeError

Cha*_*had 2 python google-app-engine

我正在尝试将加密的查询字符串传递给另一个URL.

以下代码给出了这个错误:

UnicodeEncodeError:'ascii'编解码器无法对位置7中的字符u'\ u04b7'进行编码:序数不在范围内(128)

加密模块是PyCrypto

在App Engine上运行Python 2.5.2

PAGE 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}))
Run Code Online (Sandbox Code Playgroud)

第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))
Run Code Online (Sandbox Code Playgroud)

追溯

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)
Run Code Online (Sandbox Code Playgroud)

Alv*_* K. 6

一般准则:在加密的东西中添加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
Run Code Online (Sandbox Code Playgroud)

对于其他错误,请尝试阅读非ascii字符的unicode和utf-8编码.在将其传递给de/encrypt函数之前,您需要执行此步骤.