rsa 矩阵置换 及Vernam加密算法 C#实现

刚刚搞完密码安全的课程结束论文,des算法搞了好久没搞成,就搞了rsa 矩阵置换 及Vernam加密,上代码


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Security.Cryptography;
namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private void button1_Click(object sender, EventArgs e)
        {
            string mingwen = "", miyao = "", miwen = "";
            
            mingwen = TextBox_mingwen.Text;
            miyao = textBox_miyao.Text;


            if (mingwen.Equals(""))
            {
                MessageBox.Show("明文为空");
               
                return;
            }


            #region 矩阵换位加密
            if (radio_juzhen.Checked) //矩阵换位
            {
                if (miyao.Equals(""))
                {
                    MessageBox.Show("密钥为空");
                    
                    return;
                }


                for (int i = 0; i < miyao.Length; i++)
                {
                    for (int j = i + 1; j < miyao.Length; j++)
                    {
                        if (miyao[i].Equals(miyao[j]))
                        {
                            MessageBox.Show("密钥中不允许有重复字母");
                            return;


                        }
                    }




                    if (!char.IsLetter(miyao[i]))
                    {
                        MessageBox.Show("密钥必须全为字母");
                        return;
                    }
                }




                char[] charr = new char[100];
                int[] intarr = new int[100];
                int[] xulieintarr=new int[100];
                int zushu;
                miyao = miyao.ToLower();//把所有字母转成小写


                for (int i = 0; i < miyao.Length; i++)
                {
                    charr[i] = miyao[i];
                }


                
                for (int i = 0; i < miyao.Length; i++)//密钥的字母排序
                {
                    for (int j = i + 1; j < miyao.Length; j++)
                    {
                        if (charr[i] > charr[j])
                        {
                            char t = charr[i];
                            charr[i] = charr[j];
                            charr[j] = t;
                        }
                    }
                }








                for (int i = 0; i < miyao.Length; i++)//算字母序列  intarr[i] = j;表示miyao字符串的第i位 在字母表排在第j位
                {
                    for (int j = 0; j < miyao.Length; j++)
                    {
                        if (miyao[j].Equals(charr[i]))
                        {
                            intarr[i] = j;
                            break;
                        }
                    }
                    //label9.Text += charr[i];
                }




                for (int i = 0; i < miyao.Length; i++)//逆序列 用于
                {
                    for (int j = 0; j < miyao.Length; j++)
                    {
                        if (i == intarr[j])
                        {
                            xulieintarr[i] = j;
                            break;
                        }
                    }
                }




                zushu = mingwen.Length / miyao.Length;
                if ((mingwen.Length) % (miyao.Length) != 0)
                {
                    while ((mingwen.Length) % (miyao.Length) != 0)
                    {
                        mingwen += '$';
                    }
                    zushu += 1;


                }






                for (int i = 0; i < miyao.Length; i++)
                {
                    for (int j = 0; j < zushu; j++)
                    {
                        //miwen += mingwen[j * miyao.Length + xulieintarr[i]];
                        miwen += mingwen[j * miyao.Length + intarr[i]];
                        //label9.Text += xulieintarr[i];
                    }
                    
                }
                //attackbeginsatfive
                TextBox_miwen.Text = miwen;
             }
#endregion


            #region Vernam加密
            if (radio_Vernam.Checked)//Vernam加密
            {
                if (miyao.Equals(""))
                {
                    MessageBox.Show("密钥为空");
                    //flag = false;
                    return;
                }


                if (miyao.Length != 8)
                {
                    MessageBox.Show("密钥长度必须为8");
                    return;
                }


                for (int i = 0; i < miyao.Length; i++)
                {
                    if (!miyao[i].Equals('1') && !miyao[i].Equals('0'))
                    {
                        MessageBox.Show("密钥必须由1和0构成");
                        return;
                    }
                }


                int intmiyao;
                intmiyao = Convert.ToInt16(miyao, 2);


                //label9.Text =Convert.ToString(intmiyao);


                for (int i = 0; i < mingwen.Length; i++)
                {
                    int intming = Convert.ToInt16(mingwen[i]);
                    intming ^= intmiyao;
                    miwen += Convert.ToChar(intming);
                }


                TextBox_miwen.Text = miwen;
            }


            #endregion


            #region rsa加密
            if (radio_rsa.Checked)//rsa加密    c=(m^e)%n
            {
                if (miyao.Equals(""))
                {
                    MessageBox.Show("密钥为空");


                    return;
                }


                long gongyue_e = Convert.ToInt32(miyao);
                long n =Convert.ToInt32( textBox_n.Text);
                for (int i=0; i < mingwen.Length; i++)
                {
                    long[] carr=new long[4];
                    //long c=rsaqiumo(Convert.ToInt32(mingwen[i]),gongyue_e,n);
                    long c = Algmod(Convert.ToInt32(mingwen[i]), gongyue_e, n);
                    for (int j = 0; j < 4; j++)
                    {
                        carr[j] = c & 0xff;
                        c >>= 8;
                    }


                    for (int j = 3; j >=0; j--)
                    {
                        if (carr[j] >> 4 == 0)
                        {
                            miwen+='0';
                        }
                        miwen += Convert.ToString(carr[j],16);
                    }
                                        
                }


                TextBox_miwen.Text = miwen;
  
            }
        }


         #endregion


        private void button_jiemi_Click(object sender, EventArgs e)
        {
            string mingwen = "", miwen = "", miyao = "";
            miwen = TextBox_miwen.Text;
            miyao = textBox_miyao.Text;


            if (miwen.Equals(""))
            {
                MessageBox.Show("密文为空");
                return;
            }


            #region rsa解密
            if (radio_rsa.Checked)//rsa解密
            {
                if (miyao.Equals(""))
                {
                    MessageBox.Show("密钥为空");
                    //flag = false;
                    return;
                }


                long n = Convert.ToInt32( textBox_n.Text);
                long d = Convert.ToInt32(textBox_miyao.Text);




                //if()


                for (int i = 0; i < miwen.Length/8; i++)
                {
                    string strt = "";
                    //for (int j = 0; j < 8; j++)
                    //{
                    //    strt+=miwen[i*8 + j];
                    //}
                    strt = miwen.Substring(i * 8, 8);


                    long ltemp=Convert.ToInt32(strt,16);
                    //ltemp = rsaqiumo(ltemp, d, n);
                    ltemp = Algmod(ltemp,d,n);


                    
                    mingwen+=(char)ltemp;
                }


                 TextBox_mingwen.Text = mingwen;
            }
            #endregion


            #region  矩阵换位解密
            if (radio_juzhen.Checked)//矩阵换位解密
            {
                


                if (miyao.Equals(""))
                {
                    MessageBox.Show("密钥为空");
                    //flag = false;
                    return;
                }


                if (!(miwen.Length % miyao.Length == 0))
                {
                    MessageBox.Show("密文长度必须为密钥长度的整数倍");
                    return;
                }




                for (int i = 0; i < miyao.Length; i++)
                {
                    for (int j = i + 1; j < miyao.Length; j++)
                    {
                        if (miyao[i].Equals(miyao[j]))
                        {
                            MessageBox.Show("密钥中不允许有重复字母");
                            return;


                        }
                    }




                    if (!char.IsLetter(miyao[i]))
                    {
                        MessageBox.Show("密钥必须全为字母");
                        return;
                    }
                 }




                char[] charr = new char[100];
                int[] intarr = new int[100];
                int[] xulieintarr = new int[100];
                int zushu,fenzuchangdu;
                miyao = miyao.ToLower();//把所有字母转成小写


                for (int i = 0; i < miyao.Length; i++)
                {
                    charr[i] = miyao[i];
                }




                for (int i = 0; i < miyao.Length; i++)//密钥的字母排序
                {
                    for (int j = i + 1; j < miyao.Length; j++)
                    {
                        if (charr[i] > charr[j])
                        {
                            char t = charr[i];
                            charr[i] = charr[j];
                            charr[j] = t;
                        }
                    }
                }








                for (int i = 0; i < miyao.Length; i++)//算字母序列  intarr[i] = j;表示miyao字符串的第i位 在字母表排在第j位
                {
                    for (int j = 0; j < miyao.Length; j++)
                    {
                        if (miyao[j].Equals(charr[i]))
                        {
                            intarr[i] = j;
                            break;
                        }
                    }
                    //label9.Text += intarr[i];
                }
                //label9.Text += ' ';


                for (int i = 0; i < miyao.Length; i++)//逆序列 用于解密
                {
                    for (int j = 0; j < miyao.Length; j++)
                    {
                        if (i == intarr[j])
                        {
                            xulieintarr[i] = j;
                            break;
                        }
                    }
                    //label9.Text += xulieintarr[i];
                }


                
                zushu = miwen.Length / miyao.Length;
                //fenzuchangdu=miwen.Length/zushu;
                for (int j = 0; j < zushu; j++)//j循环读取分组密文长度
                {
                    for (int i = 0; i < miyao.Length; i++)//i循环读取排序
                    {


                        if (!miwen[xulieintarr[i] * zushu + j].Equals('$'))
                            mingwen += miwen[xulieintarr[i] * zushu + j];
                        //miwen += mingwen[j * miyao.Length + intarr[i]];
                        //label9.Text += xulieintarr[i];
                    }


                }
                //attackbeginsatfive
                TextBox_mingwen.Text = mingwen;
            }
            #endregion


            #region  Vernam解密
            if (radio_Vernam.Checked)//Vernam解密
            {
                if (miyao.Equals(""))
                {
                    MessageBox.Show("密钥为空");
                    //flag = false;
                    return;
                }


                if (miyao.Length != 8)
                {
                    MessageBox.Show("密钥长度必须为8");
                    return;
                }


                for (int i = 0; i < miyao.Length; i++)
                {
                    if (!miyao[i].Equals('1') && !miyao[i].Equals('0'))
                    {
                        MessageBox.Show("密钥必须由1和0构成");
                        return;
                    }
                }


                int intmiyao = Convert.ToInt16(miyao, 2);


                for (int i = 0; i < miwen.Length; i++)
                {
                    int intmi = miwen[i];
                    intmi ^= intmiyao;
                    mingwen += Convert.ToChar(intmi);
                }
                TextBox_mingwen.Text = mingwen;
            }
            #endregion
        }








        long rsaqiumo(long dishu, long zhishu, long n)//求(dishu^zhishu)%n
        {
            long r = 1;
            zhishu += 1;
            while (zhishu != 1)
            {
                r = r * dishu;
                r = r % n;
                zhishu--;
            }
            //printf("%d\n", r);
            return r;
        }




        //  C#改写的,在vs.net 2005下调试通过:
        /// <summary>
        /// 指数取模:x=(a^b)%c (a的b次方mod)
        /// 条件1:在rsa中a<c,其它不用a<c
        /// 条件2:ac互素
        /// </summary>
        /// /*
        /// 
        /// */
        private static long Algmod(long a, long b, long c)
        {
            long[] l = new long[500];
            long z = -1, y;
            for (; b != 1; b >>= 1)//分解b为2进制数.记录下分解成的位数z,构造栈l
            {
                z++;
                if (b % 2 == 0)
                    l[z] = 0;
                else
                    l[z] = 1;
            }
            //a%=c;//如果一开始数就很大,先模一次,防止过大, 求逆
            y = a * a % c;//第一次模
            for (; z > 0; z--)
            {
                if (l[z] > 0) y = (y * a % c) * (y * a % c) % c;
                else y = y * y % c;
            }
            if (l[0] > 0) y = (y * a % c);//最后次模
            return y;
        }


        private void button2_Click(object sender, EventArgs e)
        {
            //long gongyue_e = 65537;
            //long p = 9973;
            //long q = 5009;
            //long t = (p - 1) * (q - 1);
            //long n = p * q;


            //long d = 1;
            //while (((gongyue_e * d) % t) != 1) d++;


            //zidai_ras_gongyao.Text = Convert.ToString(gongyue_e);
            //zidai_rsa_n.Text = Convert.ToString(n);
            //zidai_rsa_siyao.Text = Convert.ToString(d);




            zidai_ras_gongyao.Text = "65537";
            zidai_rsa_n.Text = "49954757";
            zidai_rsa_siyao.Text = "44705537";
        }


        private void radio_rsa_CheckedChanged(object sender, EventArgs e)
        {
            if (radio_rsa.Checked)
            {
                textBox_n.ReadOnly = false;
            }
            else
            {
                textBox_n.ReadOnly = true;
            }
        }


        private void radio_juzhen_CheckedChanged(object sender, EventArgs e)
        {
            if (radio_rsa.Checked)
            {
                textBox_n.ReadOnly = false;
            }
            else
            {
                textBox_n.ReadOnly = true;
            }
        }


        private void radio_Vernam_CheckedChanged(object sender, EventArgs e)
        {
            if (radio_rsa.Checked)
            {
                textBox_n.ReadOnly = false;
            }
            else
            {
                textBox_n.ReadOnly = true;
            }
        }
    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值