C# 实现 Vigenere 密码

Vigenere密码是一种经典的替代密码,它由密钥和明文组成,通过将明文中的每个字母按照密钥字母的定位进行偏移来加密数据。

下面是Vigenere密码的加密和解密过程的详细说明:

  1. 加密过程:

    • 首先,选择一个密钥,它是一个由字母组成的单词或短语。例如,密钥可以是 "KEY"。
    • 将明文消息中的每个字母与对应位置的密钥字母进行配对。例如,明文消息是 "HELLO",则与密钥 "KEY" 配对后为 "H" 和 "K", "E" 和 "E", "L" 和 "Y", "L" 和 "K", "O" 和 "E"。
    • 使用Vigenere密码表(也称为Vigenere方阵)进行加密。Vigenere密码表是一个26x26的方阵,其中每一行代表一个字母,并通过循环移位来填充每一行。密钥中的每个字母用于决定使用Vigenere密码表的哪一行。例如,密钥中的第一个字母 "K" 表示使用Vigenere密码表的第11行。
    • 使用密钥字母所在行的字母来确定明文字母的加密后的字母。例如,密钥字母 "K" 和明文字母 "H" 在Vigenere密码表中交叉点的位置为 "V"。
    • 通过对明文中的每个字母重复以上步骤,最终得到加密后的密文。
  2. 解密过程:

    • 使用相同的密钥和Vigenere密码表进行解密。
    • 将密文中的每个字母与对应位置的密钥字母进行配对。
    • 使用密钥字母所在行的字母来确定密文字母的解密后的字母。
    • 通过对密文中的每个字母重复以上步骤,最终得到解密后的明文。

Vigenere密码相对于简单的凯撒密码更复杂和强大,因为它使用了一个可变的密钥来加密数据,增加了加密的难度和安全性。然而,Vigenere密码并不是绝对安全的,可以使用一些密码分析技术(如频率分析)来破解较短的密文。

以下是一个 C# 的 Vigenere 密码 的示例代码:

using System;

public class VigenereCipher

{

private string key;

public VigenereCipher(string key)

{

this.key = key.ToUpper();

}

public string Encrypt(string plainText)

{

plainText = plainText.ToUpper();

string cipherText = "";

for (int i = 0, j = 0; i < plainText.Length; i++)

{

char plainChar = plainText[i];

char keyChar = key[j % key.Length];

if (Char.IsLetter(plainChar))

{

cipherText += (char)((plainChar + keyChar - 2 * 'A') % 26 + 'A');

j++;

}

else

{

cipherText += plainChar;

}

}

return cipherText;

}

public string Decrypt(string cipherText)

{

cipherText = cipherText.ToUpper();

string plainText = "";

for (int i = 0, j = 0; i < cipherText.Length; i++)

{

char cipherChar = cipherText[i];

char keyChar = key[j % key.Length];

if (Char.IsLetter(cipherChar))

{

plainText += (char)((cipherChar - keyChar + 26) % 26 + 'A');

j++;

}

else

{

plainText += cipherChar;

}

}

return plainText;

}

}

public class Program

{

public static void Main()

{

string key = "KEY";

string plainText = "HELLO";

VigenereCipher cipher = new VigenereCipher(key);

string encryptedText = cipher.Encrypt(plainText);

string decryptedText = cipher.Decrypt(encryptedText);

Console.WriteLine("Plain Text: " + plainText);

Console.WriteLine("Encrypted Text: " + encryptedText);

Console.WriteLine("Decrypted Text: " + decryptedText);

}

}

这个示例代码定义了一个VigenereCipher类,它接受一个密钥作为构造函数的参数。然后,使用Encrypt方法对明文进行加密,使用Decrypt方法对密文进行解密。在Main方法中,我们创建了一个VigenereCipher对象,使用示例的密钥和明文进行加密和解密,并打印结果。

输出示例:

Plain Text: HELLO

Encrypted Text: VHRFO

Decrypted Text: HELLO

这个示例只是一个基本的Vigenere密码实现,可以根据需要进行进一步的修改和扩展。

相关推荐
敲代码的 蜡笔小新29 分钟前
【行为型之中介者模式】游戏开发实战——Unity复杂系统协调与通信架构的核心秘诀
unity·设计模式·c#·中介者模式
CM莫问35 分钟前
<论文>(微软)避免推荐域外物品:基于LLM的受限生成式推荐
人工智能·算法·大模型·推荐算法·受限生成
程序猿多布1 小时前
使用Visual Studio将C#程序发布为.exe文件
c#·visual studio
康谋自动驾驶2 小时前
康谋分享 | 自动驾驶仿真进入“标准时代”:aiSim全面对接ASAM OpenX
人工智能·科技·算法·机器学习·自动驾驶·汽车
老衲有点帅2 小时前
C#多线程Thread
开发语言·c#
C++ 老炮儿的技术栈2 小时前
什么是函数重载?为什么 C 不支持函数重载,而 C++能支持函数重载?
c语言·开发语言·c++·qt·算法
yychen_java3 小时前
R-tree详解
java·算法·r-tree
MarkHard1233 小时前
Leetcode (力扣)做题记录 hot100(62,64,287,108)
算法·leetcode·职场和发展
PascalMing4 小时前
C# 通过脚本实现接口
c#·codeanalysis·接口派生
一只鱼^_4 小时前
牛客练习赛138(首篇万字题解???)
数据结构·c++·算法·贪心算法·动态规划·广度优先·图搜索算法