using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace Vigenere
{
public partial class Form1 : Form
{
private string[,] matrix = new string[26, 26];
private ASCIIEncoding ascii = new ASCIIEncoding();
//key
private string key;
//code
private string code;
//text
private string text;
public Form1()
{
InitializeComponent();
#region Generate Virginia Martix
for (int i = 0; i < 26; i++)
{
for (int j = 0; j < 26; j++)
{
int number = 65 + i + j;
if (number > 90)
{
number -= 26;
}
byte[] bt = new byte[] { (byte)number };
matrix[i, j] = ascii.GetString(bt);
}
}
#endregion
}
//加密
private void button1_Click(object sender, EventArgs e)
{
key = this.txtKey.Text.ToString().ToUpper();
code = "";
text = this.txtText.Text.ToString().ToUpper();
List<int> keyNum = new List<int>(); ;
for (int i = 0; i < key.Length; i++)
{
string str = key.Substring(i, 1);
keyNum.Add((int)ascii.GetBytes(str)[0] - 65);
}
int index = -1;
for (int i = 0; i < this.text.Length; i++)
{
if (this.text.Substring(i, 1).ToString() == " ")
{
code += " ";
continue;
}
index++;
code += matrix[keyNum[index % key.Length], (int)ascii.GetBytes(this.text.Substring(i, 1))[0] - 65];
}
this.txtCode.Text = code.ToString();
}
//解密
private void button2_Click(object sender, EventArgs e)
{
key = this.txtKey.Text.ToString().ToUpper();
code = this.txtCode.Text.ToString().ToUpper();
text = "";
List<int> keyNum = new List<int>(); ;
for (int i = 0; i < key.Length; i++)
{
string str = key.Substring(i, 1);
keyNum.Add((int)ascii.GetBytes(str)[0] - 65);
}
int index = -1;
for (int i = 0; i < this.code.Length; i++)
{
if (this.code.Substring(i, 1).ToString() == " ")
{
text += " ";
continue;
}
index++;
for (int j = 0; j < 26; j++)
{
if (this.code.Substring(i, 1).ToString() == matrix[keyNum[index % key.Length], j])
{
byte[] bt = new byte[] { (byte)(j + 65) };
text += ascii.GetString(bt);
}
}
}
this.txtText.Text = text.ToString();
}
}
}
对于维吉尼亚方阵及运用维吉尼亚方阵的加密与解密,可参考维吉尼亚密码_百度百科
画面结果如下: