在App Engine上使用PyCrypto的Python UnicodeEncodeError

时间:2011-11-12 23:14:04

标签: python google-app-engine

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

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

  

UnicodeEncodeError:'ascii'编解码器无法对字符u'\ u04b7'进行编码   位置7:序数不在范围内(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}))

PAGE 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 (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 个答案:

答案 0 :(得分: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

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

答案 1 :(得分:1)

所有可以从可用信息中推断出的是,某些东西需要一个字节串,但你已经为它提供了一个unicode对象,其中包含Unicode字符U + 04B7 CYRILLIC SMALL LETTER CHE WITH DESCENDER ...这是当然不能用ASCII编码(默认编码),因此错误信息。

目前为止最好的答案:不要这样做。

更新1:您还没有问过问题。尽管如此:

所以“某些东西”是一些加密小工具的decrypt方法。这肯定需要一个str对象。 print repr(encrypted)告诉你什么?如果它看起来像随机垃圾(作为加密的东西应该),那么它已经以某种方式从str对象转换为unicode对象。您需要回溯以查看这是如何发生的。如果encrypted看起来像有意义的文本,那么您的加密过程就会中断。

步骤1:从一些已知的明文开始,对其进行加密,然后在GAE设备外部的简单脚本中再次对其进行解密。在每个阶段使用print repr(),以便您对下一步有合理的期望。

步骤2:使用GAE重复步骤1,检查每个数据的类型和内容。

更新2 您可以在页面A中找到urlencode,但在页面B中没有相应的urldecode;这是(部分)问题吗?