我正在尝试实现以下部分中的功能:
Per-commitment Secret Requirements
。
generate_from_seed(seed, I):
P = seed
for B in 47 down to 0:
if B set in I:
flip(B) in P
P = SHA256(P)
return P
其中,“翻转(B)”交替值P中的第B个最低有效位。
根据这个定义,如果我们
seed=0x0101010101010101010101010101010101010101010101010101010101010101
和
I=1
,我希望结果是
>>> from hashlib import sha256
>>> from binascii import hexlify
>>> hexlify(sha256(int(("00000001"*31)+"00000000",2).to_bytes(length=32,byteorder="big")).digest())
b'79356295f56e69998b9140cb77c63d3d80c93874259793a38d1dbd8678809ca9'
因为
flip
函数执行一次,将第0个LSB(最右边的位)设置为0。
相反,结果是(
test vectors
):
>>> hexlify(sha256(int("00000000"+("00000001"*31),2).to_bytes(length=32,byteorder="big")).digest())
b'915c75942a26bb3a433a8ce2cb0427c29ec6c1775cfc78328b57f6ba7bfeaa9c'
看着
one implementation
,很明显,人们正在通过以下方式实现这一点:
output[lp / 8] ^= (1 << (lp % 8));
这在我看来是错误的,因为它改变了字节的LSB,如果
lp
是小的,会更重要,因此根据我的解释是“最重要的”。但在字节内部,它正在发生一点变化,如果我们在大端模式下工作,它可能会以相反的方向索引。这不符合规范,因为它只讨论位。
虽然我可以在这个例子中使用小端点,它可以修复这个特定的测试,但它对其他测试向量不起作用,所以我认为这不是一个正确的修复,而且这没有意义,因为规范没有提到使用小端点。
有人请帮我理解“最低有效位”的定义,这样这些测试向量才有意义。在我看来,这要求我考虑字节的存在,这与我对LSB的理解不同。