做大作业写的,仅供学习参考,加密速度只有120kB/s的样子,有修改提速的空间。
(1)加密时文件读写类ReadandWriteFileBynByte1
用于AES加密的分组(最小单位为字32bits)文件读写IO,本软件将每组字数Nb设置为4,由于采用了PKCS5PADDING / PKCS7PADDING填充模式。所以分组大小限制在256/4=64个字以内。
(2)解密时文件读写类ReadandWriteFileBynByte2
用于AES解密的分组(最小单位为字32bits)文件读写IO,本软件将每组字数Nb设置为4,由于采用了PKCS5PADDING / PKCS7PADDING填充模式。所以分组大小限制在256/4=64个字以内。并相对1增加有writeLastNbyte()函数,来对文档末尾的填充进行消除。
(3)工具类Tools
用于AES CBC模式下的一些处理。
方法1 :public String xorForString(String s1,String s2)
对以String类型保存的两个长度相同的数据进行异或处理
方法2:public String stringIn0x(String in,int Nk)
将长度为Nk个字的以char值保存的String类型转化为以“0x”开头的十六进制长度为Nk*8+2的String类型。
方法3:public String oxtoString (String in,int Nk)
将以“0x”开头的十六进制长度为Nk*8+2的String类型转化为Nk个字的以char值保存的String类型。
(4)字类Word;
用于存储4个字节的数据并进行管理,有自左移一个字节函数public void rotWord(),和自右移一个字节的函数public void invRotWord(),有复制函数,有按字异或函数public Word wordXOR(Word w)等。
(5)AES加密类AESCode
对以String类型传递的4个字长度的明文通过以String类型传递的Nk(4,6,8)个字长度的密钥进行加密,并输出为String类型。在本次软件中为了减少运行时间,加密时添加了代码:
if(cipherKey==null)
{
setCipherKey(Key);
keyExpansion();
}
来减少运算次数。
加密的核心代码为:
addRoundKey(cipherText,0);
for(i=1;i<Nr;i++)
{
subNbWords(cipherText);
rotNbWord(cipherText);
mixColumn(cipherText);
addRoundKey(cipherText,i);
}
subNbWords(cipherText);
rotNbWord(cipherText)
addRoundKey(cipherText, Nr);
(6)AES解密类
对以String类型传递的4个字长度的明文通过以String类型传递的Nk(4,6,8)个字长度的密钥进行解密,并输出为String类型。在本次软件中为了减少运行时间,同样添加了代码:
if(cipherKey==null)
{
setCipherKey(Key);
keyExpansion();
}
解密核心代码
addRoundKey(cipherText,0);
for(i=1;i<Nr;i++)
{
subNbWords(cipherText);
rotNbWord(cipherText);
mixColumn(cipherText);
addRoundKey(cipherText,i);
}
subNbWords(cipherText);
rotNbWord(cipherText);
addRoundKey(cipherText, Nr);
(7)AESGUI类
用于图形交互界面,并实现选择密钥位数随机生成密钥、随机生成随机向量、选择加/解密文件,基于CBC模式的加/解密、运行计时功能。
链接:https://pan.baidu.com/s/1_rgEexUvI08HqTpLHXsW0Q
提取码:8086
B站id:信院学长
https://www.bilibili.com/read/cv9312947
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.util.Random;
import javax.swing.*;
public class AESGUI extends JFrame implements ActionListener
{
JTabbedPane tabbedPane;
JPanel panel1,panel2;
CheckboxGroup g1,g2;
Checkbox c11,c12,c13;
Button b11,b12,b13,b14,b15;
Label l11,l12,l13,l14,l15;//l16,l17;
TextField t11,t12,t13,t14;
//TextArea t15,t16;
Checkbox c21,c22,c23;
Button b23,b24,b25;
Label l21,l22,l23,l24,l25;//l26,l27;
TextField t21,t22,t23,t24;
//TextArea t25,t26;
int codeNk,decodeNk;
String codereadfilename;
String decodereadfilename;
String codewritefilename;
String decodewritefilename;
//十六进制
String oxcodeCipherKey;
String oxdecodeCipherKey;
String oxcodeRandomCector;
String oxdecodeRandomCector;
//值存储
String codeCipherKey;
String decodeCipherKey;
String codeRandomCector;
String decodeRandomCector;
JFileChooser fileChooser1;
JFileChooser fileChooser2;
JFileChooser fileChooser3;
JFileChooser fileChooser4;
public void display() {
setSize(900,300);
setResizable(false);
setLocation(200,300);
g1=new CheckboxGroup();
c11=new Checkbox("128",g1,true);
c12=new Checkbox("192",g1,false);
c13=new Checkbox("256",g1,false);
b11=new Button("随机生成会话密钥");
b12=new Button("随机生成随机向量");
b13=new Button("选择文件");
b14=new Button("选择路径");
b15=new Button("加密");
b11.addActionListener(this);
b12.addActionListener(this);
b13.addActionListener(this);
b14.addActionListener(this);
b15.addActionListener(this);
l11=new Label("密钥位数:");
l12=new Label("会话密钥:");
l13=new Label("随机向量:");
l14=new Label("明文文件:");
l15=new Label("密文文件路径:");
t11=new TextField(66);
t12=new TextField(66);
t13=new TextField(34);
t14=new TextField(34);
panel1.add(l11);
panel1.add(c11);
panel1.add(c12);
panel1.add(c13);
panel1.add(b11);
panel1.add(b12);
panel1.add(l12);
panel1.add(t11);
panel1.add(l13);
panel1.add(t12);
panel1.add(l14);
panel1.add(t13);
panel1.add(b13);
panel1.add(l15);
panel1.add(t14);
panel1.add(b14);
panel1.add(b15);
GridBagLayout gb1 = new GridBagLayout();
panel1.setLayout(gb1);
GridBagConstraints gbc = new GridBagConstraints();
//第一行
gbc.gridx=0;
gbc.gridy=0;
gbc.anchor = GridBagConstraints.WEST;
gbc.fill = GridBagConstraints.NONE;
gbc.gridwidth = 1;
gbc.gridheight = 1;
gbc.weightx = 0;
gbc.weighty = 0;
gb1.setConstraints(l11, gbc);
gbc.gridx=1;
gbc.gridy=0;
gbc.anchor = GridBagConstraints.CENTER;
gbc.fill = GridBagConstraints.NONE;
gbc.gridwidth = 1;
gbc.gridheight = 1;
gbc.weightx = 0;
gbc.weighty = 0;
gb1.setConstraints(c11, gbc);
gbc.gridx=2;
gbc.gridy=0;
gbc.anchor = GridBagConstraints.CENTER;
gbc.fill = GridBagConstraints.NONE;
gbc.gridwidth = 1;
gbc.gridheight = 1;
gbc.weightx = 0;
gbc.weighty = 0;
gb1.setConstraints(c12, gbc);
gbc.gridx=3;
gbc.gridy=0;
gbc.anchor = GridBagConstraints.CENTER;
gbc.fill = GridBagConstraints.NONE;
gbc.gridwidth = 1;
gbc.gridheight = 1;
gbc.weightx = 0;
gbc.weighty = 0;
gb1.setConstraints(c13, gbc);
gbc.gridx=4;
gbc.gridy=0;
gbc.anchor = GridBagConstraints.CENTER;
gbc.fill = GridBagConstraints.NONE;
gbc.gridwidth = 1;
gbc.gridheight = 1;
gbc.weightx = 0;
gbc.weighty = 0;
gb1.setConstraints(b11, gbc);
gbc.gridx=5;
gbc.gridy=0;
gbc.anchor = GridBagConstraints.CENTER;
gbc.fill = GridBagConstraints.NONE;
gbc.gridwidth = 1;
gbc.gridheight = 1;
gbc.weightx = 0;
gbc.weighty = 0;
gb1.setConstraints(b12, gbc);
//第二行
gbc.gridx=0;
gbc.gridy=1;
gbc.anchor = GridBagConstraints.WEST;
gbc.fill = GridBagConstraints.NONE;
gbc.gridwidth = 1;
gbc.gridheight = 1;
gbc.weightx = 0;
gbc.weighty = 0;
gb1.setConstraints(l12, gbc);
gbc.gridx=1;
gbc.gridy=1;
gbc.anchor = GridBagConstraints.EAST;
gbc.fill = GridBagConstraints.BOTH;
gbc.gridwidth = 10;
gbc.gridheight = 1;
gbc.weightx = 0;
gbc.weighty = 0;
gbc.gridwidth=GridBagConstraints.REMAINDER;
gb1.setConstraints(t11, gbc);
//第三行
gbc.gridx=0;
gbc.gridy=2;
gbc.anchor = GridBagConstraints.EAST;
gbc.fill = GridBagConstraints.BOTH;
gbc.gridwidth = 1;
gbc.gridheight = 1;
gbc.weightx = 0;
gbc.weighty = 0;
gb1.setConstraints(l13, gbc);
gbc.gridx=1;
gbc.gridy=2;
gbc.anchor = GridBagConstraints.EAST;
gbc.fill = GridBagConstraints.BOTH;
gbc.gridwidth = 10;
gbc.gridheight = 1;
gbc.weightx = 0;
gbc.weighty = 0;
gbc.gridwidth=GridBagConstraints.REMAINDER;
gb1.setConstraints(t12, gbc);
//第四行
gbc.gridx=0;
gbc.gridy=3;
gbc.anchor = GridBagConstraints.EAST;
gbc.fill = GridBagConstraints.BOTH;
gbc.gridwidth = 1;
gbc.gridheight = 1;
gbc.weightx = 0;
gbc.weighty = 0;
gb1.setConstraints(l14, gbc);
gbc.gridx=1;
gbc.gridy=3;
gbc.anchor = GridBagConstraints.EAST;
gbc.fill = GridBagConstraints.BOTH;
gbc.gridwidth = 9;
gbc.gridheight = 1;
gbc.weightx = 0;
gbc.weighty = 0;
gb1.setConstraints(t13, gbc);
gbc.gridx=11;
gbc.gridy=3;
gbc.anchor = GridBagConstraints.WEST;
gbc.fill = GridBagConstraints.NONE;
gbc.gridwidth = 1;
gbc.gridheight = 1;
gbc.weightx = 0;
gbc.weighty = 0;
gb1.setConstraints(b13, gbc);
//第五行
gbc.gridx=0;
gbc.gridy=4;
gbc.anchor = GridBagConstraints.EAST;
gbc.fill = GridBagConstraints.BOTH;
gbc.gridwidth = 1;
gbc.gridheight = 1;
gbc.weightx = 0;
gbc.weighty = 0;
gb1.setConstraints(l15, gbc);
gbc.gridx=1;
gbc.gridy=4;
gbc.anchor = GridBagConstraints.EAST;
gbc.fill = GridBagConstraints.BOTH;
gbc.gridwidth = 9;
gbc.gridheight = 1;
gbc.weightx = 0;
gbc.weighty = 0;
gb1.setConstraints(t14, gbc);
gbc.gridx=11;
gbc.gridy=4;
gbc.anchor = GridBagConstraints.WEST;
gbc.fill = GridBagConstraints.NONE;
gbc.gridwidth = 1;
gbc.gridheight = 1;
gbc.weightx = 0;
gbc.weighty = 0;
gb1.setConstraints(b14, gbc);
gbc.gridx=4;
gbc.gridy=7;
gbc.anchor = GridBagConstraints.CENTER;
gbc.fill = GridBagConstraints.NONE;
gbc.gridwidth = 2;
gbc.gridheight = 1;
gbc.weightx = 0;
gbc.weighty = 0;
gb1.setConstraints(b15, gbc);
//解密
g2=new CheckboxGroup();
c21=new Checkbox("128",g2,true);
c22=new Checkbox("192",g2,false);
c23=new Checkbox("256",g2,false);
b23=new Button("选择文件");
b24=new Button("选择路径");
b25=new Button("解密");
b23.addActionListener(this);
b24.addActionListener(this);
b25.addActionListener(this);
l21=new Label("密钥位数:");
l22=new Label("会话密钥:");
l23=new Label("随机向量:");
l24=new Label("密文文件:");
l25=new Label("明文文件路径:");
t21=new TextField(66);
t22=new TextField(66);
t23=new TextField(34);
t24=new TextField(34);
panel2.add(l21);
panel2.add(c21);
panel2.add(c22);
panel2.add(c23);
panel2.add(l22);
panel2.add(t21);
panel2.add(l23);
panel2.add(t22);
panel2.add(l24);
panel2.add(t23);
panel2.add(b23);
panel2.add(l25);
panel2.add(t24);
panel2.add(b24);
panel2.add(b25);
GridBagLayout gb2 = new GridBagLayout();
panel2