算法简述:
加法密码和乘法密码结合就构成仿射密码,仿射密码的加密和解密算法是:
C= Ek(m)=(k1m+k2) mod n
M= Dk(c)=k3(c- k2) mod n(其中(k3 ×k1)mod26 = 1)
仿射密码具有可逆性的条件是gcd(k1, n)=1。当k1=1时,仿射密码变为加法密码,当k2=0时,仿射密码变为乘法密码。
仿射密码中的密钥空间的大小为nφ(n),当n为26字母,φ(n)=12,因此仿射密码的密钥空间为12×26 = 312。
主要代码如下:
int i,j,l,m,b;
char[] str1 = new char[80];
Console.WriteLine("请输入需要加密的明文:");
string str = Console.ReadLine();
int[] k1 = { 0, 3, 5, 7, 9, 11, 15, 17, 19, 21, 23, 25 };
char[] t1 = { 'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z' };
char[] t2 = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z' };
for (i = 0; i < k1.Length; i++)
{
Console.WriteLine("{0}", k1[i]);
}
Console.WriteLine("选择加密的系数 k1 :");
j = int.Parse(Console.ReadLine());
Console.WriteLine("输入加密参数 k2(0~25):");
m = int.Parse(Console.ReadLine());
for (int n = 0; n < str.Length; n++)
{
for (l = 0; l < t1.Length; l++)
{
if (str[n] == t1[l])
{
b = (j * l + m) % 26;
str1[n] = t2[b];
}
}
}
Console.WriteLine("加密所得的密文如下:");
Console.WriteLine(str1);
Console.ReadKey();
运行结果: