【问题标题】:M2Crypto RSA Unicode Strings Encoded Differently Than Byte StringsM2Crypto RSA Unicode 字符串的编码方式与字节字符串不同
【发布时间】:2012-09-04 18:33:41
【问题描述】:

我正在使用带有 PKCS1 填充的 Python M2Crypto 的 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')

【问题讨论】:

标签: python encryption unicode m2crypto


【解决方案1】:

M2Crypto 模块专门处理不透明字节,即 0 到 255 之间的值,表示为 python str 类型。

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

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

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

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

【讨论】:

    猜你喜欢
    • 2012-04-21
    • 2018-05-27
    • 1970-01-01
    • 2021-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-01
    相关资源
    最近更新 更多