AES加解密实例
程序员文章站
2022-06-21 14:49:47
...
AES加解密实例
package com.bijian.study; import java.io.UnsupportedEncodingException; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; 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; import org.apache.axis.encoding.Base64; public class AESTools { private static String password = "好复杂的密码complex password,没见过这么奇怪的密码"; /** * 获取密码 */ public static String getPassword() { return password; } /** * 加密 * @param content * @param password * @return */ public static byte[] encrypt(String content, String password) { try { KeyGenerator kgen = KeyGenerator.getInstance("AES"); SecureRandom random = SecureRandom.getInstance("SHA1PRNG"); random.setSeed(getKeyByStr(password)); kgen.init(128, random); SecretKey secretKey = kgen.generateKey(); byte[] enCodeFormat = secretKey.getEncoded(); SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES"); Cipher cipher = Cipher.getInstance("AES");// 创建密码器 byte[] byteContent = content.getBytes("UTF-8"); 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 * @return */ public static byte[] decrypt(byte[] content, String password) { try { KeyGenerator kgen = KeyGenerator.getInstance("AES"); SecureRandom random = SecureRandom.getInstance("SHA1PRNG"); random.setSeed(getKeyByStr(password)); kgen.init(128, random); SecretKey secretKey = kgen.generateKey(); byte[] enCodeFormat = secretKey.getEncoded(); SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES"); Cipher cipher = Cipher.getInstance("AES");// 创建密码器 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; } public static byte[] getKeyByStr(String str) { byte[] bRet = new byte[str.length() / 2]; for (int i = 0; i < str.length() / 2; i++) { Integer itg = new Integer(16 * getChrInt(str.charAt(2 * i)) + getChrInt(str.charAt(2 * i + 1))); bRet[i] = itg.byteValue(); } return bRet; } public static int getChrInt(char chr) { int iRet = 0; if (chr == "0".charAt(0)) iRet = 0; if (chr == "1".charAt(0)) iRet = 1; if (chr == "2".charAt(0)) iRet = 2; if (chr == "3".charAt(0)) iRet = 3; if (chr == "4".charAt(0)) iRet = 4; if (chr == "5".charAt(0)) iRet = 5; if (chr == "6".charAt(0)) iRet = 6; if (chr == "7".charAt(0)) iRet = 7; if (chr == "8".charAt(0)) iRet = 8; if (chr == "9".charAt(0)) iRet = 9; if (chr == "A".charAt(0)) iRet = 10; if (chr == "B".charAt(0)) iRet = 11; if (chr == "C".charAt(0)) iRet = 12; if (chr == "D".charAt(0)) iRet = 13; if (chr == "E".charAt(0)) iRet = 14; if (chr == "F".charAt(0)) iRet = 15; return iRet; } public static String decryptString(String contents) { return new String(decrypt(Base64.decode(contents), password)); } public static String encryptString(String contents) { return Base64.encode(encrypt(contents, password)); } public static void main(String[] args) { String text = "深圳欢迎您!Welcome to shenzhen!"; //加密 String encryptStr = AESTools.encryptString(text); System.out.println("text length:" + text.length() + ",text:" + text); System.out.println("encryptStr length:" + encryptStr.length() + ",encryptStr" + encryptStr); System.out.println("密文比明文增加长度add length:" + (encryptStr.length() - text.length())); //解密 String decryptStr = AESTools.decryptString(encryptStr); System.out.println("decryptStr length:" + decryptStr.length() + ",decryptStr:" + decryptStr); } }
运行结果:
text length:26,text:深圳欢迎您!Welcome to shenzhen! encryptStr length:64,encryptStrujOEp9losb7mJx8a8Ht2nbCNaVtfCrAuKt9JRjTGdULpPYJOUr0nvzYQ9rvqWB6z 密文比明文增加长度add length:38 decryptStr length:26,decryptStr:深圳欢迎您!Welcome to shenzhen!
上一篇: 方法{【对任意个数的字符串去重排序】
下一篇: 前端自适应遇到用户更改系统字体大小