【问题标题】:Why do I have to hexlify before decoding into ascii?为什么我必须在解码成 ascii 之前进行 hexlify?
【发布时间】:2018-07-18 14:21:52
【问题描述】:

所以我一直在尝试使用 python(特别是 pycryptodome)更好地熟悉加密,并且在尝试将字节字符串解码为 ascii 时遇到了一个有趣的问题。请看下面的代码:

from Crypto.Signature import PKCS1_v1_5
from Crypto.Hash import SHA
from Crypto.PublicKey import RSA
message = b'Something secret'

random_gen = Crypto.Random.new().read
print("Type of random_gen: {}".format(type(random_gen)))
private_key = RSA.generate(1024, random_gen) # private key
public_key = private_key.publickey() # public key

signer = PKCS1_v1_5.new(private_key) # signer which uses private key
verifier = PKCS1_v1_5.new(public_key) # verifier which uses public key

h = SHA.new(message) # hash of message
print("Hash: {}".format(h.hexdigest()))

signature = signer.sign(h) # sign hashed version of message
print("Signature type = {}".format(type(signature)))
print("Signature: {}".format(binascii.hexlify(signature).decode('ascii')))

在代码的最后一行,为什么我必须先 hexlify() 类型为 <class 'bytes'> 的签名,然后才能将其解码为 ascii,以便我可以读取签名?如果我这样做,为什么会这样:

print("Signature: {}".format(signature.decode('ascii')))

我收到以下错误:

UnicodeDecodeError: 'ascii' codec can't decode byte 0x88 in position 2: ordinal not in range(128)

感谢您的帮助。

【问题讨论】:

  • 因为 ASCII 指的是 7 位 US-ASCII 代码页。它不能代表任何值大于0x7F的字节。
  • @PanagiotisKanavos - 是的,但我认为 hexlify-ing 只是返回字节字符串的十六进制表示并且不会更改字节字符串本身;因此,如果一个字节超出了 ascii 解码的范围,那么为什么要将其转换为十六进制呢?

标签: python decode digital-signature pycryptodome


【解决方案1】:

signature 是一个字节序列:每个元素都是一个介于 0 到 255 之间的整数,如果你试图直接在 ascii 中解码,大于 127 的值会抛出异常。

binascii.hexlify 从其输入中返回一个新的字节序列:对于输入中的每个字节,在输出中返回两个字节,它们是对应于输入字节的十六进制表示的 ascii 字符代码。因此,输出的每个字节代表'0''9' 之间或'a''f' 之间的一个ASCII 字符。例如输入字节128产生两个字符"80",所以两个字节5648(它们是字符'8''0'的ascii代码)。

所以binascii.hexlify 以二进制输入的 ascii 形式生成十六进制表示。在binascii.hexlify 之后应用decode('ascii') 不会改变内容,而是产生str 类型的对象。

在 python 3.5 及更高版本中,您可以简单地使用bytes 对象的hex 方法来获取包含其十六进制表示的str 对象:

signature.hex()

【讨论】:

  • 哦,很有趣。我没有意识到binascii.hexlify 返回一个新的字节序列,我将不得不仔细研究您描述的发生这种情况的方法。谢谢
猜你喜欢
  • 2013-09-21
  • 2016-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多