M2Crypto RSA Unicode字符串编码与字节字符串不同

时间:2012-09-04 18:33:42

标签: python encryption unicode m2crypto

我使用Python M2Crypto的带有PKCS1填充的RSA编码电子邮件以与外部网站的API一起使用。使用unicode时,编码的电子邮件没有返回API的结果,但是当我使用str(unicode_email)时,我收到了正确的信息。

我的印象是字符串的unicode和字节表示应该在这种情况下起作用。有谁知道为什么unicode会失败?

参考代码:

from M2Crypto import RSA
email = u'email@example.com'  #fails
email = str(email)  # succeeds 
rsa = RSA.load_pub_key('rsa_pubkey.pem')
result = rsa.public_encrypt(email, RSA.pkcs1_padding).encode('base64')

1 个答案:

答案 0 :(得分:1)

M2Crypto模块专门处理不透明字节,这些字节的值介于0和255之间,表示为python str类型。

Python 2.x str类型由这些字节组成,但unicode类型是完全不同的野兽。您可以使用.decode() method及其镜像方法.encode()轻松地在两者之间进行转换。

当您在str()对象上调用unicode时,它会通过应用默认编码进行转换,实质上它会调用email.encode(sys.getdefaultencoding())。这对你的全ASCII电子邮件地址来说很好,但是你必须遇到UnicodeEncodeError个例外。最好只坚持使用显式方法。

请注意,您可能必须设置您在发送的电子邮件的MIME标头上使用的编码。

我强烈建议您阅读Python Unicode HOWTO中的所有内容。