两个 SHA-256 哈希的 XOR

XOR of two SHA-256 Hash

我正在寻找转换从 SHA-256 位哈希生成的两个哈希值。

hash1="8bb0cf6eb9b17d0f7d22b456f121257dc1254e1f01665370476383ea776df414" //SHA-256 bit hash of 1234567
hash2="fe68a21fc76bba7b3a3d8e454eca8cd258de68fd08dddf035f23ddbdce6fc049" //SHA-256 bit hash of 7654321

可以xorhash=hash1^hash2吗? xorhash=75d86d717edac774471f3a13bfeba9af99fb26e209bb8c7318405e57b902345d 是输出。 您的帮助将不胜感激。谢谢

根据您的需要,您有 2 个选择:

a) 将所有内容都保留为字符串

在这种情况下,您需要一个 "for each character" 循环,将源字符从 char 转换为整数,进行异或运算,然后将结果转换回 char .例如:

for(int i = 0; i < 256/4; i++) {
    d1 = hash1[i];
    if( (d1 >= '0') && (d1 <= '9') ) {
        d1 = d1 - '0';
    } else if( ( (d1 >= 'A') && (d1 <= 'F') ) || ( (d1 >= 'a') && (d1 <= 'f') ) ) {
        d1 = d1 - 'A' + 10;
    } else {
        /* Syntax error */
    }
    d2 = hash2[i];
    if( (d2 >= '0') && (d2 <= '9') ) {
        d2 = d2 - '0';
    } else if( ( (d2 >= 'A') && (d2 <= 'F') ) || ( (d2 >= 'a') && (d2 <= 'f') ) ) {
        d2 = d2 - 'A' + 10;
    } else {
        /* Syntax error */
    }
    dr = d1 ^ d2;
    if(dr < 10) {
        dr = dr + '0';
    } else {
        dr = dr - 10 + 'A';
    }
    result[i] = dr;
}

b) 使用整数

如您所见,字符串缓慢而混乱,而且它们还浪费 RAM(并给缓存等带来更多压力)。

如果您改用整数,则 C 不支持 256 位整数,因此您需要将其分解为 C 支持的任何整数。例如:

struct myHash {
    uint32_t digit[256/32];
}

struct myHash hash1 = { 0x8bb0cf6e, 0xb9b17d0f, 0x7d22b456, 0xf121257d, 0xc1254e1f, 0x01665370, 0x476383ea, 0x776df414 };

在这种情况下你可以这样做:

for(i = 0; i < 256/32; i++) {
    result[i] = hash1[i] ^ hash2[i];
}

请注意,这在循环内做的工作要少得多,并且循环的迭代次数要少得多(8 次迭代一次执行 32 位,而不是 64 次迭代一次执行 4 位)。

事实上;编译器可能会将其转换为 "loopless" 代码,如下所示:

result[0] = hash1[0] ^ hash2[0];
result[1] = hash1[1] ^ hash2[1];
result[2] = hash1[2] ^ hash2[2];
result[3] = hash1[3] ^ hash2[3];
result[4] = hash1[4] ^ hash2[4];
result[5] = hash1[5] ^ hash2[5];
result[6] = hash1[6] ^ hash2[6];
result[7] = hash1[7] ^ hash2[7];

..并且(对于某些计算机)它可能会将其转换为 SIMD(例如,如果计算机支持 AVX2 的 256 位操作,那么即使 C 不支持 256 位整数,这也可能变成 3 条指令)。 =16=]