Алгоритм Виженера в объяснении C #

Я наткнулся на этот код:

Byte Vigenere Cipher, ошибка при расшифровке

Но, пытаясь следовать правилам, я задал новый вопрос об этом.

Используется следующий алгоритм, и я пытаюсь лучше понять его:

Byte[] result= new Byte[plaintext.Length];

key = key.Trim().ToUpper();

int keyIndex = 0;
int keylength = key.Length;

for (int i = 0; i < plaintext.Length; i++)
{
    keyIndex = keyIndex % keylength;
    int shift = (int)key[keyIndex] - 65;
    result[i] = (byte)(((int)plaintext[i] + shift) % 256);
    keyIndex++;
}

Правильно ли я думаю, что ключ нужно обрезать, как в Unicode? следовательно, вычитание 65 из капитала дает общий символ/символ?


person Flak714    schedule 25.11.2012    source источник
comment
Вы можете написать (int)key[keyIndex] - 'A'.   -  person usr    schedule 25.11.2012
comment
ключ нужно обрезать, чтобы избавиться от пробелов в начале и в конце. вам не нужно использовать vigenere только с буквами, вы можете использовать любой символ.   -  person elyashiv    schedule 25.11.2012


Ответы (1)


Значение ASCII для заглавной буквы A равно 65. Все символы в key преобразуются в верхний регистр, это просто возвращает алфавитный индекс каждой буквы в key.

Таким образом, каждая буква в key преобразуется в число, и каждая буква в исходной строке «сдвигается вверх по алфавиту» на указанное количество позиций.

Если бы ваш ключ был BAD, это превратилось бы в числа 1, 0 и 3, а затем применялось бы к «hello world» следующим образом:

Hello world
10310310310 <-- added to each character
Ieomo#xoumd

Вы можете продемонстрировать это, добавив этот код ниже вашего:

StringBuilder demonstration = new StringBuilder();
foreach (byte b in result)
{
    demonstration.Append((char)b);
}
Console.WriteLine(demonstration.ToString());
person C.Evenhuis    schedule 25.11.2012
comment
Глядя на это дальше, я не совсем смущен тем, почему он модулируется 256, а не 127, поскольку С#, похоже, не использует расширенный ASCII? - person Flak714; 06.12.2012
comment
Данные ASCII по-прежнему занимают 8 бит, даже если используются только 7 из них, поэтому 256 безопасны, однако вы правы, что эта ситуация переполнения не учитывается. Кстати, C# использует Unicode для strings и chars; переменная result представляет собой массив байтов (без кодирования) по 8 бит каждый. - person C.Evenhuis; 06.12.2012