расшифровка автоключа виженере в c#

#c# #algorithm #encryption #vigenere #autokey

#c# #алгоритм #шифрование #виженере #автоключ

Вопрос:

Это мой код для расшифровки алгоритма шифрования автоключа виженере

 string cipherText = "zicvtwqngkzeiigasxstslvvwla";
string key = "deceptive";

key = key.ToLower();
cipherText = cipherText.ToLower();

int klength = key.Length;
int kslength = (int)(cipherText.Length - key.Length);

string pl = string.Empty;
char[] newpl = new char[cipherText.Length];
int a = Convert.ToInt32('a');
for (int i = 0; i < cipherText.Length - kslength; i  )
{
    int c = Convert.ToInt32(cipherText[i]) - a;
    if (c< 0) c  = 26;
    int k = Convert.ToInt32(key[i]) - a;
    if (k < 0) k  = 26;
    int p = (c - k);
    p %= 26;
    if (p < 0) p  = 26;
    p  = a;
    char temp = Convert.ToChar(p);
    newpl[i] = temp;

}

char[] NewKey = new char[cipherText.Length];
char[] ciphertext = new char[cipherText.Length];
char[] chars = new char[cipherText.Length];
int count =0;
for (int i = 0; i < key.Length; i  )
{
    NewKey[i] = key[i];
    count  ;
}
int j = 0;
for (int i = count; i < cipherText.Length; i  )
{
    NewKey[i] = newpl[j];
    j  ;
}

Console.WriteLine(NewKey);

for (int i = klength; i < cipherText.Length; i  )
{
    int c = Convert.ToInt32(cipherText[i]) - a;
    int k = Convert.ToInt32(NewKey[i]) - a;
    int p = (c - k);
    p %= 26;
    if (p < 0) p  = 26;
    p  = a;

    char temp = Convert.ToChar(p);
    newpl[i] = temp;
}
pl = new string(newpl);
Console.WriteLine(pl);
  

это дает мне вывод:

deceptivewearedisc

мы обнаружили, что javlmleoopet

в то время как правильный вывод должен быть:

обнаруженный обманный sav

мы обнаружили, что спасли себя

первая строка выходных данных относится к автоматически сгенерированному ключу

вторая строка ссылается на расшифрованный текст.

Ответ №1:

В вашем коде немного ошибок:

1) Посмотрите на эту строку:

 for (int i = 0; i < cipherText.Length - kslength; i  )
  

kslength = cipherText.Length - key.Length итак, ваш код

 for (int i = 0; i < key.Length; i  )
  

Длина ключа меньше длины текста, поэтому вы заканчиваете расшифровку слишком рано.

2)

 char temp = Convert.ToChar(p);
newpl[i] = temp;
  

Вы расшифровали символ, но при расшифровке автоключа вам следует добавить расшифрованный символ к вашему ключу.

3)

 for (int i = 0; i < key.Length; i  )
  

Должно быть NewKey.Length вместо этого, потому что key это больше, чем нам действительно нужно после исправления # 2.

Исправлен код:

 string cipherText = "zicvtwqngkzeiigasxstslvvwla";
string key = "deceptive";

key = key.ToLower();
cipherText = cipherText.ToLower();

int klength = key.Length;

string pl = string.Empty;
char[] newpl = new char[cipherText.Length];
int a = Convert.ToInt32('a');
for (int i = 0; i < cipherText.Length; i  )
{
    int c = Convert.ToInt32(cipherText[i]) - a;
    if (c < 0) c  = 26;
    int k = Convert.ToInt32(key[i]) - a;
    if (k < 0) k  = 26;
    int p = (c - k);
    p %= 26;
    if (p < 0) p  = 26;
    p  = a;
    char temp = Convert.ToChar(p);
    key  = temp;
    newpl[i] = temp;

}

char[] NewKey = new char[cipherText.Length];
int count = 0;
for (int i = 0; i < NewKey.Length; i  )
{
    NewKey[i] = key[i];
    count  ;
}
int j = 0;
for (int i = count; i < cipherText.Length; i  )
{
    NewKey[i] = newpl[j];
    j  ;
}

Console.WriteLine(NewKey);

for (int i = klength; i < cipherText.Length; i  )
{
    int c = Convert.ToInt32(cipherText[i]) - a;
    int k = Convert.ToInt32(NewKey[i]) - a;
    int p = (c - k);
    p %= 26;
    if (p < 0) p  = 26;
    p  = a;

    char temp = Convert.ToChar(p);
    newpl[i] = temp;
}
pl = new string(newpl);
Console.WriteLine(pl);
  

Вывод:

обнаруженный обманный sav

мы обнаружили, что спасли себя