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

📄 aes.java

📁 AES加密软件。java实现。可以加密
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
import java.io.*;
public class AES {
	//static char[][] Result ;
	static char[][] lun = new char[10][];
	static int Long;    //用于记录明文的长度
	static char[][]w = new char[44][8];             //extended keys
	static int jiemi = 0; //默认为加密状态
	static String ff = "";
	static String [][] s ={{"63","7C","77","7B","F2","6B","6F","C5","30","01","67","2B","FE","D7","AB","76"},
		                   {"CA","82","C9","7D","FA","59","47","F0","AD","D4","A2","AF","9C","A4","72","C0"},
		                   {"B7","FD","93","26","36","3F","F7","CC","34","A5","E5","F1","71","D8","31","15"},
		                   {"04","C7","23","C3","18","96","05","9A","07","12","80","E2","EB","27","B2","75"},
		                   {"09","83","2C","1A","1B","6E","5A","A0","52","3B","D6","B3","29","E3","2F","84"},
		                   {"53","D1","00","ED","20","FC","B1","5B","6A","CB","BE","39","4A","4C","58","CF"},
		                   {"D0","EF","AA","FB","43","4D","33","85","45","F9","02","7F","50","3C","9F","A8"},
		                   {"51","A3","40","8F","92","9D","38","F5","BC","B6","DA","21","10","FF","F3","D2"},
		                   {"CD","0C","13","EC","5F","97","44","17","C4","A7","7E","3D","64","5D","19","73"},
		                   {"60","81","4F","DC","22","2A","90","88","46","EE","B8","14","DE","5E","0B","DB"},
		                   {"E0","32","3A","0A","49","06","24","5C","C2","D3","AC","62","91","95","E4","79"},
		                   {"E7","C8","37","6D","8D","D5","4E","A9","6C","56","F4","EA","65","7A","AE","08"},
		                   {"BA","78","25","2E","1C","A6","B4","C6","E8","DD","74","1F","4B","BD","8B","8A"},
		                   {"70","3E","B5","66","48","03","F6","0E","61","35","57","B9","86","C1","1D","9E"},
		                   {"E1","F8","98","11","69","D9","8E","94","9B","1E","87","E9","CE","55","28","DF"},
		                   {"8C","A1","89","0D","BF","E6","42","68","41","99","2D","0F","B0","54","BB","16"}
	};
	static String [][] nis = {{"52","09","6A","D5","30","36","A5","38","BF","40","A3","9E","81","F3","D7","FB"},
		                      {"7C","E3","39","82","9B","2F","FF","87","34","8E","43","44","C4","DE","E9","CB"},
		                      {"54","7B","94","32","A6","C2","23","3D","EE","4C","95","0B","42","FA","C3","4E"},
		                      {"08","2E","A1","66","28","D9","24","B2","76","5B","A2","49","6D","8B","D1","25"},
		                      {"72","F8","F6","64","86","68","98","16","D4","A4","5C","CC","5D","65","B6","92"},
		                      {"6C","70","48","50","FD","ED","B9","DA","5E","15","46","57","A7","8D","9D","84"},
		                      {"90","D8","AB","00","8C","BC","D3","0A","F7","E4","58","05","B8","B3","45","06"},
		                      {"D0","2C","1E","8F","CA","3F","0F","02","C1","AF","BD","03","01","13","8A","6B"},
		                      {"3A","91","11","41","4F","67","DC","EA","97","F2","CF","CE","F0","B4","E6","73"},
		                      {"96","AC","74","22","E7","AD","35","85","E2","F9","37","E8","1C","75","DF","6E"},
		                      {"47","F1","1A","71","1D","29","C5","89","6F","B7","62","0E","AA","18","BE","1B"},
		                      {"FC","56","3E","4B","C6","D2","79","20","9A","DB","C0","FE","78","CD","5A","F4"},
		                      {"1F","DD","A8","33","88","07","C7","31","B1","12","10","59","27","80","EC","5F"},
		                      {"60","51","7F","A9","19","B5","4A","0D","2D","E5","7A","9F","93","C9","9C","EF"},
		                      {"A0","E0","3B","4D","AE","2A","F5","B0","C8","EB","BB","3C","83","53","99","61"},
		                      {"17","2B","04","7E","BA","77","D6","26","E1","69","14","63","55","21","0C","7D"}
	};
	
    static char[][] Rcon = {{'0','1','0','0','0','0','0','0'},
    	                    {'0','2','0','0','0','0','0','0'},
    	                    {'0','4','0','0','0','0','0','0'},
    	                    {'0','8','0','0','0','0','0','0'},
    	                    {'1','0','0','0','0','0','0','0'},
    	                    {'2','0','0','0','0','0','0','0'},
    	                    {'4','0','0','0','0','0','0','0'},
    	                    {'8','0','0','0','0','0','0','0'},
    	                    {'1','B','0','0','0','0','0','0'},
    	                    {'3','6','0','0','0','0','0','0'}
    	
    };
	
