GOST 34.12-2015。C#实现。L-操作错误

GOST 34.12-2015。C#实现。L-操作错误,c#,encryption,C#,Encryption,我试图实现新的GOST算法,但我遇到了一个L运算的问题。这是我的代码和一轮encription\decription结果的截图: static void Main() { string A = "You are welcome!"; Console.WriteLine(A); byte[] _A = Encoding.Default.GetBytes(A); Console.WriteLine("\nEntered stri

我试图实现新的GOST算法,但我遇到了一个L运算的问题。这是我的代码和一轮encription\decription结果的截图:

static void Main()
    {
        string A = "You are welcome!";
        Console.WriteLine(A);
        byte[] _A = Encoding.Default.GetBytes(A);
        Console.WriteLine("\nEntered string as bytes :");
        for (int i = 0; i < _A.Length; i++)
        {
            Console.Write(Convert.ToString(_A[i]) + " ");
        }
        byte[] _B = KuzR(_A);
        Console.WriteLine("\n\nEncripted string as bytes :");
        for (int i = 0; i < _B.Length; i++)
        {
            Console.Write(Convert.ToString(_B[i]) + " ");
        }
        byte[] _C = KuzRReverse(_B);
        Console.WriteLine("\n\nDecripted string as bytes :");
        for (int i = 0; i < _C.Length; i++)
        {
            Console.Write(Convert.ToString(_C[i]) + " ");
        }
        string B = Encoding.Default.GetString(_C);
        Console.WriteLine("\n\n" + B);
        Console.ReadLine();
    }

    static byte KuzMulInGF(byte a, byte b)
    {
        byte p = 0;
        byte counter;
        byte hi_bit_set;
        for (counter = 0; counter < 8 && a != 0 && b != 0; counter++)
        {
            if ((b & 1) != 0)
                p ^= a;
            hi_bit_set = (byte)(a & 0x80);
            a <<= 1;
            if (hi_bit_set != 0)
                a ^= 0xc3; /* x^8 + x^7 + x^6 + x + 1 */
            b >>= 1;
        }
        return p;
    }

    static byte[] LVec = new byte[]
    {1, 148, 32, 133, 16, 194, 192, 1,
251, 1, 192, 194, 16, 133, 32, 148};

    static byte[] KuzR(byte[] input)
    {
        byte a_15 = 0;
        byte[] state = new byte[16];
        for (int i = 15; i > 0; i--)
        {
            state[i - 1] = input[i];
            a_15 ^= KuzMulInGF(input[i], LVec[i]);
        }
        state[15] = a_15;
        return state;
    }

    static byte[] KuzL(byte[] input)
    {
        byte[] state = input;
        for (int i = 0; i < 16; i++)
        {
            state = KuzR(state);
        }
        return state;
    }

    static byte[] KuzRReverse(byte[] input)
    {
        byte a_0;
        a_0 = input[15];
        byte[] state = new byte[16];
        for (int i = 1; i < 16; i++)
        {
            state[i] = input[i - 1];
            a_0 ^= KuzMulInGF(input[i], LVec[i]);
        }
        state[0] = a_0;
        return state;
    }

    static byte[] KuzLReverse(byte[] input)
    {
        byte[] state = input;
        for (int i = 0; i < 16; i++)
        {
            state = KuzRReverse(state);
        }
        return state;
    }
static void Main()
{
string A=“不客气!”;
控制台写入线(A);
byte[]_A=Encoding.Default.GetBytes(A);
Console.WriteLine(“\n以字节形式输入的字符串:”);
对于(int i=0;i<_A.Length;i++)
{
Console.Write(Convert.ToString(_A[i])+“”);
}
字节[]_B=KuzR(_A);
Console.WriteLine(“\n\n以字节形式编写的字符串:”);
对于(int i=0;i<_B.Length;i++)
{
Console.Write(Convert.ToString(_B[i])+“”);
}
字节[]_C=KuzRReverse(_B);
Console.WriteLine(“\n\n以字节形式描述的字符串:”);
对于(int i=0;i<\u C.Length;i++)
{
Console.Write(Convert.ToString(_C[i])+“”);
}
string B=Encoding.Default.GetString(_C);
Console.WriteLine(“\n\n”+B);
Console.ReadLine();
}
静态字节KuzMulInGF(字节a,字节b)
{
字节p=0;
字节计数器;
字节hi_位_集;
用于(计数器=0;计数器<8&&a!=0&&b!=0;计数器++)
{
如果((b&1)!=0)
p^=a;
hi_位_集=(字节)(a&0x80);
a=1;
}
返回p;
}
静态字节[]LVec=新字节[]
{1, 148, 32, 133, 16, 194, 192, 1,
251, 1, 192, 194, 16, 133, 32, 148};
静态字节[]KuzR(字节[]输入)
{
字节a_15=0;
字节[]状态=新字节[16];
对于(int i=15;i>0;i--)
{
状态[i-1]=输入[i];
a_15^=KuzMulInGF(输入[i],LVec[i]);
}
状态[15]=a_15;
返回状态;
}
静态字节[]KuzL(字节[]输入)
{
字节[]状态=输入;
对于(int i=0;i<16;i++)
{
state=KuzR(state);
}
返回状态;
}
静态字节[]KuzRReverse(字节[]输入)
{
字节a_0;
a_0=输入[15];
字节[]状态=新字节[16];
对于(int i=1;i<16;i++)
{
状态[i]=输入[i-1];
a_0^=KuzMulInGF(输入[i],LVec[i]);
}
状态[0]=a_0;
返回状态;
}
静态字节[]KuzLReverse(字节[]输入)
{
字节[]状态=输入;
对于(int i=0;i<16;i++)
{
状态=库兹罗(状态);
}
返回状态;
}


我的错误在哪里?

我首先要删除字符串/字节[]转换。使用硬编码字节数组。如果可以先加密然后解密字节数组,则可以通过额外的转换对文本执行同样的操作。(我强烈建议不要使用
编码。不过默认值是
。)Jon,我使用文本只是为了得到一个字节[]作为加密。该代码来自不同的程序,该程序只进行L转换。它只是没有正确地定义原始字节[]massible,我不知道哪里是错误的。我不确定这里“massible”是什么意思,但正如我所说的,我鼓励您只关注加密部分。跳过字符串和字符串之间的转换。好的,我会尝试,我指的是数组,抱歉英语不好。我还强烈建议在问题中以文本形式显示输出,而不是显示屏幕截图。您可能希望使用
BitConverter.ToString(byte[])
作为一种比当前代码更简单的显示字节数组的方法。我首先要删除字符串/byte[]转换。使用硬编码字节数组。如果可以先加密然后解密字节数组,则可以通过额外的转换对文本执行同样的操作。(我强烈建议不要使用
编码。不过默认值是
。)Jon,我使用文本只是为了得到一个字节[]作为加密。该代码来自不同的程序,该程序只进行L转换。它只是没有正确地定义原始字节[]massible,我不知道哪里是错误的。我不确定这里“massible”是什么意思,但正如我所说的,我鼓励您只关注加密部分。跳过字符串和字符串之间的转换。好的,我会尝试,我指的是数组,抱歉英语不好。我还强烈建议在问题中以文本形式显示输出,而不是显示屏幕截图。您可能希望使用
BitConverter.ToString(byte[])
作为一种比当前代码更简单的显示字节数组的方法。