欢迎访问悦橙教程(wld5.com),关注java教程。悦橙教程  java问答|  每日更新
页面导航 : > > 文章正文

实现android的AES加密技术,androidaes加密,密码学中的高级加密标准(

来源: javaer 分享于  点击 17868 次 点评:286

实现android的AES加密技术,androidaes加密,密码学中的高级加密标准(


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

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

AddRoundKey — 矩阵中的每一个字节都与该次循环的子密钥(round key)做XOR运算;每个子密钥由密钥生成方案产生。

SubBytes — 透过一个非线性的替换函数,用查找表的方式把每个字节替换成对应的字节。

ShiftRows — 将矩阵中的每个横列进行循环式移位。

MixColumns — 为了充分混合矩阵中各个直行的操作。这个步骤使用线性转换来混合每行内的四个字节。

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

import java.security.SecureRandom;   import javax.crypto.Cipher;   import javax.crypto.KeyGenerator;   import javax.crypto.SecretKey;   import javax.crypto.spec.SecretKeySpec;   public class SimpleCrypto {       public static String encrypt(String seed, String cleartext) throws Exception {           byte[] rawKey = getRawKey(seed.getBytes());           byte[] result = encrypt(rawKey, cleartext.getBytes());           return toHex(result);       }       public static String decrypt(String seed, String encrypted) throws Exception {           byte[] rawKey = getRawKey(seed.getBytes());           byte[] enc = toByte(encrypted);           byte[] result = decrypt(rawKey, enc);           return new String(result);       }       private static byte[] getRawKey(byte[] seed) throws Exception {           KeyGenerator kgen = KeyGenerator.getInstance("AES");           SecureRandom sr = SecureRandom.getInstance("SHA1PRNG");           sr.setSeed(seed);           kgen.init(128, sr); // 192 and 256 bits may not be available           SecretKey skey = kgen.generateKey();           byte[] raw = skey.getEncoded();           return raw;       }       private static byte[] encrypt(byte[] raw, byte[] clear) throws Exception {           SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");           Cipher cipher = Cipher.getInstance("AES");           cipher.init(Cipher.ENCRYPT_MODE, skeySpec);           byte[] encrypted = cipher.doFinal(clear);           return encrypted;       }       private static byte[] decrypt(byte[] raw, byte[] encrypted) throws Exception {           SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");           Cipher cipher = Cipher.getInstance("AES");           cipher.init(Cipher.DECRYPT_MODE, skeySpec);           byte[] decrypted = cipher.doFinal(encrypted);           return decrypted;       }       public static String toHex(String txt) {           return toHex(txt.getBytes());       }       public static String fromHex(String hex) {           return new String(toByte(hex));       }       public static byte[] toByte(String hexString) {           int len = hexString.length()/2;           byte[] result = new byte[len];           for (int i = 0; i < len; i++)               result[i] = Integer.valueOf(hexString.substring(2*i, 2*i+2), 16).bytue();           return result;       }       public static String toHex(byte[] buf) {           if (buf == null)               return "";           StringBuffer result = new StringBuffer(2*buf.length);           for (int i = 0; i < buf.length; i++) {               appendHex(result, buf[i]);           }           return result.toString();       }       private final static String HEX = "0123456789ABCDEF";       private static void appendHex(StringBuffer sb, byte b) {           sb.append(HEX.charAt((b>>4)&0x0f)).append(HEX.charAt(b&0x0f));       }   } //-------------------------//加密:String encryptingCode = SimpleCrypto.encrypt(masterPassword,originalText);//解密:String originalText = SimpleCrypto.decrypt(masterpassword, encryptingCode);//该片段来自于http://byrx.net
相关栏目:

用户点评