我正在尝试在以下部分中实现该功能: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
Run Code Online (Sandbox Code Playgroud)
其中“flip(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'
Run Code Online (Sandbox Code Playgroud)
因为flip函数执行一次,将第 0 个 LSB(最右边的位)设置为 0。
相反,结果是(测试向量):
>>> hexlify(sha256(int("00000000"+("00000001"*31),2).to_bytes(length=32,byteorder="big")).digest())
b'915c75942a26bb3a433a8ce2cb0427c29ec6c1775cfc78328b57f6ba7bfeaa9c'
Run Code Online (Sandbox Code Playgroud)
查看一个实现,很明显人们正在使用:
output[lp / 8] ^= (1 << (lp % 8));
Run Code Online (Sandbox Code Playgroud)
这在我看来是错误的,因为它正在改变字节的 LSB,如果 …
pseudocode endianness bitwise-operators bitcoin lightning-network