Java AES加解密(128/192/256位密钥)

做大作业写的,仅供学习参考,加密速度只有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
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值