AES算法实现_加密 JAVA

AES算法实现_加密 JAVA128位版

项目下载:http://download.youkuaiyun.com/detail/l799069596/9378764

package scr;

/**
 * AES加密核心算法
 * @author laisixiang
 *
 */

public class Encrypt {
	public static int[][] step1(int[][] org,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]=org[i][j]^KeyExtend.realKey(n)[i][j];
			}
		}
		return out;
	}
	
	public static int[][] step2(int[][] org){//字节替代
		int out[][] = new int[4][4];
		for(int i=0;i<4;i++){
			for(int j=0;j<4;j++){
				out[i][j]=Configrations.S[org[i][j]>>>4][org[i][j]-((org[i][j]>>>4)<<4)];
			}
		}
		return out;

	}
	
	public static int[][] step3(int[][] org){//行移位
		int out[][] = new int[4][4];
		for(int i=0;i<4;i++){
			for(int j=0;j<4;j++){
				out[i][j]=org[i][(j+i)%4];
			}
		}
		return out;
	}
	
	public static int[][] step4(int[][] org){//列混淆
		int out[][] = new int[4][4];
		for(int i=0;i<4;i++){
			for(int j=0;j<4;j++){
				out[i][j]=myMultiply(Configrations.key2[i][0], org[0][j]);
				for(int z=1;z<4;z++){
					out[i][j]^=myMultiply(Configrations.key2[i][z],org[z][j]);
				}
			}
		}
		return out;
	}
	
	public static int myMultiply(int a,int b){//列混淆时用的,在mod下的矩阵间乘法
		int back=0;
		int position=0;
		while(a!=0){
			if(a%2==1){
				back=(b<<position)^back;
			}
			position+=1;
			a=a>>>1;
		}
		
		while(back/256>=1){
			back=(Configrations.myMod<<((back/256)-1))^back;
		}
		return back;
	}
	
	public static int[][] encrypt(int[][] org){//加密
		int time=0;
		int temp[][]= new int[4][4];
		temp=step1(org,time);
		for(int i=0;i<9;i++){
			time=+1;
			temp=step1(step4(step3(step2(temp))),time);
		}
		return step1(step3(step2(temp)),time);
	}
}


package scr;
/**
 * 秘钥扩展
 * @author laisixiang
 *
 */
public class KeyExtend {
	public static int[] transform_32byteToFourWord(int[][] org){//矩阵转变为4个字,纵向
		int temp[] = new int[4];
		for(int i=0;i<4;i++){
			for(int j=0;j<4;j++){
				temp[i]+=(org[j][i]<<(8*(3-j)));
			}
		}
		return temp;
	}
	
	public static int g(int org,int n){//G函数
		int temp[] = new int[4];
		//把一个字转化为4个字节
		temp[0]=org>>>24;
		for(int i=1;i<4;i++){
			temp[i]=(org>>>(8*(3-i)))-((org>>>(8*(4-i)))<<8);
		}
		//字循环
		int temp_int=temp[0];
		for(int i=0;i<3;i++){
			temp[i]=temp[i+1];
		}
		temp[3]=temp_int;
		//字节替代
		for(int i=0;i<4;i++){
			temp[i]=Configrations.S[temp[i]>>>4][temp[i]-((temp[i]>>>4)<<4)];
		}
		//Rcon生成
		int rcon=1;
		for(int i=1;i<n;i++){
			rcon=myMultiply(2, rcon);
		}
		//与Rcon异或
		temp[0]^=rcon;
		//把4个字节转化为一个数
		int out=0;
		for(int i=0;i<4;i++){
			out+=temp[i]<<(8*(3-i));
		}

		return out;
	}
	
	public static int[] createKeyInFourWord(int n){//密匙扩展的规则
		int org[] = new int[4];
		int out[] = new int[4];
		org=transform_32byteToFourWord(Configrations.key);

		if(n!=0){
			for(int i=1;i<=n;i++){
				for(int j=0;j<4;j++){
					if(j==0){
						out[j]=org[j]^(g(org[3], i));
					}else{
						out[j]=org[j]^out[j-1];
					}
				}
				org=out;
			}
		}else{
			return org;
		}
		return out;
	}
	
	public static int[][] realKey(int n){//把一维数组转为二维数组,恢复
		int in[] = new int[4];
		in=createKeyInFourWord(n);
		int out[][] = new int[4][4];
		for(int i=0;i<4;i++){
			out[0][i]=in[i]>>>24;
			for(int j=1;j<4;j++){
				out[j][i] = (in[i]>>(8*(3-j)))-(in[i]>>(8*(4-j))<<8);
			}
		}
		return out;
	}
	
	public static int myRcon_before(int n){//求Rcon(n)的核心函数,用回调
		if(n==1)
			return 1;
		return (myMultiply(2, myRcon_before(n-1)));
	}
	public static int myRcon(int n){//求Rcon(n)
		return myRcon_before(n)<<24;
	}
	
	public static int myMultiply(int a,int b){//列混淆时用的,在mod下的矩阵间乘法
		int back=0;
		int position=0;
		while(a!=0){
			if(a%2==1){
				back=(b<<position)^back;
			}
			position+=1;
			a=a>>>1;
		}
		
		while(back/256>=1){
			back=(Configrations.myMod<<((back/256)-1))^back;
		}
		return back;
	}
}




package scr;
/**
 * 各个参数
 * @author laisixiang
 *
 */
public class Configrations {
	public final static int msg[][] = {//原文128位
		{0x0,0x4,0x8,0xC},
		{0x1,0x5,0x9,0xD},
		{0x2,0x6,0xA,0xE},
		{0x3,0x7,0xB,0xF}};

	public final static int key[][] = {//密匙128位
		{0x1,0x1,0x1,0x1},
		{0x1,0x1,0x1,0x1},
		{0x1,0x1,0x1,0x1},
		{0x1,0x1,0x1,0x1}};
	
//	//验证密匙扩展算法的时候用
//	public final static int key[][] = {//密匙128位
//		{0x0f,0x47,0x0C,0xAF},
//		{0x15,0xD9,0xB7,0x7F},
//		{0x71,0xe8,0xad,0x67},
//		{0xC9,0x59,0xD6,0x98}};

	public final static int key2[][] = {//列混淆时用的矩阵
		{0x2,0x3,0x1,0x1},
		{0x1,0x2,0x3,0x1},
		{0x1,0x1,0x2,0x3},
		{0x3,0x1,0x1,0x2}};

	public final static int myMod=283;//列混淆里的Mod

	public final static int S[][] = {//正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,0XF7,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},
	};
	
	
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值