JavaScript 中的 sha256 实现



我目前正在尝试从头开始实现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选择yz。当x0时,选择z,当x1时,选择y

第二种形式使用较少的 1 个按位运算;但我猜任何速度改进都是特定于实现的。

最新更新