【加密解密】-AES加密解密实现

偏执的太偏执、 2022-06-13 08:06 442阅读 0赞

AES加密解密工具类:AESUtils

  1. package org.iti.algorithm;
  2. import java.security.SecureRandom;
  3. import javax.crypto.Cipher;
  4. import javax.crypto.KeyGenerator;
  5. import javax.crypto.SecretKey;
  6. import javax.crypto.spec.IvParameterSpec;
  7. import javax.crypto.spec.SecretKeySpec;
  8. public class AESUtils {
  9. /** * 加密方法 * * @param seed * 密钥 * @param clearText * 明文 * @return */
  10. public static String encrypt(String seed, String clearText) {
  11. byte[] result = null;
  12. try {
  13. byte[] rawkey = getRawKey(seed.getBytes());
  14. result = encrypt(rawkey, clearText.getBytes());
  15. } catch (Exception e) {
  16. e.printStackTrace();
  17. }
  18. String content = toHex(result);
  19. return content;
  20. }
  21. /** * 解密方法 * * @param seed * @param encrypted * @return */
  22. public static String decrypt(String seed, String encrypted) {
  23. byte[] rawKey;
  24. try {
  25. rawKey = getRawKey(seed.getBytes());
  26. byte[] enc = toByte(encrypted);
  27. byte[] result = decrypt(rawKey, enc);
  28. String coentn = new String(result);
  29. return coentn;
  30. } catch (Exception e) {
  31. e.printStackTrace();
  32. return null;
  33. }
  34. }
  35. private static byte[] getRawKey(byte[] seed) throws Exception {
  36. KeyGenerator kgen = KeyGenerator.getInstance("AES");
  37. SecureRandom sr = SecureRandom.getInstance("SHA1PRNG");
  38. sr.setSeed(seed);
  39. kgen.init(128, sr);
  40. SecretKey sKey = kgen.generateKey();
  41. byte[] raw = sKey.getEncoded();
  42. return raw;
  43. }
  44. private static byte[] encrypt(byte[] raw, byte[] clear) throws Exception {
  45. SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
  46. Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
  47. cipher.init(Cipher.ENCRYPT_MODE, skeySpec, new IvParameterSpec(
  48. new byte[cipher.getBlockSize()]));
  49. byte[] encrypted = cipher.doFinal(clear);
  50. return encrypted;
  51. }
  52. private static byte[] decrypt(byte[] raw, byte[] encrypted)
  53. throws Exception {
  54. SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
  55. Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
  56. cipher.init(Cipher.DECRYPT_MODE, skeySpec, new IvParameterSpec(
  57. new byte[cipher.getBlockSize()]));
  58. byte[] decrypted = cipher.doFinal(encrypted);
  59. return decrypted;
  60. }
  61. public static String toHex(String txt) {
  62. return toHex(txt.getBytes());
  63. }
  64. public static String fromHex(String hex) {
  65. return new String(toByte(hex));
  66. }
  67. public static byte[] toByte(String hexString) {
  68. int len = hexString.length() / 2;
  69. byte[] result = new byte[len];
  70. for (int i = 0; i < len; i++)
  71. result[i] = Integer.valueOf(hexString.substring(2 * i, 2 * i + 2),
  72. 16).byteValue();
  73. return result;
  74. }
  75. public static String toHex(byte[] buf) {
  76. if (buf == null)
  77. return "";
  78. StringBuffer result = new StringBuffer(2 * buf.length);
  79. for (int i = 0; i < buf.length; i++) {
  80. appendHex(result, buf[i]);
  81. }
  82. return result.toString();
  83. }
  84. private static void appendHex(StringBuffer sb, byte b) {
  85. final String HEX = "0123456789ABCDEF";
  86. sb.append(HEX.charAt((b >> 4) & 0x0f)).append(HEX.charAt(b & 0x0f));
  87. }
  88. }

发表评论

表情:
评论列表 (有 0 条评论,442人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Java实现AES加密解密

    之前常用两种加密算法:Base64和Md5,前者容易破解,后者不可逆。 AES采用对称加密方式,破解难度非常大,在可逆的基础上,能很好的保证数据的安全性。 这里介绍Java