Реализация алгоритма шифрования "Кузнечик" - C#
Формулировка задачи:
Добрый день. Пытаюсь реализовать алгоритм шифрования "Кузнечик" на C#, однако у меня возникли трудности с его нелинейным преобразованием (преобразованием L). Зашифрованный текст не расшифровывается обратно.
Код функций шифрования и расшифрования приведен ниже:
Результат работы первого раунда шифрования и расшифрования кода:
Подскажите пожалуйста, где я допустил ошибку?
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;
}Решение задачи: «Реализация алгоритма шифрования "Кузнечик"»
textual
Листинг программы
for (int i = 1; i < 17; i++)