    static char[][] State ;
    static int time = 0;              //记录这是第几轮
    static void run(String cfile,String kfile)
    {
    	
    	extendkeys(kfile);
    	try{
    	encrypt(cfile);
    	}catch(IOException e){
    		System.exit(1);
    		
    	}
    }
    
    static void jiemi(String jfile,String kfile)
    {
    	time = 0;
    	jiemi=1;
    	try{
    		extendkeys(kfile);
        	readcode(jfile);
        	xorkey();
        	for(time = 1;time<10;time++)
        	{
        		linechange();
        		subcode();
        		xorkey();
        		rowchange();
        		writeResults();
        	}
        	linechange();
    		subcode();
    		xorkey();
    		/*if(time==10){
           		for(int i=0;i<State.length;i++)
           		{
           			for(int jj=0;jj<State[i].length;jj++)
           				System.out.print(State[i][jj]);
           		}
               	System.out.println();
           	}*/
    		writeResults();
    	}catch(IOException e){
    		System.exit(1);
    	}
    }
	//--------------------------------------- extend keys section -------------------------------------------
    static void extendkeys(String kfile)
    {
    	String skey = new String();
    	String byt;
    	char tempkey[] = new char[32];
    	int i = 0;
    	
    	//read key(128bits)
    	FileInputStream fStream = null;
    	try{
    		fStream = new FileInputStream(kfile);
    	}catch(FileNotFoundException fnfe){
    		System.exit(1);
    	}
    	try{
    		while(fStream.available()>0)
    		{
    			byt = (Integer.toHexString(fStream.read())).toUpperCase();
    			if(byt.length()==1)
    				byt = "0"+byt;
    			skey+=byt;
    		}
    	}catch(IOException ioe){}finally{
    		try{
    			if(fStream!=null)
    		        fStream.close();
    		}catch(IOException ioe){};
    	}
    	tempkey = skey.toCharArray();
    	//extends key
    	for(i=0;i<4;i++)   //w0,w1,w2,w3
    	{
    		for(int j=0;j<8;j++)
    			w[i][j]=tempkey[i*8+j];
    	}
 
        char temp[] = new char[8];
    	for(i=4;i<44;i++)   //w4...w43
    	{
    		temp = w[i-1].clone();
    		if(i%4==0)
    		{
    			temp = g(temp,i/4);
    		}
    		w[i] = xor(w[i-4].clone(),temp);
    	}
    	if(jiemi==1)
    	{
    		int j=40;
    		char[][]ww = w.clone();
    		for(i=0;i<44;i+=4)
    		{
    			for(int k=0;k<4;k++,j++)
    			   w[i+k] = ww[j];
    			j = j-8;
    		}
    	}
    }
    
    static char[] xor(char[]cchar,char[] dchar)//两个字符数组(十六进制数)的异或
    {
    	int [] ch = new int[cchar.length];
    	int [] dh = new int[dchar.length];          //十进制数组
    	int [] chInt = new int[ch.length*4];        //二进制数组
    	int [] dhInt = new int[dh.length*4];
    	int i;
    	for( i=0;i<cchar.length;i++)
		{
				if(cchar[i]>='0'&&cchar[i]<='9')
					ch[i]=cchar[i]-'0';
				else if(cchar[i]>='A'&&cchar[i]<='F')
					ch[i]=cchar[i]-'A'+10;
				
				if(dchar[i]>='0'&&dchar[i]<='9')
					dh[i]=dchar[i]-'0';
				else if(dchar[i]>='A'&&dchar[i]<='F')
					dh[i]=dchar[i]-'A'+10;
		}
    	int indexlast = 3;                    //3是第一组四位二进制最后一位的下标
    	int index;
		for( i=0;i<ch.length;i++){
			index=indexlast;     //index是ch[],dh[]的下标
			for(int j=0;j<4;j++){
				chInt[index]=ch[i]%2;
				ch[i]=ch[i]/2;
				
				dhInt[index]=dh[i]%2;
				dh[i]=dh[i]/2;
			    if(chInt[index]==dhInt[index])
			    	chInt[index]=0;            //把异或的结果存到chInt[]
			    else
			    	chInt[index]=1;
				index--;
			}
			indexlast+=4;
		}
		int temp = 0;
		int j;
		for( i=0,j=0;i<chInt.length;i++){
			temp = temp*2+chInt[i];
			if((i+1)%4==0)
			{
				if(temp<10)
					cchar[j] = (char)(temp+'0');
				else
					cchar[j] = (char)('A'+temp-10);
				j++;
				temp = 0;
			}
		}
    	return cchar;
    }
    
