AES算法实现_加密 JAVA

来源:互联网 发布:apache默认网站目录 编辑:程序博客网 时间:2024/06/15 16:18

AES算法实现_加密 JAVA128位版

项目下载:http://download.csdn.net/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;//列混淆里的Modpublic 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},};}



0 0