像这样的消息的编码方法是什么 b'\xf1p&r\

what is the encoding method for message like this b'\xf1p&r\

我正在测试 sslkeylog python 包以精确 TLS 主密钥,如下所示。我成功获得了 master_key,但是输出很难理解。以下b''输出的编码是什么?

>>> sslkeylog.get_master_key(ssocket)
b'\xf1p&r\xc9C\xc1\xf4\xf8\x95A_\xbc\x89D\xa3\x1f\xc1sk\x1e:~\x9d\x99N \xe5\xa3\x91\x89\x8c%\xe9\xde\x92\x85\xdcD\x95\xaf\xc7\x08;\xaa=\x1a\x85'

我希望密钥是这样的:

b952802eadeb7c1ac95910cfe094b24bc194a64fd20cbdbc48bc9801155fa20e

通过了解编码,我希望能够得到解码版本。

chardet,Universal Encoding Detector,告诉它的编码方案是 None

import chardet
secret = b'\xf1p&r\xc9C\xc1\xf4\xf8\x95A_\xbc\x89D\xa3\x1f\xc1sk\x1e:~\x9d\x99N \xe5\xa3\x91\x89\x8c%\xe9\xde\x92\x85\xdcD\x95\xaf\xc7\x08;\xaa=\x1a\x85'
chardet.detect(b)

output: {'encoding': None, 'confidence': 0.0, 'language': None}

如果我是你,我会怀疑这可能是由其他原因引起的。您可以尝试恢复到其他 sslkeylog 版本或尝试另一个 OS 环境设置。

您看到的不是编码——而是缺少编码,在 Python 语法中表示为字节串。因此,您看到的是原始字节,使用 Python 的本机文字语法序列化(使用 \xDD 用一对十六进制数字表示不可打印的字节)。

>>> key = b'\xf1p&r\xc9C\xc1\xf4\xf8\x95A_\xbc\x89D\xa3\x1f\xc1sk\x1e:~\x9d\x99N \xe5\xa3\x91\x89\x8c%\xe9\xde\x92\x85\xdcD\x95\xaf\xc7\x08;\xaa=\x1a\x85'
>>> print(binascii.b2a_hex(key).decode('ascii'))
f1702672c943c1f4f895415fbc8944a31fc1736b1e3a7e9d994e20e5a391898c25e9de9285dc4495afc7083baa3d1a85

如您所料:SSL 密钥是故意 high-entropy 数据;他们应该看起来是随机的。 Human-printable 版本被修改为以对读者有意义的方式进行编码,但您不能指望那是 RAM 中实际使用的内容。