Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2091233
  • 博文数量: 413
  • 博客积分: 10926
  • 博客等级: 上将
  • 技术积分: 3862
  • 用 户 组: 普通用户
  • 注册时间: 2006-01-09 18:14
文章分类

全部博文(413)

文章存档

2015年(5)

2014年(1)

2013年(5)

2012年(6)

2011年(138)

2010年(85)

2009年(42)

2008年(46)

2007年(26)

2006年(59)

分类:

2011-05-19 10:52:32

密码学中的高级加密标准(Advanced Encryption Standard,AES),又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院 (NIST)于2001年11月26日发布于FIPS PUB 197,并在2002年5月26日成为有效的标准。2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一。该算法为比利时密码学家Joan Daemen和Vincent Rijmen所设计,结合两位作者的名字,以Rijdael之命名之,投稿高级加密标准的甄选流程(Rijdael的发音近于 “Rhine doll”)。

AES 加密过程是在一个4×4的字节矩阵上运作,这个矩阵又称为“体(state)”,其初值就是一个明文区块(矩阵中一个元素大小就是明文区块中的一个 Byte)。(Rijndael加密法因支援更大的区块,其矩阵行数可视情况增加)加密时,各轮AES加密循环(除最后一轮外)均包含4个步骤:

1. AddRoundKey — 矩阵中的每一个字节都与该次循环的子密钥(round key)做XOR运算;每个子密钥由密钥生成方案产生。
2. SubBytes — 透过一个非线性的替换函数,用查找表的方式把每个字节替换成对应的字节。
3. ShiftRows — 将矩阵中的每个横列进行循环式移位。
4. MixColumns — 为了充分混合矩阵中各个直行的操作。这个步骤使用线性转换来混合每行内的四个字节。

最后一个加密循环中省略MixColumns步骤,而以另一个AddRoundKey取代。

实现android的AES加密技术

java类文件:

  1. import java.security.SecureRandom;   
  2.   
  3. import javax.crypto.Cipher;   
  4. import javax.crypto.KeyGenerator;   
  5. import javax.crypto.SecretKey;   
  6. import javax.crypto.spec.SecretKeySpec;   
  7.   
  8.   
  9. public class SimpleCrypto {   
  10.   
  11.     public static String encrypt(String seed, String cleartext) throws Exception {   
  12.         byte[] rawKey getRawKey(seed.getBytes());   
  13.         byte[] result encrypt(rawKey, cleartext.getBytes());   
  14.         return toHex(result);   
  15.     }   
  16.        
  17.     public static String decrypt(String seed, String encrypted) throws Exception {   
  18.         byte[] rawKey getRawKey(seed.getBytes());   
  19.         byte[] enc toByte(encrypted);   
  20.         byte[] result decrypt(rawKey, enc);   
  21.         return new String(result);   
  22.     }   
  23.   
  24.     private static byte[] getRawKey(byte[] seed) throws Exception {   
  25.         KeyGenerator kgen KeyGenerator.getInstance("AES");   
  26.         SecureRandom sr SecureRandom.getInstance("SHA1PRNG");   
  27.         sr.setSeed(seed);   
  28.         kgen.init(128sr); // 192 and 256 bits may not be available   
  29.         SecretKey skey kgen.generateKey();   
  30.         byte[] raw skey.getEncoded();   
  31.         return raw;   
  32.     }   
  33.   
  34.        
  35.     private static byte[] encrypt(byte[] raw, byte[] clear) throws Exception {   
  36.         SecretKeySpec skeySpec new SecretKeySpec(raw, "AES");   
  37.         Cipher cipher Cipher.getInstance("AES");   
  38.         cipher.init(Cipher.ENCRYPT_MODE, skeySpec);   
  39.         byte[] encrypted cipher.doFinal(clear);   
  40.         return encrypted;   
  41.     }   
  42.   
  43.     private static byte[] decrypt(byte[] raw, byte[] encrypted) throws Exception {   
  44.         SecretKeySpec skeySpec new SecretKeySpec(raw, "AES");   
  45.         Cipher cipher Cipher.getInstance("AES");   
  46.         cipher.init(Cipher.DECRYPT_MODE, skeySpec);   
  47.         byte[] decrypted cipher.doFinal(encrypted);   
  48.         return decrypted;   
  49.     }   
  50.   
  51.     public static String toHex(String txt) {   
  52.         return toHex(txt.getBytes());   
  53.     }   
  54.     public static String fromHex(String hex) {   
  55.         return new String(toByte(hex));   
  56.     }   
  57.        
  58.     public static byte[] toByte(String hexString) {   
  59.         int len hexString.length()/2;   
  60.         byte[] result new byte[len];   
  61.         for (int 0len; i++)   
  62.             result[i] Integer.valueOf(hexString.substring(2*i, 2*i+2), 16).bytue();   
  63.         return result;   
  64.     }   
  65.   
  66.     public static String toHex(byte[] buf) {   
  67.         if (buf == null)   
  68.             return "";   
  69.         StringBuffer result new StringBuffer(2*buf.length);   
  70.         for (int 0buf.length; i++) {   
  71.             appendHex(result, buf[i]);   
  72.         }   
  73.         return result.toString();   
  74.     }  
阅读(2233) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~