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

📄 aes.java

📁 用java编写的AES加密解密程序,程序需要同目录下有key.dat作为加密解密密钥,输出密文cipher.dat,输出解密文件descrypt.dat
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
	public void S()//显示S盒
	{
		this.result_text.setText("");
		for(int i=0;i<16;i++)
		{
			for(int j=0;j<16;j++)
				this.result_text.append(Integer.toHexString(AES.S[i][j])+"\t");
			this.result_text.append("\n");
		}
	}
	
	public void S_r()//显示逆S盒
	{
		this.result_text.setText("");
		for(int i=0;i<16;i++)
		{
			for(int j=0;j<16;j++)
				this.result_text.append(Integer.toHexString(AES.S_r[i][j])+"\t");
			this.result_text.append("\n");
		}
	}
}
//About对话框实现
class AboutFrame extends JFrame
{
	JButton ok=new JButton ("确定");
	public AboutFrame()
	{
		super("关于");
		this.setSize(300,150);
		this.setLayout(new GridLayout(4,1));
		this.add(new JLabel("2004级计算机科学与技术(2)班"));
		this.add(new JLabel("作者: 李灿"));
		this.add(new JLabel("学号: 200433100216"));
		this.add(ok);
		
		ok.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e){dispose();}});
	}
}
//AES类,包括相关数据和操作
class AES
{
	static int S[][]=
	{
		{0x63,0x7c,0x77,0x7b,0xf2,0x6b,0x6f,0xc5,0x30,0x01,0x67,0x2b,0xfe,0xd7,0xab,0x76},
		{0xca,0x82,0xc9,0x7d,0xfa,0x59,0x47,0xf0,0xad,0xd4,0xa2,0xaf,0x9c,0xa4,0x72,0xc0},
		{0xb7,0xfd,0x93,0x26,0x36,0x3f,0xf7,0xcc,0x34,0xa5,0xe5,0xf1,0x71,0xd8,0x31,0x15},
		{0x04,0xc7,0x23,0xc3,0x18,0x96,0x05,0x9a,0x07,0x12,0x80,0xe2,0xeb,0x27,0xb2,0x75},
		{0x09,0x83,0x2c,0x1a,0x1b,0x6e,0x5a,0xa0,0x52,0x3b,0xd6,0xb3,0x29,0xe3,0x2f,0x84},
		{0x53,0xd1,0x00,0xed,0x20,0xfc,0xb1,0x5b,0x6a,0xcb,0xbe,0x39,0x4a,0x4c,0x58,0xcf},
		{0xd0,0xef,0xaa,0xfb,0x43,0x4d,0x33,0x85,0x45,0xf9,0x02,0x7f,0x50,0x3c,0x9f,0xa8},
		{0x51,0xa3,0x40,0x8f,0x92,0x9d,0x38,0xf5,0xbc,0xb6,0xda,0x21,0x10,0xff,0xf3,0xd2},
		{0xcd,0x0c,0x13,0xec,0x5f,0x97,0x44,0x17,0xc4,0xa7,0x7e,0x3d,0x64,0x5d,0x19,0x73},
		{0x60,0x81,0x4f,0xdc,0x22,0x2a,0x90,0x88,0x46,0xee,0xb8,0x14,0xde,0x5e,0x0b,0xdb},
		{0xe0,0x32,0x3a,0x0a,0x49,0x06,0x24,0x5c,0xc2,0xd3,0xac,0x62,0x91,0x95,0xe4,0x79},
		{0xe7,0xc8,0x37,0x6d,0x8d,0xd5,0x4e,0xa9,0x6c,0x56,0xf4,0xea,0x65,0x7a,0xae,0x08},
		{0xba,0x78,0x25,0x2e,0x1c,0xa6,0xb4,0xc6,0xe8,0xdd,0x74,0x1f,0x4b,0xbd,0x8b,0x8a},
		{0x70,0x3e,0xb5,0x66,0x48,0x03,0xf6,0x0e,0x61,0x35,0x57,0xb9,0x86,0xc1,0x1d,0x9e},
		{0xe1,0xf8,0x98,0x11,0x69,0xd9,0x8e,0x94,0x9b,0x1e,0x87,0xe9,0xce,0x55,0x28,0xdf},
		{0x8c,0xa1,0x89,0x0d,0xbf,0xe6,0x42,0x68,0x41,0x99,0x2d,0x0f,0xb0,0x54,0xbb,0x16}
	};
	static int S_r[][]=
	{
		{0x52,0x09,0x6a,0xd5,0x30,0x36,0xa5,0x38,0xbf,0x40,0xa3,0x9e,0x81,0xf3,0xd7,0xfb},
		{0x7c,0xe3,0x39,0x82,0x9b,0x2f,0xff,0x87,0x34,0x8e,0x43,0x44,0xc4,0xde,0xe9,0xcb},
		{0x54,0x7b,0x94,0x32,0xa6,0xc2,0x23,0x3d,0xee,0x4c,0x95,0x0b,0x42,0xfa,0xc3,0x4e},
		{0x08,0x2e,0xa1,0x66,0x28,0xd9,0x24,0xb2,0x76,0x5b,0xa2,0x49,0x6d,0x8b,0xd1,0x25},
		{0x72,0xf8,0xf6,0x64,0x86,0x68,0x98,0x16,0xd4,0xa4,0x5c,0xcc,0x5d,0x65,0xb6,0x92},
		{0x6c,0x70,0x48,0x50,0xfd,0xed,0xb9,0xda,0x5e,0x15,0x46,0x57,0xa7,0x8d,0x9d,0x84},
		{0x90,0xd8,0xab,0x00,0x8c,0xbc,0xd3,0x0a,0xf7,0xe4,0x58,0x05,0xb8,0xb3,0x45,0x06},
		{0xd0,0x2c,0x1e,0x8f,0xca,0x3f,0x0f,0x02,0xc1,0xaf,0xbd,0x03,0x01,0x13,0x8a,0x6b},
		{0x3a,0x91,0x11,0x41,0x4f,0x67,0xdc,0xea,0x97,0xf2,0xcf,0xce,0xf0,0xb4,0xe6,0x73},
		{0x96,0xac,0x74,0x22,0xe7,0xad,0x35,0x85,0xe2,0xf9,0x37,0xe8,0x1c,0x75,0xdf,0x6e},
		{0x47,0xf1,0x1a,0x71,0x1d,0x29,0xc5,0x89,0x6f,0xb7,0x62,0x0e,0xaa,0x18,0xbe,0x1b},
		{0xfc,0x56,0x3e,0x4b,0xc6,0xd2,0x79,0x20,0x9a,0xdb,0xc0,0xfe,0x78,0xcd,0x5a,0xf4},
		{0x1f,0xdd,0xa8,0x33,0x88,0x07,0xc7,0x31,0xb1,0x12,0x10,0x59,0x27,0x80,0xec,0x5f},
		{0x60,0x51,0x7f,0xa9,0x19,0xb5,0x4a,0x0d,0x2d,0xe5,0x7a,0x9f,0x93,0xc9,0x9c,0xef},
		{0xa0,0xe0,0x3b,0x4d,0xae,0x2a,0xf5,0xb0,0xc8,0xeb,0xbb,0x3c,0x83,0x53,0x99,0x61},
		{0x17,0x2b,0x04,0x7e,0xba,0x77,0xd6,0x26,0xe1,0x69,0x14,0x63,0x55,0x21,0x0c,0x7d}
	};
	static int RC[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x1b,0x36};
	public static int [][] SubBytes(int [][]in)//字节代换
	{
		int out[][]=new int [4][4];
		for(int i=0;i<4;i++)
			for(int j=0;j<4;j++)
				out[i][j]=S[in[i][j]/16][in[i][j]%16];
		return out;
	}
	public static int [][] InvSubBytes(int [][]in)//逆字节代换
	{
		int out[][]=new int [4][4];
		for(int i=0;i<4;i++)
			for(int j=0;j<4;j++)
				out[i][j]=S_r[in[i][j]/16][in[i][j]%16];
		return out;
	}
	public static int [][] ShiftRows(int [][]in)//行变换
	{
		int out[][]=new int [4][4];
		for(int i=0;i<4;i++)
			for(int j=0;j<4;j++)
				out[i][j]=in[i][(j+i)%4];
		return out;
	}
	public static int [][] InvShiftRows(int [][]in)//逆行变换
	{
		int out [][]=new int [4][4];
		for(int i=0;i<4;i++)
			for(int j=0;j<4;j++)
				out[i][j]=in[i][(j+i*3)%4];
		return out;
	}
	public static int [][] MixColumns(int [][]in)//列混淆
	{
		int temp[][]=
		{
			{2,3,1,1},
			{1,2,3,1},
			{1,1,2,3},
			{3,1,1,2}
		};
		int out[][]=new int [4][4];
		for(int i=0;i<4;i++)
			for(int j=0;j<4;j++)
				out[i][j]=GF(temp[i][0],in[0][j])^GF(temp[i][1],in[1][j])^GF(temp[i][2],in[2][j])^GF(temp[i][3],in[3][j]);
		return out;
	}
	public static int [][] InvMixColumns(int [][]in)//逆列混淆
	{
		int temp[][]=
		{
			{0x0e,0x0b,0x0d,0x09},
			{0x09,0x0e,0x0b,0x0d},
			{0x0d,0x09,0x0e,0x0b},
			{0x0b,0x0d,0x09,0x0e}
		};
		int out[][]=new int [4][4];
		for(int i=0;i<4;i++)
			for(int j=0;j<4;j++)
				out[i][j]=GF(temp[i][0],in[0][j])^GF(temp[i][1],in[1][j])^GF(temp[i][2],in[2][j])^GF(temp[i][3],in[3][j]);
		return out;
	}
	public static int [][] AddRoundKey(int [][]a,int [][]w,int n)//轮密钥加
	{
		int out[][]=new int [4][4];
		for(int i=0;i<4;i++)
			for(int j=0;j<4;j++)
				out[i][j]=a[i][j]^w[n*4+i][j];
		return out;
	}
	public static int [][] KeyExpansion(int [][]key,int [][]w)//密钥扩展
	{
		int temp[]=new int [4];
		for(int i=0;i<4;i++)
			for(int j=0;j<4;j++)
				w[i][j]=key[i][j];
		for(int i=4;i<44;i++)
		{
			for(int j=0;j<4;j++)
				temp[j]=w[i-1][j];
			if(i%4==0)
				temp=g(temp,i);
			for(int j=0;j<4;j++)
				w[i][j]=w[i-4][j]^temp[j];
		}
		return w;
	}
	public static int [] g(int []in,int k)
	{
		int temp=in[0];
		for(int i=0;i<3;i++)
			in[i]=in[i+1];
		in[3]=temp;
		int out[]=new int [4];
		for(int i=0;i<4;i++)
			out[i]=S[in[i]/16][in[i]%16];
		out[0]=out[0]^RC[k/4-1];
		return out;
	}
	public static int GF(int a,int b)//GF算法
	{
		int m=0;
		int temp[]=new int [8];
		temp[0]=b;
		for(int i=1;i<8;i++)
		{
			if(temp[i-1]>=0x80)
				temp[i]=(temp[i-1]<<1)%0x100^0x1b;
			else
				temp[i]=temp[i-1]<<1;
		}
		switch(a)
		{
			case 0x0e:m=temp[1]^temp[2]^temp[3];break;
			case 0x0b:m=temp[0]^temp[1]^temp[3];break;
			case 0x0d:m=temp[0]^temp[2]^temp[3];break;
			case 0x09:m=temp[0]^temp[3];break;
			case 0x02:m=temp[1];break;
			case 0x01:m=temp[0];break;
			case 0x03:m=temp[0]^temp[1];break;
		}
		return m;
	}
}
//打开文件窗口框架及操作
class OpenFrame extends JFrame
{
	JLabel inputlb=new JLabel("请输入文件路径",JLabel.CENTER);
	JLabel namelb=new JLabel("请输入文件名",JLabel.CENTER);
	JTextField pathstr=new JTextField(20);
	JTextField filestr=new JTextField(20);
	JButton ok=new JButton("确定");
	JPanel openpane=new JPanel();
	public OpenFrame()
	{
		super("打开源文件");
		this.setSize(400,150);
		openpane.setLayout(new GridBagLayout());
		GridBagConstraints c=new GridBagConstraints();
		c.fill=c.HORIZONTAL;
		c.insets=new Insets(4,4,4,4);
		
		c.gridx=0;c.gridy=0;c.gridwidth=1;c.gridheight=1;
		c.weightx=0.0;c.weighty=0.0;
		openpane.add(inputlb,c);
		
		c.gridx=0;c.gridy=1;c.gridwidth=1;c.gridheight=1;
		openpane.add(namelb,c);
		
		c.gridx=1;c.gridy=0;c.gridwidth=5;c.gridheight=1;
		c.weightx=c.weighty=1.0;
		openpane.add(pathstr,c);
		
		c.gridx=1;c.gridy=1;c.gridwidth=5;c.gridheight=1;
		openpane.add(filestr,c);
		
		c.gridx=5;c.gridy=2;c.gridwidth=1;c.gridheight=1;c.fill=c.HORIZONTAL;
		openpane.add(ok,c);
		
		ok.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e){OpenFile();}});
		
		this.add(openpane);
	}
	void OpenFile()
	{
		String path=pathstr.getText();
		String filename=filestr.getText();
		try
		{
			if(path.length()==0)
				path=System.getProperty("user.dir");//获取相对路径
			File f=new File(path,filename);
			AESframe.file=new FileInputStream(f);
			FileReader input=new FileReader(f);
			char []buffer=new char[4096];
			int len;
			Work.frame.aestext.setText("");
			while((len=input.read(buffer))!=-1)
			{
				String s=new String(buffer,0,len);
				Work.frame.aestext.append(s);
			}
		}
		catch(IOException ex){}
		finally
		{
			this.dispose();
		}
	}
}

⌨️ 快捷键说明

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