javascript 中的 sha256 实现

sha256 implementation in javascript

我目前正在尝试从头开始实施 sha256。

我正在实现 ch() 函数,其定义是 ch(x,y,z) = (x&y) ^ (~x&z)

(&表示与门,^表示异或门,~表示取反)

我是这样实现的:

function ch(x,y,z){
 (x&y) ^ (~x&z)
}

但是在我实现之后,当我看到其他一些实现如http://point-at-infinity.org/jssha256/时,实现是这样的(下)

function SHA256_Ch(x, y, z) {
  return z ^ (x & (y ^ z));
}

这是什么转换?

我可以从维基百科获得相同的结果吗?

你能告诉我路径吗?

-------------------------------------------- ------------

谢谢您的回答!

ch() stands for choose: x chooses y or z. When x is 0, z is chosen, and when x is 1, y is chosen

这句话对我来说很关键。 我想知道设计器如何找到第二种形式的 ch 函数。

但我想,如果当时我得到了你的建议,那是显而易见的。

如果sha256的设计者想像这样使用ch函数,那么sense.whenx为0,y为0,z为左,因为x和z是接异或门的,x and y connected with and gate.when x is one, y is y and z is nothing, 因为有两个z与异或门相连;

我应该从构建SHA256算法的人的角度开始猜测。

多谢指教!!

口技

如果您写出 x、y、z 和 2 个表达式的真值 table,您会发现它们 相同

在这两种情况下(为简洁起见,我省略了中间结果):

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个位运算;但我猜想任何速度的改进都是特定于实现的。