为什么我必须在解码为 ascii 之前进行 hexlify?
Why do I have to hexlify before decoding into ascii?
所以我一直在尝试使用 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)
感谢您的帮助。
signature
是一个字节序列:每个元素都是一个介于 0 和 255 之间的整数,如果你试图直接用 ascii 解码它,大于 127 的值将抛出异常。
binascii.hexlify
return 来自其输入的新字节序列:对于来自输入的每个字节,输出中有两个字节 returned,它们是 ascii 字符的代码对应于输入字节的十六进制表示。因此,输出的每个字节都代表 '0'
和 '9'
之间或 'a'
和 'f'
之间的一个 ascii 字符。例如输入字节 128
产生两个字符 "80"
所以两个字节 56
和 48
(它们是字符 '8'
和 '0'
).
因此binascii.hexlify
生成二进制输入的ascii 形式的十六进制表示。在 binascii.hexlify
之后应用 decode('ascii')
不会更改内容但会生成 str
类型的对象。
在 python 3.5 及更高版本中,您可以简单地使用 bytes
对象的 hex
方法来获取包含其十六进制表示的 str
对象:
signature.hex()
所以我一直在尝试使用 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)
感谢您的帮助。
signature
是一个字节序列:每个元素都是一个介于 0 和 255 之间的整数,如果你试图直接用 ascii 解码它,大于 127 的值将抛出异常。
binascii.hexlify
return 来自其输入的新字节序列:对于来自输入的每个字节,输出中有两个字节 returned,它们是 ascii 字符的代码对应于输入字节的十六进制表示。因此,输出的每个字节都代表 '0'
和 '9'
之间或 'a'
和 'f'
之间的一个 ascii 字符。例如输入字节 128
产生两个字符 "80"
所以两个字节 56
和 48
(它们是字符 '8'
和 '0'
).
因此binascii.hexlify
生成二进制输入的ascii 形式的十六进制表示。在 binascii.hexlify
之后应用 decode('ascii')
不会更改内容但会生成 str
类型的对象。
在 python 3.5 及更高版本中,您可以简单地使用 bytes
对象的 hex
方法来获取包含其十六进制表示的 str
对象:
signature.hex()