    static char[] g(char[] ch,int num)
    {
    	int i;
    	//左移一个字节
    	char a=ch[0],b=ch[1];
    	for(i=0;i<ch.length-2;i++)
    		ch[i] = ch[i+2];
    	ch[ch.length-2] = a;
    	ch[ch.length-1] = b; 
    	//S盒字节代换
    	ch = subword(ch,s);
    	//xor Rcon[j]
    	ch = xor(ch,Rcon[num-1]);
    	return ch;
    }
    
    static char[] subword(char[] ch,String[][]yy)                //字节代换函数
    {
    	String[][] clone =  yy.clone();
    	String temp = "";
    	int a = 0,b = 0;                      //记录行和列
    	for(int i=0;i<ch.length/2;i++)          //每两位十六进制查一次 S BOX
    	{
    		if(ch[2*i]>='0'&&ch[2*i]<='9')
    			a = ch[2*i]-'0';
    		else a = ch[2*i]-'A'+10;
    		if(ch[2*i+1]>='0'&&ch[2*i+1]<='9')
    			b = ch[2*i+1]-'0';
    		else b = ch[2*i+1]-'A'+10;
    		temp += clone[a][b];

    	}
    	ch = temp.toCharArray();
    	return ch;
    }

    //--------------------------------------- code section --------------------------------------------------
    static void encrypt(String cfile)throws IOException   //加密函数
    {
    	jiemi=0;
    	time = 0;
    	readcode(cfile);
    	/*if(time==0){
    		for(int i=0;i<State.length;i++)
    		{
    			for(int j=0;j<State[i].length;j++)
    				System.out.print(State[i][j]);
    		}
        	System.out.println();
    	}*/
    	xorkey();
    	for(time = 1;time<10;time++)
    	{
    	subcode();
    	linechange();
    	
    	rowchange();
    	xorkey();
    	writeResults();
    	}
    	subcode();
    	linechange();
    	xorkey();
    	writeResults();
    }

    static void readcode(String cfile)throws IOException
    {
    	//读取数据,并以128位分组
    	String scode = new String();
    	String byt;
    	char tempcode[];
    	int i = 0;
    	int num = 0;
    	//read codes
    	FileInputStream fStream = null;
    	try{
    		fStream = new FileInputStream(cfile);
    	}catch(FileNotFoundException fnfe){
    		System.exit(1);
    	}
    	try{
    		while(fStream.available()>0)
    		{
    			byt = (Integer.toHexString(fStream.read())).toUpperCase();
    			if(byt.length()==1)
    				byt = "0"+byt;
    			scode+=byt;
    		}
    	}catch(IOException ioe){}finally{
    		try{
    			if(fStream!=null)
    		        fStream.close();
    		}catch(IOException ioe){};
    	}
    	tempcode = scode.toCharArray();
    	num = tempcode.length/32;
    	if(tempcode.length%32!=0)
    		num++;
    	State = new char[num][32];   //初始化明文/密文数组大小
    	
    	//Long = tempcode.length/2;     
    	//Result = new char[11][Long];  //用于入置每轮运算的结果
    	
    	num = 0; //记录第几组128位(32位十六进制)
    	for(int j=0;j<tempcode.length ;j++)
    	{
    			if(i==32)
    			{
    				num++;
    				i = 0;
    			}
    			State[num][i] = tempcode[j];
    			i++;
    	}
    	
    	while(i!=32)
    	{
    		State[num][i] = '0';
    		i++;
    	}
    }

    static void xorkey()             //轮密钥加
    {
    	int i;
    	char[]temp = new char[32];
    	for(i=0;i<8;i++)
    		temp[i] = w[time*4][i];
    	for(i=0;i<8;i++)
    		temp[i+8] = w[time*4+1][i];
    	for(i=0;i<8;i++)
    		temp[i+16] = w[time*4+2][i];
    	for(i=0;i<8;i++)
        		temp[i+24] = w[time*4+3][i];
    	char[] tempclone = temp.clone();
    	for( i = 0;i<State.length;i++)
    	{
    		State[i] = xor(State[i].clone(),tempclone);
    		tempclone = temp.clone();
    	}
    	temp = null;
    }
    
    static void subcode()       //字节代换
    {
    	if(jiemi==0)
    	{
    		for(int i=0;i<State.length;i++)
        	{
        		State[i] = subword(State[i],s);
        	}
    	}
    		else if(jiemi==1)
    		{

⌨️ 快捷键说明

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