我目前正在尝试从头开始实现sha256。
我正在实现 ch() 函数,其定义是 ch(x,y,z) = (x&y) ^ (~x&z)
( &
:指示和门,^
:指示异或门,~
:为否定)
我是这样实现的:
function ch(x,y,z){
(x&y) ^ (~x&z)
}
但是在我实现它之后,当我看到其他一些实现 ashttp://point-at-infinity.org/jssha256/时,实现是这样的(下图)
function SHA256_Ch(x, y, z) {
return z ^ (x & (y ^ z));
}
这是什么转换?
我可以从维基百科获得相同的结果吗?
你能告诉我路径吗?
---------------------------------------------------------
谢谢你的安斯威!
ch() 代表选择:X 选择 y 或 z。当 x 为 0 时,选择 z, 当 x 为 1 时,选择 y
这对我来说是一个关键的句子。我想知道设计器如何找到第二形式ch函数。
但我想,如果我得到你的建议,那是显而易见的。
当X为零时,Y为0,Z为左,因为X和Z与异或门连接,X和Y与和门相连,当X为一时,Y为Y,Z为无,因为有两个Z与异或门相连;
我应该从构建SHA256算法的人的角度开始猜测。
感谢教学!!
寇二
如果你写出 x、y、z 和 2 个表达式的真值表,你会发现它们是相同的。
在这两种情况下(为了简洁起见,我省略了中间结果):
x y z (x&y)^(~x&z) z^(x&(y^z))
0 0 0 0 0
0 0 1 1 1
0 1 0 0 0
0 1 1 1 1
1 0 0 0 0
1 0 1 0 0
1 1 0 1 1
1 1 1 1 1
ch()
代表选择:x
选择y
或z
。当x
被0
时,选择z
,当x
被1
时,选择y
第二种形式使用较少的 1 个按位运算;但我猜任何速度改进都是特定于实现的。