>Java >java지도 시간 >AES 대칭 암호화 알고리즘을 기반으로 한 Java 암호화 및 복호화 기능 예제

AES 대칭 암호화 알고리즘을 기반으로 한 Java 암호화 및 복호화 기능 예제

高洛峰
高洛峰원래의
2017-01-24 11:01:431575검색

본 글의 예시에서는 AES 대칭암호 알고리즘을 기반으로 Java로 구현한 암호화 및 복호화 기능을 설명합니다. 참조용으로 모든 사람과 공유하세요. 세부 사항은 다음과 같습니다.

package com.soufun.com;
import java.io.UnsupportedEncodingException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.util.Date;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.KeyGenerator;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
/**
 * @author WHD
 */
public class AesUtil {
  private static final String AES="AES";
  private static final String UTF8="UTF-8";
  static KeyGenerator kgen =null;
  static{
    try {
      kgen= KeyGenerator.getInstance(AES);
    } catch (NoSuchAlgorithmException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
  }
  /*
   * @param content:
   * @param password:
   */
  private static byte[] encrypt(String content, String password) {
    try {
      // 使用静态代码块来生成KeyGenerator对象
      //KeyGenerator kgen = KeyGenerator.getInstance(AES);
      // 使用128 位
      kgen.init(128, new SecureRandom(password.getBytes()));
      SecretKey secretKey = kgen.generateKey();
      byte[] encodeFormat = secretKey.getEncoded();
      SecretKeySpec key = new SecretKeySpec(encodeFormat, AES);
      // Cipher对象实际完成加密操作
      Cipher cipher = Cipher.getInstance(AES);
      // 加密内容进行编码
      byte[] byteContent = content.getBytes(UTF8);
      // 用密匙初始化Cipher对象
      cipher.init(Cipher.ENCRYPT_MODE, key);
      // 正式执行加密操作
      byte[] result = cipher.doFinal(byteContent);
      return result;
    } catch (NoSuchAlgorithmException e) {
      e.printStackTrace();
    } catch (NoSuchPaddingException e) {
      e.printStackTrace();
    } catch (InvalidKeyException e) {
      e.printStackTrace();
    } catch (UnsupportedEncodingException e) {
      e.printStackTrace();
    } catch (IllegalBlockSizeException e) {
      e.printStackTrace();
    } catch (BadPaddingException e) {
      e.printStackTrace();
    }
    return null;
  }
  /*
   * @param content:
   * @param password:
   */
  private static byte[] decrypt(byte[] content, String password) {
    try {// 使用静态代码块来生成KeyGenerator对象
      //KeyGenerator kgen = KeyGenerator.getInstance(AES);
      // 使用128 位
      kgen.init(128, new SecureRandom(password.getBytes()));
      SecretKey secretKey = kgen.generateKey();
      byte[] encodeFormat = secretKey.getEncoded();
      SecretKeySpec key = new SecretKeySpec(encodeFormat, AES);
      // Cipher对象实际完成加密操作
      Cipher cipher = Cipher.getInstance(AES);
      // 用密匙初始化Cipher对象
      cipher.init(Cipher.DECRYPT_MODE, key);
      // 正式执行解密操作
      byte[] result = cipher.doFinal(content);
      return result;
    } catch (NoSuchAlgorithmException e) {
      e.printStackTrace();
    } catch (NoSuchPaddingException e) {
      e.printStackTrace();
    } catch (InvalidKeyException e) {
      e.printStackTrace();
    } catch (IllegalBlockSizeException e) {
      e.printStackTrace();
    } catch (BadPaddingException e) {
      e.printStackTrace();
    }
    return null;
  }
  /**
   * 二进制--》十六进制转化
   * @param buf
   * @return
   */
  private static String parseByte2HexStr(byte buf[]) {
    StringBuffer sb = new StringBuffer();
    for (int i = 0; i < buf.length; i++) {
      String hex = Integer.toHexString(buf[i] & 0xFF);
      if (hex.length() == 1) {
        hex = &#39;0&#39; + hex;
      }
      sb.append(hex.toUpperCase());
    }
    return sb.toString();
  }
  /**
   * 十六进制--》二进制转化
   * @param hexStr
   * @return
   */
  private static byte[] parseHexStr2Byte(String hexStr) {
    if (hexStr.length() < 1) {
      return null;
    }
    byte[] result = new byte[hexStr.length() / 2];
    for (int i = 0; i < hexStr.length() / 2; i++) {
      int high = Integer.parseInt(hexStr.substring(i * 2, i * 2 + 1), 16);
      int low = Integer.parseInt(hexStr.substring(i * 2 + 1, i * 2 + 2),
          16);
      result[i] = (byte) (high * 16 + low);
    }
    return result;
  }
  public static void main(String[] args) throws UnsupportedEncodingException {
    long begin=new Date().getTime();
    String content = "aaades加密测试";
    String password = "12345678dd";
    // 加密
    System.out.println("加密前:" + content);
    byte[] encryptResult = encrypt(content, password);
    String encryptResultStr = parseByte2HexStr(encryptResult);
    System.out.println("加密后:" + encryptResultStr);
    // 解密
    byte[] decryptFrom = parseHexStr2Byte(encryptResultStr);
    byte[] decryptResult = decrypt(decryptFrom, password);
    // 解密内容进行解码
    String result = new String(decryptResult, UTF8);
    System.out.println("解密后:" + result);
    long end= new Date().getTime();
    System.out.println(end-begin);
  }
}

참고: SecureRandom은 보안 난수 시퀀스를 생성하며 시드가 동일한 한 비밀번호.getBytes()는 시드입니다. 순서는 동일하므로 암호 해독에는 비밀번호만 있으면 복원할 수 있습니다.

이 기사가 Java 프로그래밍에 종사하는 모든 분들께 도움이 되기를 바랍니다.

AES 대칭 암호화 알고리즘을 기반으로 한 더 많은 Java 암호화 및 복호화 기능 예제와 관련 기사를 보려면 PHP 중국어 웹사이트를 주목하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.