diff --git a/Armv8.2-SM3和SM4.md b/Armv8.2-SM3和SM4.md index cc1e521..17e2e5d 100644 --- a/Armv8.2-SM3和SM4.md +++ b/Armv8.2-SM3和SM4.md @@ -111,6 +111,28 @@ WORD $0x0884c0ce // SM4E V0.S4, V8.S4 [代码](https://gist.github.com/emmansun/a3feef970cdf3ffe5db623f324550950) ## SM3 with SM3PARTW1 / SM3PARTW2 / SM3SS1 / SM3TT1A / SM3TT2A / SM3TT2A / SM3TT2B +``` + P1(X)= X XOR (X <<< 15) XOR (X <<< 23) + + P1(X1 XOR X2) +=(X1 XOR X2) XOR ((X1 XOR X2) <<< 15) XOR ((X1 XOR X2) <<< 23) +=X1 XOR X2 XOR (X1 <<< 15) XOR (X2 <<< 15) XOR (X1 <<< 23) XOR (X2 <<< 23) +=X1 XOR (X1 <<< 15) XOR (X1 <<< 23) XOR X2 XOR (X2 <<< 15) XOR (X2 <<< 23) +=P1(X1) XOR P1(X2) + +这里, 异或XOR运算满足: +交换律 +结合律 +并且假定(X1 XOR X2) <<< 15 = (X1 <<< 15) XOR (X2 <<< 15), 也就是说循环左移ROL对异或XOR运算满足分配律,这一点是不显然的。 + +SM3PARTW1中最后一个字: +Vd[3] = P1(C XOR (R1 <<< 15)), 这里 C 是另外两个字的异或结果, R1 是 X(4i+16)的一部分:X(4i+16) = R1 XOR R2 + +SM3PARTW2中的tmp.value[0]就是R2 + P1(C XOR (R1 <<< 15)) XOR P1(R2 <<< 15) = P1(C XOR (R1 <<< 15) XOR (R2 <<< 15)) = P1(C XOR ((R1 XOR R2) <<< 15)) +``` +所以,关键就是**循环位移对异或运算满足分配律成立**。 + [模拟代码](https://gist.github.com/emmansun/c05b5e2262997ae546950f806fcd0146) ## Reference