android之AES加密算法

AES加密算法:高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。
AESUtils类常量简介:
private final static String HEX = "0123456789ABCDEF";
private static final String CBC_PKCS5_PADDING="AES/CBC/PKCS5Padding";//AES是加密方式 CBC是工作模式 PKCS5Padding是填充模式
private static final String AES ="AES";//AES 加密
private static final String SHA1PRNG="SHA1PRNG";// SHA1PRNG 强随机种子算法, 要区别4.2以上版本的调用方法

如何随机生成key?
/*
 *生成随机数,可以当做动态的密钥 加密和解密的密钥必须一致,不然将不能解密
*/public static String generateKey() {
              try {
                        SecureRandom localSecureRandom = SecureRandom.getInstance(SHA1PRNG);
                        byte[] bytes_key =newbyte[20];
                        localSecureRandom.nextBytes(bytes_key);
                        String str_key = toHex(bytes_key);
                         return str_key;
                     } catch (Exception e) {
                        e.printStackTrace();
                      }
                return null;
    }

AES密钥处理:
// 对密钥进行处理
private static byte[] getRawKey(byte[] seed)throws Exception {
            KeyGenerator kgen = KeyGenerator.getInstance(AES);
            //for androidSecureRandom sr =null;
            // 在4.2以上版本中,SecureRandom获取方式发生了改变        
            if(android.os.Build.VERSION.SDK_INT >= 17) {
                     sr = SecureRandom.getInstance(SHA1PRNG, "Crypto");
             } else {
                     sr = SecureRandom.getInstance(SHA1PRNG);
             }
             // for Java
             // secureRandom = SecureRandom.getInstance(SHA1PRNG);       
                sr.setSeed(seed);
                kgen.init(128, sr);//256 bits or 128 bits,192bits
             //AES中128位密钥版本有10个加密循环,192比特密钥版本有12个加密循环,256比特密钥
               版本则有14个加密循环。SecretKey skey = kgen.generateKey();
                byte[] raw = skey.getEncoded();
                 return raw;
}

AES加密过程:
  /*
 * 加密
 */public static String encrypt(String key, String cleartext) {
               if (TextUtils.isEmpty(cleartext)) {
                        return cleartext;
                 }
                 try {
                         byte[] result = encrypt(key, cleartext.getBytes());
                         return Base64Encoder.encode(result);
                  } catch (Exception e) {
                         e.printStackTrace();
                   }
                     return null;
 }

   /* 
   * 加密
   */
    private static byte[] encrypt(String key,byte[] clear)throws Exception {
                 byte[] raw = getRawKey(key.getBytes());
                 SecretKeySpec skeySpec =new SecretKeySpec(raw, AES);
                 Cipher cipher = Cipher.getInstance(CBC_PKCS5_PADDING);
                 cipher.init(Cipher.ENCRYPT_MODE, skeySpec,
                  newIvParameterSpec(newbyte[cipher.getBlockSize()]));
                  byte[] encrypted = cipher.doFinal(clear);
                  return encrypted;
 }

AES解密过程:
/*
 * 解密
*/
public static String decrypt(String key, String encrypted) {
             if (TextUtils.isEmpty(encrypted)) {
                     return encrypted;
             }
             try {
                     byte[] enc = Base64Decoder.decodeToBytes(encrypted);
                     byte[] result = decrypt(key, enc);
                     return new String(result);
              } catch (Exception e) {
                    e.printStackTrace();
              }
             returnnull;
  }

    /* 
    * 解密
    */
private static byte[] decrypt(String key,byte[] encrypted)throws Exception {
             byte[] raw = getRawKey(key.getBytes());
             SecretKeySpec skeySpec =new SecretKeySpec(raw, AES);
             Cipher cipher = Cipher.getInstance(CBC_PKCS5_PADDING);
             cipher.init(Cipher.DECRYPT_MODE, skeySpec,
             newIvParameterSpec(newbyte[cipher.getBlockSize()]));
             byte[] decrypted = cipher.doFinal(encrypted);
             return decrypted;
}

二进制转字符:
//二进制转字符
public static String toHex(byte[] buf) {
           if(buf ==null){
              return"";
            }
             StringBuffer result =newStringBuffer(2 * buf.length);
             for(inti = 0; i < buf.length; i++) {
                    appendHex(result, buf[i]);
             }
             return result.toString();
 }
 private static void appendHex(StringBuffer sb,byte b) {
              sb.append(HEX.charAt((b >> 4) & 0x0f)).append(HEX.charAt(b & 0x0f));
 }

测试程序:
List personList =newArrayList<>();
 inttestMaxCount = 1000;
//测试的最大数据条数
 //添加测试数据
for(inti = 0; i < testMaxCount; i++) {
        Person person =new Person();
        person.setAge(i);
        person.setName(String.valueOf(i));
        personList.add(person);
}
 //FastJson生成json数据
String jsonData = JsonUtils.objectToJsonForFastJson(personList);
 Log.e("MainActivity", "AES加密前json数据 ---->" + jsonData);
Log.e("MainActivity", "AES加密前json数据长度 ---->" + jsonData.length());
 //生成一个动态
keyString secretKey = AesUtils.generateKey();
Log.e("MainActivity", "AES动态secretKey ---->" + secretKey);
//AES加密
longstart = System.currentTimeMillis();
String encryStr = AesUtils.encrypt(secretKey, jsonData);
longend = System.currentTimeMillis();
Log.e("MainActivity", "AES加密耗时 cost time---->" + (end - start));
Log.e("MainActivity", "AES加密后json数据 ---->" + encryStr);
Log.e("MainActivity", "AES加密后json数据长度 ---->" + encryStr.length());
//AES解密
start = System.currentTimeMillis();
String decryStr = AesUtils.decrypt(secretKey, encryStr);
end = System.currentTimeMillis();
Log.e("MainActivity", "AES解密耗时 cost time---->" + (end - start));
Log.e("MainActivity", "AES解密后json数据 ---->" + decryStr);

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,099评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,828评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,540评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,848评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,971评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,132评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,193评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,934评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,376评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,687评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,846评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,537评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,175评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,887评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,134评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,674评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,741评论 2 351

推荐阅读更多精彩内容

  • 概述 之前一直对加密相关的算法知之甚少,只知道类似DES、RSA等加密算法能对数据传输进行加密,且各种加密算法各有...
    Henryzhu阅读 3,011评论 0 14
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,642评论 18 139
  • 今天上午让做一个ase的加密,从网上找了好多都是支持windows的,在Linux下运行时解密时,总是出现报这个异...
    Easy的幸福阅读 1,626评论 0 3
  • 1、不安全的随机数生成,在CSRF TOKEN生成、password reset token生成等,会造成toke...
    nightmare丿阅读 3,684评论 0 1
  • PHP,Android,IOS通信之 AES128加解密案例程序android上调用代码: mcrypt = ne...
    YO_GE阅读 885评论 0 0