亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

前言:

項(xiàng)目中除了登陸,支付等接口采用rsa非對(duì)稱加密,之外的采用aes對(duì)稱加密,今天我們來(lái)認(rèn)識(shí)一下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加密?

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

接下來(lái)我們來(lái)實(shí)際看下具體怎么實(shí)現(xiàn): 

對(duì)于AesUtils類常量簡(jiǎn)介: 

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

如何生成一個(gè)隨機(jī)Key?

  /*
   * 生成隨機(jī)數(shù),可以當(dāng)做動(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密鑰處理 

  // 對(duì)密鑰進(jìn)行處理
  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個(gè)加密循環(huán),192比特密鑰版本有12個(gè)加密循環(huán),256比特密鑰版本則有14個(gè)加密循環(huán)。
    SecretKey skey = kgen.generateKey();
    byte[] raw = skey.getEncoded();
    return raw;
  }

Aes加密過(guò)程 

/*
   * 加密
   */
  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解密過(guò)程 

  /*
   * 解密
   */
  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;
  }

二進(jìn)制轉(zhuǎn)字符 

 //二進(jì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));
  }

測(cè)試程序: 

 List<Person> personList = new ArrayList<>();
    int testMaxCount = 1000;//測(cè)試的最大數(shù)據(jù)條數(shù)
    //添加測(cè)試數(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ù)長(zhǎng)度 ---->" + jsonData.length());

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

    //AES加密
    long start = System.currentTimeMillis();
    String encryStr = AesUtils.encrypt(secretKey, jsonData);
    long end = System.currentTimeMillis();
    Log.e("MainActivity", "AES加密耗時(shí) cost time---->" + (end - start));
    Log.e("MainActivity", "AES加密后json數(shù)據(jù) ---->" + encryStr);
    Log.e("MainActivity", "AES加密后json數(shù)據(jù)長(zhǎng)度 ---->" + encryStr.length());

    //AES解密
    start = System.currentTimeMillis();
    String decryStr = AesUtils.decrypt(secretKey, encryStr);
    end = System.currentTimeMillis();
    Log.e("MainActivity", "AES解密耗時(shí) cost time---->" + (end - start));
    Log.e("MainActivity", "AES解密后json數(shù)據(jù) ---->" + decryStr);

運(yùn)行耗時(shí):

 由此可見(jiàn)對(duì)稱Aes效率還是比較高的。

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

相關(guān)文章

最新評(píng)論