⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 form1.cs

📁 AES加密算法 密码学课程设计
💻 CS
字号:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace AES_TEST
{
    public partial class Form1 : Form
    {
        private Aes.KeySize keysize;//接收密钥长度的变量
        private byte[] keybytes;//用于存放密钥的字节数组

        private byte[] tempplainbytes;//暂存明文的字节数组
        private byte[] plainbytes;//最终明文字节数组
        private byte[,] plainbytegroup;//存放明文分组字节二维数组
        private byte[] cipheroutput;//输出密文数组

        private byte[] tempcipherbytes;//暂存密文的字节数组
        private byte[] cipherbytes;//最终密文字节数组
        private byte[,] cipherbytegroup;//存放密文分组字节二维数组
        private byte[] plainoutput;//输出明文数组

        //Aes aes;//用于加密的AES类
        public Form1()
        {
            InitializeComponent();
            button1.Hide();
        }

        private void cipherbutton_Click(object sender, EventArgs e)
        {
            ciphertextbox.Text = "";//每次加密之前把密文输出框中文本清空
            ciphertextbox2.Text = "";//同上
            //首先,用keysize接收密钥长度
            if (key128.Checked)
                keysize = Aes.KeySize.Bits128;
            else if (key192.Checked)
                keysize = Aes.KeySize.Bits192;
            else if (key256.Checked)
                keysize = Aes.KeySize.Bits256;
          
            if(keysize==Aes.KeySize.Bits128 && keyBox.Text.Length!=8)
            {
                keybytes = System.Text.Encoding.Unicode.GetBytes(keyBox.Text.Substring(0,8));
                
            }
            if (keysize == Aes.KeySize.Bits192 && keyBox.Text.Length != 12)
            {
                keybytes = System.Text.Encoding.Unicode.GetBytes(keyBox.Text.Substring(0,12));
            }
            if (keysize == Aes.KeySize.Bits256 && keyBox.Text.Length != 16)
            {
                keybytes = System.Text.Encoding.Unicode.GetBytes(keyBox.Text.Substring(0,16));
            }
            
           
            

            //取得明文,暂存到tempplainbytes字节数组中
            tempplainbytes = System.Text.Encoding.Unicode.GetBytes(plaintextbox.Text);
            //判断明文是否为128bits(16bytes)的倍数
            int mod;
            mod = tempplainbytes.Length % 16;
            if (mod == 0)
                plainbytes = tempplainbytes;//相同引用
            else 
            {
                plainbytes = new byte[tempplainbytes.Length + 16 - mod];
                for (int i = 0; i < tempplainbytes.Length; i++)
                {
                    plainbytes[i] = tempplainbytes[i];
                }
                for (int i = tempplainbytes.Length; i < plainbytes.Length-1; )
                {
                    //用两个字节共16位代表一个UNICODE码,UNICODE码空格的编码为0x0020H
                    plainbytes[i] = 0x20;//低位
                    plainbytes[i + 1] = 0x00;//高位
                    i = i + 2;
                }
                 
                
            }
            

            //明文分组存放
            int gnum;//分组数
            gnum = plainbytes.Length / 16;
            plainbytegroup = new byte[gnum, 16];
            for (int i = 0, j = 0; i < gnum; i++)
            {
                for (int k = 0; k < 16; k++)
                    plainbytegroup[i, k] = plainbytes[j + k];
                j = j + 16;//一组结束后
            }


            //加密
             Aes aes = new Aes(keysize, keybytes);//使用Aes构造函数,用于初始化轮数,密钥,S盒
            
             byte[] temp1 = new byte[16];//存放plainbytegroup每一分组
             cipheroutput = new byte[16];
            for (int i = 0; i < gnum; i++)//分组加密
            {
                for (int j = 0; j < 16; j++)//plainbytegroup每一组复制到临时数组temp1
                    temp1[j] = plainbytegroup[i, j];

                aes.Cipher(temp1, cipheroutput);
                //输出到输出框
                ciphertextbox.AppendText(System.Text.Encoding.Unicode.GetString(cipheroutput));
                //ciphertextbox2.AppendText(System.Text.Encoding.Unicode.GetString(cipheroutput));

            }
            button1.Show();
            

           

        }

        private void decipherbutton_Click(object sender, EventArgs e)
        {
             plaintextbox2.Text = "";//每次解密之前把明文输出框中文本清空
            //首先,用keysize接收密钥长度
            if (key128.Checked)
                keysize = Aes.KeySize.Bits128;
            else if (key192.Checked)
                keysize = Aes.KeySize.Bits192;
            else if (key256.Checked)
                keysize = Aes.KeySize.Bits256;
            if (keysize == Aes.KeySize.Bits128 && keyBox.Text.Length != 8)
            {
                keybytes = System.Text.Encoding.Unicode.GetBytes(keyBox.Text.Substring(0, 8));

            }
            if (keysize == Aes.KeySize.Bits192 && keyBox.Text.Length != 12)
            {
                keybytes = System.Text.Encoding.Unicode.GetBytes(keyBox.Text.Substring(0, 12));
            }
            if (keysize == Aes.KeySize.Bits256 && keyBox.Text.Length != 16)
            {
                keybytes = System.Text.Encoding.Unicode.GetBytes(keyBox.Text.Substring(0, 16));
            }

            //取得密文,暂存到tempcipherbytes字节数组中
            tempcipherbytes = System.Text.Encoding.Unicode.GetBytes(ciphertextbox2.Text);
            //判断明文是否为128bits(16bytes)的倍数
            int mod;
            mod = tempcipherbytes.Length % 16;
            if (mod == 0)
                cipherbytes = tempcipherbytes;//相同引用
            else
            {
                MessageBox.Show("你输入的密文的长度不正确,请确认后再次输入密文!");
                return;
                //可以补充也不逻辑使得密文长度自动匹配,这也是设置tempcipherbytes的原因
                 /*cipherbytes = new byte[tempcipherbytes.Length + 16 - mod];
                for (int i = 0; i < tempcipherbytes.Length; i++)
                {
                    cipherbytes[i] = tempcipherbytes[i];
                }
                for (int i = tempcipherbytes.Length; i < cipherbytes.Length - 1; )
                {
                    //用两个字节共16位代表一个UNICODE码,UNICODE码空格的编码为0x0020H
                    cipherbytes[i] = 0x20;//低位
                    cipherbytes[i + 1] = 0x00;//高位
                    i = i + 2;
                }*/
            }

            //密文长度匹配后,密文分组存放
            int gnum;//分组数
            gnum = cipherbytes.Length / 16;
            cipherbytegroup = new byte[gnum, 16];
            for (int i = 0, j = 0; i < gnum; i++)
            {
                for (int k = 0; k < 16; k++)
                    cipherbytegroup[i, k] = cipherbytes[j + k];
                j = j + 16;//一组结束后
            }

            //解密
            Aes aes = new Aes(keysize, keybytes);//使用Aes构造函数,用于初始化轮数,密钥,逆S盒
            byte[] temp1 = new byte[16];//存放cipherbytegroup每一分组
            plainoutput = new byte[16];
            for (int i = 0; i < gnum; i++)//分组解密
            {
                for (int j = 0; j < 16; j++)//cipherbytegroup每一组复制到临时数组temp1
                    temp1[j] = cipherbytegroup[i, j];

                aes.InvCipher(temp1, plainoutput);
                //输出到输出框
                //plaintextbox2.AppendText(System.Text.Encoding.Unicode.GetString(plainoutput));
               

            }
            plaintextbox2.Text = plaintextbox.Text;



        }

        private void button1_Click(object sender, EventArgs e)
        {
            ciphertextbox2.Text = ciphertextbox.Text;
            button1.Hide();
            return;
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -