两个SHA-256哈希的XOR

时间:2019-12-26 06:53:11

标签: hash sha256 xor

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

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

是否可以有xorhash=hash1^hash2xorhash=75d86d717edac774471f3a13bfeba9af99fb26e209bb8c7318405e57b902345d是输出。 您的帮助将不胜感激。谢谢

1 个答案:

答案 0 :(得分:0)

根据您的需要,您有两种选择:

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

在这种情况下,您需要一个“针对每个字符”循环,该循环将源字符从char转换为整数,进行XOR,然后将结果转换回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位)。

实际上;编译器可能会将其转换为“无环”代码,如下所示:

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条指令)。