C# Hill2 加解密

Hill2 加解密

学C#之路太坎坷了吧

页面布局:
在这里插入图片描述

很轻松搞定的加密:

private void hill_Click(object sender, EventArgs e)
        {
            string plainHill = hill_input.Text;
            string newPlainHill = string.Empty;
            string origin = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
            int a11 = Convert.ToInt32(t11.Text);
            int a12 = Convert.ToInt32(t12.Text);
            int a21 = Convert.ToInt32(t21.Text);
            int a22 = Convert.ToInt32(t22.Text);
            // 大小写转换+去空格
            foreach (char c in plainHill)
            {
                if (c >= 'a' && c <= 'z')
                {
                    char newc = (char)(c - 32);
                    newPlainHill += newc;
                }
                else if (c >= 'A' && c <= 'Z')
                    newPlainHill += c;
                else if (c == ' ') continue;
            }
            if (newPlainHill.Length % 2 != 0) newPlainHill += 'X';  // 补充哑字母
            groupText.Text = newPlainHill;
            // 分组矩阵
            int b11, b21;
            int c11, c21;
            string cipherHill = string.Empty;
            hillResult.Text = "";   // 清空
            for(int i=0; i<newPlainHill.Length; )
            {
                b11 = Convert.ToInt32(newPlainHill[i])-65;
                b21 = Convert.ToInt32(newPlainHill[i + 1])-65;
                c11 = (a11 * b11 + a12 * b21) % 26;
                c21 = (a21 * b11 + a22 * b21) % 26;
                hillResult.Text += origin[c11];
                hillResult.Text += origin[c21];
                i += 2;
            }
        }

搞了很久然后利用小聪明解决的解密:

private void hillDecry_Click(object sender, EventArgs e)
        {
            string cipherHill = hill_input.Text;
            string newCipherHill = string.Empty;
            string origin = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
            int a11 = Convert.ToInt32(t11.Text);
            int a12 = Convert.ToInt32(t12.Text);
            int a21 = Convert.ToInt32(t21.Text);
            int a22 = Convert.ToInt32(t22.Text);
            // 大小写转换+去空格
            foreach (char c in cipherHill)
            {
                if (c >= 'a' && c <= 'z')
                {
                    char newc = (char)(c - 32);
                    newCipherHill += newc;
                }
                else if (c >= 'A' && c <= 'Z')
                    newCipherHill += c;
                else if (c == ' ') continue;
            }
            if (newCipherHill.Length % 2 != 0) newCipherHill += 'X';  // 补充哑字母
            groupText.Text = newCipherHill;

            // 先算矩阵值
            int value, inv=0;
            value = a11 * a22 - a12 * a21;
            // 求乘法逆元
            switch (value)
            {
                case 1:  inv = 1;break;
                case 3: inv = 9; break;
                case 5: inv = 21; break;
                case 7: inv = 15; break;
                case 9: inv = 3; break;
                case 11: inv = 19; break;
                case 15: inv = 7; break;
                case 17: inv = 23; break;
                case 19: inv = 11; break;
                case 21: inv = 5; break;
                case 23: inv = 17; break;
                case 25: inv = 25; break;
            }
            // 变成逆矩阵
            int i11 = a22;
            int i12 = -a12;
            int i21 = -a21;
            int i22 = a11;
            // 乘一下 mod26
            int x11 = (i11 * inv + 26) % 26;
            int x12 = (i12 * inv + 26) % 26;
            int x21 = (i21 * inv + 26) % 26;
            int x22 = (i22 * inv + 26) % 26;

            // 分组矩阵
            int b11, b21;
            int c11, c21;
            string plainHill = string.Empty;
            for (int i = 0; i < newCipherHill.Length;)
            {
                b11 = Convert.ToInt32(newCipherHill[i]) - 65;
                b21 = Convert.ToInt32(newCipherHill[i + 1]) - 65;
                c11 = (x11 * b11 + x12 * b21) % 26;
                c21 = (x21 * b11 + x22 * b21) % 26;
                hillResult.Text += origin[c11];
                hillResult.Text += origin[c21];
                i += 2;
            }
        }```

解密真的真的好多好多缺点,很多地方为了思想简单,写得好数学,没有用数组和循环,太累赘啦,有时间再改吧!
掌握了求乘法逆元方法滴uu们,千万不要用我的switch,乖乖敲欧几里得算法去吧…

试验一下:
加密
在这里插入图片描述
解密:
在这里插入图片描述
看着switch太累赘了,
立志我要搞懂欧几里得算法!!!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值