最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android數(shù)據(jù)加密之Aes加密

 更新時間:2016年09月23日 09:32:45   作者:總李寫代碼  
這篇文章主要為大家詳細(xì)介紹了Android數(shù)據(jù)加密之Aes加密,具有一定的參考價值,感興趣的小伙伴們可以參考一下

前言:

項目中除了登陸,支付等接口采用rsa非對稱加密,之外的采用aes對稱加密,今天我們來認(rèn)識一下aes加密。 

其他幾種加密方式:
 •Android數(shù)據(jù)加密之Rsa加密
 •Android數(shù)據(jù)加密之Aes加密
 •Android數(shù)據(jù)加密之Des加密
 •Android數(shù)據(jù)加密之MD5加密
 •Android數(shù)據(jù)加密之Base64編碼算法
 •Android數(shù)據(jù)加密之SHA安全散列算法 

什么是aes加密?

      高級加密標(biāo)準(zhǔn)(英語:Advanced Encryption Standard,縮寫:AES),在密碼學(xué)中又稱Rijndael加密法,是美國聯(lián)邦政府采用的一種區(qū)塊加密標(biāo)準(zhǔn)。這個標(biāo)準(zhǔn)用來替代原先的DES,已經(jīng)被多方分析且廣為全世界所使用。 

接下來我們來實際看下具體怎么實現(xiàn): 

對于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 強隨機種子算法, 要區(qū)別4.2以上版本的調(diào)用方法

