1.代码
static void Main(string[] args)
{
Console.WriteLine("***********请选择功能**********\n1.仿射加密\n2.仿射解密\n3.退出");
int function = int.Parse(Console.ReadLine());
while (function != 3)
{
if (function == 1)
{
Console.Clear();
Console.WriteLine("*********仿射加密**************");
Console.WriteLine("请输入密钥:");
Console.Write("第一个数:");
int a = int.Parse(Console.ReadLine());
Console.Write("第二个数:");
int b = int.Parse(Console.ReadLine());
while (Gcd(a, 26) != 1 || a >= 26 || a < 0 || b >= 26 || b < 0 || a == b)
{
Console.WriteLine("密钥输入错误,请重新输入");
a = int.Parse(Console.ReadLine());
b = int.Parse(Console.ReadLine());
}
TextIntoPassword(a,b);
break;
}
else if (function == 2)
{
Console.Clear();
Console.WriteLine("*********仿射解密**************");
Console.WriteLine("请输入密钥:");
Console.Write("第一个数:");
int a = int.Parse(Console.ReadLine());
Console.Write("第二个数:");
int b = int.Parse(Console.ReadLine());
while (Gcd(a, 26) != 1 || a >= 26 || a < 0 || b >= 26 || b < 0 || a == b)
{
Console.WriteLine("密钥输入错误,请重新输入");
a = int.Parse(Console.ReadLine());
b = int.Parse(Console.ReadLine());
}
PasswordIntoText(a,b);
break;
}
}
}
private static int Gcd(int a,int b)//查找最大公因数
{
int k;
do
{
k = a % b;
a = b;
b = k;
}while (k != 0);
return a;
}
private static void TextIntoPassword(int a ,int b)//明文加密
{
a: Console.Write("请输入最初的明文:");
byte[] Input = System.Text.Encoding.ASCII.GetBytes(Console.ReadLine());
Console.WriteLine("加密后的密文是:");
for (int i = 0; i < Input.Length; i++)
{
if (Input[i] > 96 && Input[i] < 123)
Input[i] = (byte)((a * (Input[i] - 97) + b) % 26 + 65);
else if (Input[i] > 64 && Input[i] < 91)
Input[i] = (byte)((a * (Input[i] - 65) + b) % 26 + 65);
else
{
Console.WriteLine("输入明文有误,只能输入字母,请重新输入");
goto a;
}
}
Console.Write(System.Text.Encoding.ASCII.GetString(Input));
}
private static void PasswordIntoText(int a,int b)//密文解密
{
int temp;
b: Console.Write("请输入最初的密文:");
byte[] Input = System.Text.Encoding.ASCII.GetBytes(Console.ReadLine());
Console.WriteLine("原文是:");
for (int i = 0; i < Input.Length; i++)
{
if (Input[i] > 64 && Input[i] < 91)
{
temp = (byte)(Ni(a,26)*((Input[i]-65)-b));
if (temp < 0) Input[i] = (byte)(temp % 26 + 26 + 97);
else Input[i] = (byte)(temp % 26 + 97);
}
else
{
Console.WriteLine("输入密文有误,只能输入大写字母,请重新输入");
goto b;
}
}
Console.Write(System.Text.Encoding.ASCII.GetString(Input));
}
private static int Ni(int a ,int b)//求逆
{
int i = 0;
while (a * (++i) % b != 1) ;
return i;
}
2.运行结果
3.小结
代码中的计算逻辑简单,最主要的难点还是在于对字符Ascii码的转换以及Ascii如何转换回字母。