AES算法 Java实现

转载:http://blog.csdn.net/zfpigpig/article/details/8557364

java其实本身自带了Aes的实现。这里程序只是作为交流吧。有问题多多指正。

[java]  view plain copy
  1. public class AES {  
  2.     public static final byte[] sBox= {  
  3.         (byte)0x63,(byte)0x7c,(byte)0x77,(byte)0x7b,(byte)0xf2,(byte)0x6b,(byte)0x6f,(byte)0xc5,  
  4.         (byte)0x30,(byte)0x01,(byte)0x67,(byte)0x2b,(byte)0xfe,(byte)0xd7,(byte)0xab,(byte)0x76,  
  5.         (byte)0xca,(byte)0x82,(byte)0xc9,(byte)0x7d,(byte)0xfa,(byte)0x59,(byte)0x47,(byte)0xf0,  
  6.         (byte)0xad,(byte)0xd4,(byte)0xa2,(byte)0xaf,(byte)0x9c,(byte)0xa4,(byte)0x72,(byte)0xc0,  
  7.         (byte)0xb7,(byte)0xfd,(byte)0x93,(byte)0x26,(byte)0x36,(byte)0x3f,(byte)0xf7,(byte)0xcc,  
  8.         (byte)0x34,(byte)0xa5,(byte)0xe5,(byte)0xf1,(byte)0x71,(byte)0xd8,(byte)0x31,(byte)0x15,  
  9.         (byte)0x04,(byte)0xc7,(byte)0x23,(byte)0xc3,(byte)0x18,(byte)0x96,(byte)0x05,(byte)0x9a,  
  10.         (byte)0x07,(byte)0x12,(byte)0x80,(byte)0xe2,(byte)0xeb,(byte)0x27,(byte)0xb2,(byte)0x75,  
  11.         (byte)0x09,(byte)0x83,(byte)0x2c,(byte)0x1a,(byte)0x1b,(byte)0x6e,(byte)0x5a,(byte)0xa0,  
  12.         (byte)0x52,(byte)0x3b,(byte)0xd6,(byte)0xb3,(byte)0x29,(byte)0xe3,(byte)0x2f,(byte)0x84,  
  13.         (byte)0x53,(byte)0xd1,(byte)0x00,(byte)0xed,(byte)0x20,(byte)0xfc,(byte)0xb1,(byte)0x5b,  
  14.         (byte)0x6a,(byte)0xcb,(byte)0xbe,(byte)0x39,(byte)0x4a,(byte)0x4c,(byte)0x58,(byte)0xcf,  
  15.         (byte)0xd0,(byte)0xef,(byte)0xaa,(byte)0xfb,(byte)0x43,(byte)0x4d,(byte)0x33,(byte)0x85,  
  16.         (byte)0x45,(byte)0xf9,(byte)0x02,(byte)0x7f,(byte)0x50,(byte)0x3c,(byte)0x9f,(byte)0xa8,  
  17.         (byte)0x51,(byte)0xa3,(byte)0x40,(byte)0x8f,(byte)0x92,(byte)0x9d,(byte)0x38,(byte)0xf5,  
  18.         (byte)0xbc,(byte)0xb6,(byte)0xda,(byte)0x21,(byte)0x10,(byte)0xff,(byte)0xf3,(byte)0xd2,  
  19.         (byte)0xcd,(byte)0x0c,(byte)0x13,(byte)0xec,(byte)0x5f,(byte)0x97,(byte)0x44,(byte)0x17,  
  20.         (byte)0xc4,(byte)0xa7,(byte)0x7e,(byte)0x3d,(byte)0x64,(byte)0x5d,(byte)0x19,(byte)0x73,  
  21.         (byte)0x60,(byte)0x81,(byte)0x4f,(byte)0xdc,(byte)0x22,(byte)0x2a,(byte)0x90,(byte)0x88,  
  22.         (byte)0x46,(byte)0xee,(byte)0xb8,(byte)0x14,(byte)0xde,(byte)0x5e,(byte)0x0b,(byte)0xdb,  
  23.         (byte)0xe0,(byte)0x32,(byte)0x3a,(byte)0x0a,(byte)0x49,(byte)0x06,(byte)0x24,(byte)0x5c,  
  24.         (byte)0xc2,(byte)0xd3,(byte)0xac,(byte)0x62,(byte)0x91,(byte)0x95,(byte)0xe4,(byte)0x79,  
  25.         (byte)0xe7,(byte)0xc8,(byte)0x37,(byte)0x6d,(byte)0x8d,(byte)0xd5,(byte)0x4e,(byte)0xa9,  
  26.         (byte)0x6c,(byte)0x56,(byte)0xf4,(byte)0xea,(byte)0x65,(byte)0x7a,(byte)0xae,(byte)0x08,  
  27.         (byte)0xba,(byte)0x78,(byte)0x25,(byte)0x2e,(byte)0x1c,(byte)0xa6,(byte)0xb4,(byte)0xc6,  
  28.         (byte)0xe8,(byte)0xdd,(byte)0x74,(byte)0x1f,(byte)0x4b,(byte)0xbd,(byte)0x8b,(byte)0x8a,  
  29.         (byte)0x70,(byte)0x3e,(byte)0xb5,(byte)0x66,(byte)0x48,(byte)0x03,(byte)0xf6,(byte)0x0e,  
  30.         (byte)0x61,(byte)0x35,(byte)0x57,(byte)0xb9,(byte)0x86,(byte)0xc1,(byte)0x1d,(byte)0x9e,  
  31.         (byte)0xe1,(byte)0xf8,(byte)0x98,(byte)0x11,(byte)0x69,(byte)0xd9,(byte)0x8e,(byte)0x94,  
  32.         (byte)0x9b,(byte)0x1e,(byte)0x87,(byte)0xe9,(byte)0xce,(byte)0x55,(byte)0x28,(byte)0xdf,  
  33.         (byte)0x8c,(byte)0xa1,(byte)0x89,(byte)0x0d,(byte)0xbf,(byte)0xe6,(byte)0x42,(byte)0x68,  
  34.         (byte)0x41,(byte)0x99,(byte)0x2d,(byte)0x0f,(byte)0xb0,(byte)0x54,(byte)0xbb,(byte)0x16  
  35.     };  
  36.       
  37.     public static byte[][] rCon ={  
  38.             {0x000x000x000x00},  
  39.             {0x010x000x000x00},  
  40.             {0x020x000x000x00},  
  41.             {0x040x000x000x00},  
  42.             {0x080x000x000x00},  
  43.             {0x100x000x000x00},  
  44.             {0x200x000x000x00},  
  45.             {0x400x000x000x00},  
  46.             {(byte)0x800x000x000x00},  
  47.             {0x1b0x000x000x00},  
  48.             {0x360x000x000x00}  
  49.     };  
  50.       
  51.     public static byte[] cipher(byte[] content, byte[][] w) {  
  52.         int nb = 4;  
  53.         int nr = w.length/nb - 1;   
  54.         byte[][] state = new byte[4][4];  
  55.         for (int i = 0; i < content.length; i++) {  
  56.             state[i%4][i/4] = content[i];  
  57.         }  
  58.         state = addRoundKey(state, w, 0);  
  59.           
  60.         for (int i = 1; i < nr; i++) {  
  61.             state = subBytes(state);  
  62.             state = shiftRows(state);  
  63.             state = mixColumns(state);  
  64.             state = addRoundKey(state, w, i);  
  65.         }  
  66.           
  67.         state = subBytes(state);  
  68.         state = shiftRows(state);  
  69.         state = addRoundKey(state, w, nr);  
  70.           
  71.         byte[] temp = new byte[16];  
  72.         for (int i = 0; i < temp.length; i++) {  
  73.             temp[i] = state[i%4][i/4];  
  74.         }  
  75.         return temp;  
  76.     }  
  77.       
  78.       
  79.     private static byte[][] subBytes(byte[][] state) {  
  80.         for(int x=0; x<4; x++) {  
  81.             for(int y=0; y<4; y++) {  
  82.                 state[x][y] = sBox[byte2Int(state[x][y])];  
  83.             }  
  84.         }  
  85.         return state;  
  86.     }  
  87.       
  88.     private static byte[][] shiftRows(byte[][] state) {  
  89.         byte[] temp = new byte[4];  
  90.         for(int x=1; x<4; x++) {  
  91.             for(int y=0; y<4; y++) {  
  92.                 temp[y] = state[x][(x+y)%4];  
  93.             }  
  94.             System.arraycopy(temp, 0, state[x], 04);  
  95.         }  
  96.         return state;  
  97.     }  
  98.       
  99.     private static byte[][] mixColumns(byte[][] state) {  
  100.         byte[] a = new byte[4];  
  101.         byte[] doublea = new byte[4];  
  102.         for(int y=0; y<4; y++) {  
  103.             for(int x=0; x<4; x++) {  
  104.                 a[x] = state[x][y];  
  105.                 doublea[x] = doubleByte(a[x]);  
  106.             }  
  107.             state[0][y] = (byte)(doublea[0]^doublea[1]^a[1]^a[2]^a[3]);// 2*a0 + 3*a1 + a2 + a3  
  108.             state[1][y] = (byte)(a[0]^doublea[1]^doublea[2]^a[2]^a[3]);// a0 * 2*a1 + 3*a2 + a3  
  109.             state[2][y] = (byte)(a[0]^a[1]^doublea[2]^doublea[3]^a[3]);// a0 + a1 + 2*a2 + 3*a3  
  110.             state[3][y] = (byte)(doublea[0]^a[0]^a[1]^a[2]^doublea[3]);// 3*a0 + a1 + a2 + 2*a3  
  111.         }  
  112.         return state;  
  113.     }  
  114.       
  115.     private static byte[][] addRoundKey(byte[][] state, byte[][] w, int rnd) {  
  116.         for(int x=0; x<4; x++) {  
  117.             for(int y=0; y<4; y++) {  
  118.                 state[x][y] ^= w[rnd*4+y][x];  
  119.             }  
  120.         }  
  121.         return state;  
  122.     }  
  123.       
  124.     public static byte[][] keyExpansion(byte[] key) {  
  125.         int nb = 4;   
  126.         int nk = key.length/4;//aes 128/192/256 - 4/6/8  
  127.         int nr = nk + 6;//aes 128/192/256 - 10/12/14  
  128.           
  129.         byte[][] w = new byte[nb*(nr +1)][4];  
  130.         for(int i=0; i<key.length; i++) {  
  131.             w[i/4][i%4] = key[i];  
  132.         }  
  133.         byte[] temp = new byte[4];  
  134.         for(int i=nk; i<(nb*(nr +1)); i++) {  
  135.             for(int j=0; j<4; j++) {  
  136.                 temp[j] = w[i-1][j];  
  137.             }  
  138.             if(i%nk == 0) {  
  139.                 temp = subWord(rotWord(temp));  
  140.                 for(int j=0; j<4; j++) {  
  141.                     temp[j] ^= rCon[i/nk][j];  
  142.                 }  
  143.             } else if (nk > 6 && i%nk == 4) {  
  144.                 temp = subWord(temp);  
  145.             }  
  146.             for(int j=0; j<4; j++) {  
  147.                 w[i][j] = (byte)(w[i-nk][j] ^ temp[j]);  
  148.             }  
  149.         }  
  150.         return w;  
  151.     }  
  152.       
  153.     private static byte[] rotWord(byte[] bytes) {  
  154.         byte b = bytes[0];  
  155.         for (int i = 0; i < 3; i++) {  
  156.             bytes[i] = bytes[i+1];  
  157.         }  
  158.         bytes[3] = b;  
  159.         return bytes;  
  160.     }  
  161.       
  162.     private static byte[] subWord(byte[] bytes) {  
  163.         for (int i = 0; i < bytes.length; i++) {  
  164.             bytes[i] = sBox[byte2Int(bytes[i])];  
  165.         }  
  166.         return bytes;  
  167.     }  
  168.       
  169.     private static byte doubleByte(byte b) {  
  170.         if(b < 0) {  
  171.             return (byte)((b << 1)^0x1b);  
  172.         } else {  
  173.             return (byte)(b << 1);  
  174.         }     
  175.     }  
  176.       
  177.     private static int byte2Int(byte b) {  
  178.         return (b & 0xff);  
  179.     }  
  180.       
  181.     public static void printState(byte[][] state) {  
  182.         for (int i = 0; i < 4; i++) {  
  183.             System.out.print("[");  
  184.             for (int j = 0; j < 4; j++) {  
  185.                 System.out.print(parseByte2HexStr(state[i][j]));  
  186.             }  
  187.             System.out.print("]");  
  188.         }  
  189.         System.out.println();  
  190.     }  
  191.       
  192.     public static void printW(byte[][] w) {  
  193.         for (int i = 0; i < w.length; i++) {  
  194.             System.out.print("[");  
  195.             for (int j = 0; j < 4; j++) {  
  196.                 System.out.print(parseByte2HexStr(w[i][j]));  
  197.             }  
  198.             System.out.print("]");  
  199.         }  
  200.         System.out.println();  
  201.     }  
  202.       
  203.     public static String parseByte2HexStr(byte buf) {  
  204.         StringBuffer sb = new StringBuffer();  
  205.         String hex = Integer.toHexString(buf & 0xFF);  
  206.         if (hex.length() == 1) {  
  207.             hex = '0' + hex;  
  208.         }  
  209.         sb.append(hex.toUpperCase());  
  210.         return sb.toString();  
  211.     }  
  212. }  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值