我正在尝试在C中使用SSE2指令实现SHA1。
初始化似乎有效,但是如果我尝试

round1(testhashe, testhasha, testhashb, testhashc, testhashd, loadConstant(b[z]));


作为算法的第一轮,我遇到了错误。之前的常量和值被检查为正确,但最后一个值将是错误的。我的宏是

#define rotthirty(val) (_mm_or_si128(_mm_slli_epi32(val,30),_mm_srli_epi32(val,2)))

#define f1(b,c,d) (_mm_xor_si128(d,_mm_and_si128(b, _mm_xor_si128(c, d))))

// Round functions
#define round1(A,B,C,D,E,w) \
temp = rotthirty(A);\
temp = _mm_add_epi32(temp,f1(B, C, D));\
temp = _mm_add_epi32(temp,k1);\
temp = _mm_add_epi32(temp,w);\
E = _mm_add_epi32(temp, E);\
B = rotthirty(B);\


这些在我毫无问题地更改为SSE2功能之前就已经起作用了,我只是将运算符更改为功能。我究竟做错了什么?

一次使用内在函数和4次sha计算从此函数输出

Vector: 67452301 67452301 67452301 67452301
Vector: 7bf36ae2 7bf36ae2 7bf36ae2 7bf36ae2
Vector: 98badcfe 98badcfe 98badcfe 98badcfe
Vector: 10325476 10325476 10325476 10325476
Vector: 734fe2b5 724fe2b5 8b4ee2b5 8a4ee2b5


Round1之后执行SSE2免费工作代码可以看出,除了最后一行之外,其中包含正确的值

67452301
7bf36ae2
98badcfe
10325476
122fa21

最佳答案

代替腐烂30,它必须是A的腐烂5。
但是,如果有人遇到这个问题,我想提出@jww的答案,因为我听过几次似乎是一种误解。
如果仅使用SSE2内部函数,则不能使用这些SHA函数,因为它们不属于此函数。您不必通过将值加载到向量中来交换字节模式,这可以保持如上所示

关于c - SSE2 SHA1问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47600978/

10-11 07:08