C#中的自动密钥vigenere解密

时间:2019-03-13 20:34:50

标签: c# algorithm encryption vigenere autokey

这是我用来解密自动密钥vigenere密码算法的代码

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

     

wearediscoveredsavlmleoopet

正确的输出应该是:

  

欺骗性穿戴发现被发现

     

已磨损自己发现自己

输出的第一行指的是自动生成的密钥

第二行指的是解密后的文本。

1 个答案:

答案 0 :(得分: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,因为在修正#2之后,我们实际需要的key更长。

固定代码:

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);

输出:

  

欺骗性穿戴发现被发现

     

已磨损自己发现自己