如何用 Python 散列 SHA256 字节 00?

How to hash SHA256 byte 00 with Python?

我正在尝试使用 python 对字节 b"00" 进行 SHA256 编码,但不明白我必须编码什么。

import binascii
import hashlib

byte_ = binascii.unhexlify(b"00")
byte_ = b"00".decode("ascii")

hashed_byte = hashlib.sha256(byte_)
print((hashed_byte.hexdigest()))

我做错了什么?为什么这适用于字符串而不是字节?

它是一个空字节。

00 是空字节。

"在所有现代字符集中,空字符的代码点值为零。在大多数编码中,这被转换为具有零值的单个代码单元。例如,在 UTF-8 中它是一个单个零字节。但是,在修改后的 UTF-8 中,空字符被编码为两个字节:0xC0、0x80。这允许值为零的字节(现在不用于任何字符)用作字符串终止符."

我相信 \x00 可以找到 00

如果您使用 b'\x00',则您定义了一个二进制字符串,如 所示。当您直接编码一个字节时,编译器或解释器已经执行了转换。所以之后不必执行任何转换。

请注意,对于 Python 3,您还可以使用 bytes(1),它指定一个大小为 1 的零填充字节数组。如果您认为这样可读性差,您可以使用 bytes.fromhex('00').在这两种情况下,转换 在运行时执行,因此它的开销非常小。

Python 的 hashlib 已经接受二进制字符串。

import hashlib

m = hashlib.sha256()

m.update(b"\x00")  #or use m.update(bytes.fromhex('00'))
hashed = m.hexdigest()

print(hashed)

产出

6e340b9cffb37a989ca544e6bb780a2c78901d3fb33738768511a30617afa01d

NIST SHA-256 byte-oriented test vectors,但是没有b"\x00"的测试向量。我已经测试了其他字节值,例如 0xd3 outputs

28969cdfa74a12c82f3bad960b0b000aca2ac329deea5c2328ebc6f2ba9802c1正确。


如果您想查看内部结构,请参阅 https://sha256algorithm.com/