본 글의 예시에서는 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 = '0' + 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 중국어 웹사이트를 주목하세요!