使用base64编码,为什么我得到错误的答案?

时间:2018-02-26 06:56:54

标签: python base64 encode

我正在尝试对websocket进行身份验证。 在文档的示例中,它表示我的客户端是否为:

nonce = 0xf08c98caf1fd82e8cea9825dbff04fd0 

然后我应该使用base64 编码来获取:

target = "8IyYyvH9gujOqYJdv/BP0A==".

我不确定我做错了什么,但我得到以下内容:

client_nonce = 0xf08c98caf1fd82e8cea9825dbff04fd0
str_client_nonce = str(client_nonce) 
encoded = b64encode(bytes(str_client_nonce, 'utf-8'))
print(encoded)

>> b'MzE5NzQ0NzM5NTUzODE1NjMyMTAxNjk0MjM1NzExODU0NjI4ODE2'

2 个答案:

答案 0 :(得分:4)

对于初学者来说,0xf08c98caf1fd82e8cea9825dbff04fd0是Python中的一个数字(例如0x10是另一种写作方式16)。但是一个数字不是你实际拥有的数字,你有一个字节列表的十六进制表示,也称为十六进制字符串。

所以要做的事情:

  • 摆脱0x,使用字符串。
  • 将该字符串解码为字节。
  • 将这些字节编码为base64。

代码:

import base64

nonce_hex = 'f08c98caf1fd82e8cea9825dbff04fd0'
nonce = bytearray.fromhex(nonce_hex)
base64_nonce = base64.encodebytes(nonce)

# -> b'8IyYyvH9gujOqYJdv/BP0A==\n'

实际随机数始终是字节。正在使用不同的方法来表示/存储/传输这些字节。使用十六进制字符串是一种常见方式使用base64是另一个。 hex字符串和base64都有相同的用途:以字符串形式存储任意字节以便于处理。 Base64恰好需要比hex字符串更少的空间,这就是为什么它通常是首选的原因。上面的代码只是将字节的一个字符串表示转换为另一个字符串。

答案 1 :(得分:0)

您必须直接将nonce转换为bytes。不是string表示

通过https://stackoverflow.com/a/45586011/1562285

b = int2bytes(nonce)
b'\xf0\x8c\x98\xca\xf1\xfd\x82\xe8\xce\xa9\x82]\xbf\xf0O\xd0'
base64.b64encode(b)
b'8IyYyvH9gujOqYJdv/BP0A=='