Android 데이터 암호 화 Aes 암호 화

선언:
프로젝트 에서 로그 인,결제 등 인 터 페 이 스 는 rsa 비대 칭 암호 화 를 사용 하 는 것 을 제외 하고 aes 대칭 암호 화 를 사용 합 니 다.오늘 은 aes 암호 화 를 알 아 보 겠 습 니 다. 
기타 몇 가지 암호 화 방식:
 •Android 데이터 암호 화 Rsa 암호 화
 •Android 데이터 암호 화 Aes 암호 화
 •Android 데이터 암호 화 Des 암호 화
 •Android 데이터 암호 화 MD5 암호 화
 •Android 데이터 암호 화 Base 64 인 코딩 알고리즘
 •Android 데이터 암호 화 SHA 보안 해시 알고리즘 
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         

어떻게 랜 덤 키 를 생 성 합 니까?

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

바 이 너 리 문자 

 //      
  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;//         
    //      
    for (int i = 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());

    //      key
    String secretKey = AesUtils.generateKey();
    Log.e("MainActivity", "AES  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   ---->" + 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);

실행 시간:

 이 를 통 해 알 수 있 듯 이 대칭 Aes 의 효율 은 비교적 높다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기