[加密]C#实现维吉尼亚加密与解密(解密前提为已知密匙)

[加密]C#实现维吉尼亚加密与解密(解密前提为已知密匙) 维吉尼亚密码 C# 实现与解析维吉尼亚密码Vigenère cipher是一种经典的多表替换加密算法通过使用密钥和维吉尼亚方阵Vigenère square对明文进行加密和解密。本文将详细介绍维吉尼亚密码的原理并提供一个完整的 C# Windows Forms 实现。1. 维吉尼亚密码原理维吉尼亚密码基于凯撒密码但使用一个密钥来动态选择加密表。其核心是维吉尼亚方阵这是一个 26×26 的字母表矩阵第一行为 A-Z明文行第一列为 A-Z密钥行每个单元格的字母由“明文列字母”与“密钥行字母”相加模26得到加密时将明文和密钥转换为数字A0, B1, ..., Z25然后通过维吉尼亚方阵查找对应的密文字母。解密则是反向查找过程。2. C# 实现代码以下是一个完整的 Windows Forms 应用程序实现了维吉尼亚密码的加密和解密功能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 { // 维吉尼亚方阵26×26 private string[,] matrix new string[26, 26]; private ASCIIEncoding ascii new ASCIIEncoding(); // 密钥、密文、明文 private string key; private string code; private string text; public Form1() { InitializeComponent(); #region 生成维吉尼亚方阵 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(); Listint keyNum new Listint(); // 将密钥转换为数字序列A0, B1, ..., Z25 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; // 加密matrix[密钥数字, 明文字母数字] 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 ; Listint keyNum new Listint(); // 将密钥转换为数字序列 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); break; } } } this.txtText.Text text.ToString(); } } }3. 代码解析3.1 维吉尼亚方阵生成在窗体构造函数中我们生成一个 26×26 的维吉尼亚方阵外层循环i表示密钥字母索引0-25内层循环j表示明文字母索引0-25每个单元格的字母 ASCII 码为 65 i jA 的 ASCII 码为 65如果计算结果超过 90Z 的 ASCII 码则减去 26 回到 A-Z 范围3.2 加密过程将密钥和明文转换为大写将密钥字母转换为数字A0, B1, ..., Z25遍历明文字符如果是空格直接保留否则使用公式matrix[密钥数字, 明文字母数字]查找密文字母密钥循环使用index % key.Length3.3 解密过程将密钥和密文转换为大写将密钥字母转换为数字遍历密文字符如果是空格直接保留否则在密钥对应的行中查找密文字母的位置找到后将列索引转换为明文字母4. 使用示例假设密钥KEY明文HELLO WORLD加密过程密钥 KEY 转换为数字K10, E4, Y24明文 HELLO WORLD 转换为数字H7, E4, L11, L11, O14, W22, O14, R17, L11, D3加密计算H(7) K(10) R(17)E(4) E(4) I(8)L(11) Y(24) J(9)35-269...以此类推得到密文RIJVS GYJVN5. 程序界面说明程序包含以下控件txtKey密钥输入框txtText明文输入框txtCode密文显示框button1加密按钮button2解密按钮6. 扩展与优化建议支持小写字母当前实现只处理大写字母可扩展支持小写支持更多字符可扩展支持数字、标点符号等性能优化解密时的查找操作可优化为直接计算错误处理添加输入验证和异常处理文件加密扩展为文件加密/解密功能7. 参考资料对于维吉尼亚方阵及运用维吉尼亚方阵的加密与解密可参考维吉尼亚密码_百度百科程序运行画面结果如下此处可插入程序运行截图