在C#中反转两个字节数组的galois乘法

时间:2018-03-28 06:59:42

标签: c#

我需要帮助找到C#中的galois乘法GF(2 ^ 128)的反转。以下代码用于我的AES-GCM功能。我通过网络找到了这段代码。

我试图在网上搜索galois分区,但我没有找到它的运气。

请原谅我在这个领域和我的英语方面的知识。

此函数派生值为2 ^ x。

public byte BIT(byte x)
{
    return (byte)(1 << x);
}

此函数将4个元素的字节数组转换为unsigned int。

public uint WPA_GET_BE32(byte[] a)
{
    return (uint)((a[0] << 24 )|( a[1] <<16 )|( a[2] << 8 )| a[3]);
}

此函数将unsigned int转换为4个元素的字节数组。

public void WPA_PUT_BE32(out byte[] a, uint val)
{
    a = new byte[4];
    a[0] = (byte)((val >> 24) & 0xff);
    a[1] = (byte)((val >> 16) & 0xff);
    a[2] = (byte)((val >> 8) & 0xff);
    a[3] = (byte)(val & 0xff);
}

public void shift_right_block(ref byte[] v)
{
    uint val;

    byte[] temp = new byte[4];

    temp = v.Skip(12).Take(4).ToArray();
    val = WPA_GET_BE32(temp);
    val >>= 1;
    if ((v[11] & 0x01) > 0) val |= 0x80000000;
    WPA_PUT_BE32(out temp, val);
    Array.Copy(temp, 0, v, 12, 4);

    temp = v.Skip(8).Take(4).ToArray();
    val = WPA_GET_BE32(temp);
    val >>= 1;
    if ((v[7] & 0x01) > 0) val |= 0x80000000;
    WPA_PUT_BE32(out temp, val);
    Array.Copy(temp, 0, v, 8, 4);

    temp = v.Skip(4).Take(4).ToArray();
    val = WPA_GET_BE32(temp);
    val >>= 1;
    if ((v[3] & 0x01) > 0) val |= 0x80000000;
    WPA_PUT_BE32(out temp, val);
    Array.Copy(temp, 0, v, 4, 4);

    temp = v.Skip(0).Take(4).ToArray();
    val = WPA_GET_BE32(temp);
    val >>= 1;
    WPA_PUT_BE32(out temp, val);
    Array.Copy(temp, 0, v, 0, 4);
}

此函数对两个字节数组执行异或功能。

public void c_xor_16(ref byte[] dest, byte[] src)
{
    int ndx = 0;
    for (ndx = 0; ndx < 16; ndx++) dest[ndx] ^= src[ndx];
}

这是主函数,字节数组z是GF乘法的输出。

public void c_gf_mult(byte[] x, byte[] y, ref byte[] z)
{
    int i, j;
    byte[] v = new byte[16];

    z = new byte[16];
    Array.Clear(z, 0, 16);
    Array.Copy(y, v, 16);

    for (i = 0; i < 16; i++)
    {
        for (j = 0; j < 8; j++)
        {
             if ((byte)(x[i] & BIT((byte)(7 - j))) > 0)
            {
                c_xor_16(ref z, v);
            }

            if ((byte)(v[15] & 0x01) > 0)
            {
                shift_right_block(ref v);
                v[0] ^= 0xe1;
            }
            else
            {
                shift_right_block(ref v);
            }
        }
    }
    return;
}

0 个答案:

没有答案