📄 form1.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 + -