【问题标题】:Python unicode string and bytesPython unicode 字符串和字节
【发布时间】:2015-05-14 13:15:32
【问题描述】:

我正在使用 Crypto 框架 ...

from Crypto.PublicKey import RSA    
new_key=RSA.generate(1024,e=65537)    
plain_text_original="xyz"    
cipher_text=new_key.encrypt(plain_text_original.encode("utf-8"),123455)[0]    
print(cipher_text)     
print(cipher_text.decode("utf-8"))    

密文如下:

b"\x8cwO\xf5\xc9\xd3\xa4c|8\xcb\xfc\xef\xbd\xca\xb1&\x15aj\xec\xff\xd9\xeL"
try decode("utf-8")

它显示异常 UnicodeDecodeError

这是为什么?

【问题讨论】:

  • 你用的是什么版本的python? 2.x 和 3.x 处理字符串的方式截然不同。好吧,我猜你正在使用 3.x,因为 bute 类型,抱歉。
  • 为什么你认为密文是有效的 UTF8 或完全有效的文本?不是。

标签: python string unicode cryptography


【解决方案1】:

尽管有名称,但密文并不包含可打印的文本。所有现代密码 - 与其他密码原语一样 - 对位进行输入输出。

这意味着要使用文本进行输入,您需要执行,例如 UTF-8、ASCII、ISO-Latin 等。输出也是以位为单位的,因此如果您需要文本,则需要二进制转文本。常见的编码器是十六进制(更易于人类使用)和 base64(更高效)编码。

一种好的加密方法可以提供与随机无法区分的输出。由于并非所有字节都可以解码为可读文本,因此不可能直接对密码的输出执行字符解码。

当然,您可能会得到“幸运”,而不会得到解码错误或异常。在最坏的情况下,您可能会丢失数据,因为许多解码器会默默地跳过或替换无法解码的字节。

【讨论】:

    猜你喜欢
    • 2012-04-21
    • 2021-03-30
    • 2012-04-08
    • 1970-01-01
    • 1970-01-01
    • 2020-02-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多