如何生成一個隨機Key?

  /*
   * 生成隨機數(shù),可以當(dāng)做動態(tài)的密鑰 加密和解密的密鑰必須一致,不然將不能解密
   */
  public static String generateKey() {
    try {
      SecureRandom localSecureRandom = SecureRandom.getInstance(SHA1PRNG);
      byte[] bytes_key = new byte[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 android
    SecureRandom sr = null;
    // 在4.2以上版本中,SecureRandom獲取方式發(fā)生了改變
    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個加密循環(huán),192比特密鑰版本有12個加密循環(huán),256比特密鑰版本則有14個加密循環(huán)。
    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, new IvParameterSpec(new byte[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();
    }
    return null;
  }

  /*
   * 解密
   */
  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, new IvParameterSpec(new byte[cipher.getBlockSize()]));
    byte[] decrypted = cipher.doFinal(encrypted);
    return decrypted;
  }

二進制轉(zhuǎn)字符 

 //二進制轉(zhuǎn)字符
  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 static void appendHex(StringBuffer sb, byte b) {
    sb.append(HEX.charAt((b >> 4) & 0x0f)).append(HEX.charAt(b & 0x0f));
  }

測試程序: 

 List<Person> personList = new ArrayList<>();
    int testMaxCount = 1000;//測試的最大數(shù)據(jù)條數(shù)
    //添加測試數(shù)據(jù)
    for (int i = 0; i < testMaxCount; i++) {
      Person person = new Person();
      person.setAge(i);
      person.setName(String.valueOf(i));
      personList.add(person);
    }
    //FastJson生成json數(shù)據(jù)
    String jsonData = JsonUtils.objectToJsonForFastJson(personList);
    Log.e("MainActivity", "AES加密前json數(shù)據(jù) ---->" + jsonData);
    Log.e("MainActivity", "AES加密前json數(shù)據(jù)長度 ---->" + jsonData.length());

    //生成一個動態(tài)key
    String secretKey = AesUtils.generateKey();
    Log.e("MainActivity", "AES動態(tài)secretKey ---->" + secretKey);

    //AES加密
    long start = System.currentTimeMillis();
    String encryStr = AesUtils.encrypt(secretKey, jsonData);
    long end = System.currentTimeMillis();
    Log.e("MainActivity", "AES加密耗時 cost time---->" + (end - start));
    Log.e("MainActivity", "AES加密后json數(shù)據(jù) ---->" + encryStr);
    Log.e("MainActivity", "AES加密后json數(shù)據(jù)長度 ---->" + 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數(shù)據(jù) ---->" + decryStr);

運行耗時:

 由此可見對稱Aes效率還是比較高的。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 如何利用Android Studio將moudle變成jar示例詳解

    如何利用Android Studio將moudle變成jar示例詳解

    這篇文章主要給大家介紹了關(guān)于如何利用Android Studio將moudle變成jar的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來跟著小編一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-08-08
  • Android觸屏事件和MotionEvent詳解

    Android觸屏事件和MotionEvent詳解

    這篇文章主要介紹了Android觸屏事件和MotionEvent詳解的相關(guān)資料,希望通過本文能幫助到大家,讓大家理解掌握這部分內(nèi)容,需要的朋友可以參考下
    2017-10-10
  • 淺談Android單元測試的作用以及簡單示例

    淺談Android單元測試的作用以及簡單示例

    本篇文章主要介紹了淺談Android單元測試的作用以及簡單示例,具有一定的參考價值,有興趣的可以了解一下
    2017-08-08
  • Android實現(xiàn)3D標(biāo)簽云簡單效果

    Android實現(xiàn)3D標(biāo)簽云簡單效果

    這篇文章主要為大家詳細(xì)介紹了Android實現(xiàn)3D標(biāo)簽云簡單效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • Android Studio中Logcat寫入和查看日志

    Android Studio中Logcat寫入和查看日志

    大家好,本篇文章主要講的是Android Studio中Logcat寫入和查看日志,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2022-01-01
  • Android中Retrofit的簡要介紹

    Android中Retrofit的簡要介紹

    今天小編就為大家分享一篇關(guān)于Android中Retrofit的簡要介紹,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-04-04
  • 自定義視圖View繪圖基礎(chǔ)之Path的使用

    自定義視圖View繪圖基礎(chǔ)之Path的使用

    這篇文章主要介紹了自定義視圖View繪圖基礎(chǔ)之Path的使用,path類是一個非常有用的類,他可以預(yù)先在view上講N個點連成一條“路徑”,然后調(diào)用Canvas的drawPath(path,paint)即可沿著路徑繪制圖形,需要的朋友可以參考下
    2023-04-04
  • Android仿IOS上拉下拉彈性效果的實例代碼

    Android仿IOS上拉下拉彈性效果的實例代碼

    下面小編就為大家分享一篇Android仿IOS上拉下拉彈性效果的實例代碼,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-01-01
  • Android實現(xiàn)登陸頁logo隨鍵盤收放動態(tài)伸縮(完美解決鍵盤彈出遮擋控件的問題)

    Android實現(xiàn)登陸頁logo隨鍵盤收放動態(tài)伸縮(完美解決鍵盤彈出遮擋控件的問題)

    這篇文章主要介紹了Android實現(xiàn)登陸頁logo隨鍵盤收放動態(tài)伸縮(完美解決鍵盤彈出遮擋控件的問題)的相關(guān)資料,本文介紹的非常詳細(xì),具有參考借鑒價值,需要的朋友可以參考下
    2016-09-09
  • Android Studio中引入Lambda表達式的方法

    Android Studio中引入Lambda表達式的方法

    這篇文章主要給大家介紹了在Android Studio中引入Lambda表達式的方法,文中通過圖文介紹的非常詳細(xì),對大家具有一定的參考價值,需要的朋友們下面來一起看看吧。
    2017-03-03

最新評論

武穴市| 云南省| 邛崃市| 三原县| 汉寿县| 安吉县| 增城市| 彩票| 千阳县| 永修县| 华亭县| 原阳县| 白沙| 博野县| 鄂托克前旗| 建平县| 汪清县| 淮北市| 巢湖市| 辽阳县| 镶黄旗| 河池市| 贡嘎县| 潮安县| 郓城县| 礼泉县| 上饶市| 鹿泉市| 贵港市| 通辽市| 青神县| 察雅县| 喀什市| 和静县| 通河县| 福安市| 龙海市| 化州市| 南丹县| 剑河县| 南溪县|