C#实现仿射密码(串中字符字母与ASCII码相互转换实例)

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如何转换回字母。

 

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

代码熬夜敲Q

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值