【问题标题】:Trouble with realization Byte[] operations实现 Byte[] 操作的问题
【发布时间】:2017-01-11 09:33:43
【问题描述】:

我对 byte[] 使用 XOR 操作

public static byte[] XOR(byte[] buffer1, byte[] buffer2)
{
    for (int i = 0; i < buffer1.Length; i++)
        buffer1[i] ^= buffer2[i];
    return buffer1;
}

并实现散列算法的移位方法。

public static byte[] RotHi(byte[] B, int count)
{
    for (int i = 0; i < count; i++)
    {
        byte[] a = ShHi(B);
        byte[] b = B;
        for (int j = (B.Length * 8) - 2; j >=0 ; j--)
        {
            b = ShLo(b);
        }
        B = XOR(a,b);
    }
    return B;
}
public static byte[] ShHi(byte[] B)
{
    return BitConverter.GetBytes(BitConverter.ToUInt64(B, 0) >> 1);
}
public static byte[] ShLo(byte[] B)
{
    return BitConverter.GetBytes(BitConverter.ToUInt64(B, 0) << 1);
}

当它单独工作时,结果是正确的

W0 = b194bac80a08f53b.
W1 = e12bdc1ae28257ec.
W2 = e9dee72c8f0c0fa6.
m1 = 8; n1 = 53.

T0 = RotHi(W0, m1); // 3bb194bac80a08f5
W0 = XOR(W0,W1);
W0 = XOR(W0,W2); // b96181fe6786ad71

但是下一个代码返回结果^

T1 = XOR(W1,(RotHi(W0, n1))); // ed242f26d7e9da27, but should be CDFB23D652B779DB

怎么了?

【问题讨论】:

  • 这与 C++ 有什么关系?你显然不是在用 C++ 编程,所以请不要添加无关的语言标签。
  • 至于您的问题,您是否尝试过在调试器中单步执行代码?您期望的值和您得到的值何时何地开始偏离?你确定期望值是正确的吗?你确定你的算法是正确的吗?
  • 你使用 n1 而不是 m1 并且只做第一个 xor 而不是第二个,所以答案会有所不同。在你抱怨它们给出两个不同的答案之前,请让这两个计算相等。
  • @Someprogrammerdude 不,我不知道。但结果 T0 和 W0 是对的。
  • @prof1990 它不等价,它是不同的变量和不同的操作。但只有第三个结果是错误的(参考标准)

标签: c# arrays algorithm boolean-logic


【解决方案1】:

问题出在字节序列中。注意 BigEndian 或 LittleEndian。

【讨论】:

    猜你喜欢
    • 2011-07-27
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 2016-03-29
    • 2015-12-03
    • 1970-01-01
    相关资源
    最近更新 更多