AES对称加密和解密

亦凉 2022-05-19 14:13 384阅读 0赞
  1. import java.io.IOException;
  2. import java.io.UnsupportedEncodingException;
  3. import java.security.InvalidKeyException;
  4. import java.security.NoSuchAlgorithmException;
  5. import java.security.SecureRandom;
  6. import java.util.Scanner;
  7. import javax.crypto.BadPaddingException;
  8. import javax.crypto.Cipher;
  9. import javax.crypto.IllegalBlockSizeException;
  10. import javax.crypto.KeyGenerator;
  11. import javax.crypto.NoSuchPaddingException;
  12. import javax.crypto.SecretKey;
  13. import javax.crypto.spec.SecretKeySpec;
  14. import Decoder.BASE64Decoder;
  15. import Decoder.BASE64Encoder;
  16. /*
  17. * AES对称加密和解密
  18. */
  19. public class SymmetricEncoder {
  20. /*
  21. * 加密
  22. * 1.构造密钥生成器
  23. * 2.根据ecnodeRules规则初始化密钥生成器
  24. * 3.产生密钥
  25. * 4.创建和初始化密码器
  26. * 5.内容加密
  27. * 6.返回字符串
  28. */
  29. public static String AESEncode(String encodeRules,String content){
  30. try {
  31. //1.构造密钥生成器,指定为AES算法,不区分大小写
  32. KeyGenerator keygen=KeyGenerator.getInstance("AES");
  33. //2.根据ecnodeRules规则初始化密钥生成器
  34. //生成一个128位的随机源,根据传入的字节数组
  35. keygen.init(128, new SecureRandom(encodeRules.getBytes()));
  36. //3.产生原始对称密钥
  37. SecretKey original_key=keygen.generateKey();
  38. //4.获得原始对称密钥的字节数组
  39. byte [] raw=original_key.getEncoded();
  40. //5.根据字节数组生成AES密钥
  41. SecretKey key=new SecretKeySpec(raw, "AES");
  42. //6.根据指定算法AES自成密码器
  43. Cipher cipher=Cipher.getInstance("AES");
  44. //7.初始化密码器,第一个参数为加密(Encrypt_mode)或者解密解密(Decrypt_mode)操作,第二个参数为使用的KEY
  45. cipher.init(Cipher.ENCRYPT_MODE, key);
  46. //8.获取加密内容的字节数组(这里要设置为utf-8)不然内容中如果有中文和英文混合中文就会解密为乱码
  47. byte [] byte_encode=content.getBytes("utf-8");
  48. //9.根据密码器的初始化方式--加密:将数据加密
  49. byte [] byte_AES=cipher.doFinal(byte_encode);
  50. //10.将加密后的数据转换为字符串
  51. //这里用Base64Encoder中会找不到包
  52. //解决办法:
  53. //在项目的Build path中先移除JRE System Library,再添加库JRE System Library,重新编译后就一切正常了。
  54. String AES_encode=new String(new BASE64Encoder().encode(byte_AES));
  55. //11.将字符串返回
  56. return AES_encode;
  57. } catch (NoSuchAlgorithmException e) {
  58. e.printStackTrace();
  59. } catch (NoSuchPaddingException e) {
  60. e.printStackTrace();
  61. } catch (InvalidKeyException e) {
  62. e.printStackTrace();
  63. } catch (IllegalBlockSizeException e) {
  64. e.printStackTrace();
  65. } catch (BadPaddingException e) {
  66. e.printStackTrace();
  67. } catch (UnsupportedEncodingException e) {
  68. e.printStackTrace();
  69. }
  70. //如果有错就返加nulll
  71. return null;
  72. }
  73. /*
  74. * 解密
  75. * 解密过程:
  76. * 1.同加密1-4步
  77. * 2.将加密后的字符串反纺成byte[]数组
  78. * 3.将加密内容解密
  79. */
  80. public static String AESDncode(String encodeRules,String content){
  81. try {
  82. //1.构造密钥生成器,指定为AES算法,不区分大小写
  83. KeyGenerator keygen=KeyGenerator.getInstance("AES");
  84. //2.根据ecnodeRules规则初始化密钥生成器
  85. //生成一个128位的随机源,根据传入的字节数组
  86. keygen.init(128, new SecureRandom(encodeRules.getBytes()));
  87. //3.产生原始对称密钥
  88. SecretKey original_key=keygen.generateKey();
  89. //4.获得原始对称密钥的字节数组
  90. byte [] raw=original_key.getEncoded();
  91. //5.根据字节数组生成AES密钥
  92. SecretKey key=new SecretKeySpec(raw, "AES");
  93. //6.根据指定算法AES自成密码器
  94. Cipher cipher=Cipher.getInstance("AES");
  95. //7.初始化密码器,第一个参数为加密(Encrypt_mode)或者解密(Decrypt_mode)操作,第二个参数为使用的KEY
  96. cipher.init(Cipher.DECRYPT_MODE, key);
  97. //8.将加密并编码后的内容解码成字节数组
  98. byte [] byte_content= new BASE64Decoder().decodeBuffer(content);
  99. /*
  100. * 解密
  101. */
  102. byte [] byte_decode=cipher.doFinal(byte_content);
  103. String AES_decode=new String(byte_decode,"utf-8");
  104. return AES_decode;
  105. } catch (NoSuchAlgorithmException e) {
  106. e.printStackTrace();
  107. } catch (NoSuchPaddingException e) {
  108. e.printStackTrace();
  109. } catch (InvalidKeyException e) {
  110. e.printStackTrace();
  111. } catch (IOException e) {
  112. e.printStackTrace();
  113. } catch (IllegalBlockSizeException e) {
  114. e.printStackTrace();
  115. } catch (BadPaddingException e) {
  116. e.printStackTrace();
  117. }
  118. //如果有错就返加nulll
  119. return null;
  120. }
  121. public static void main(String[] args) {
  122. SymmetricEncoder se=new SymmetricEncoder();
  123. Scanner scanner=new Scanner(System.in);
  124. /*
  125. * 加密
  126. */
  127. System.out.println("使用AES对称加密,请输入加密的规则");
  128. String encodeRules=scanner.next();
  129. System.out.println("请输入要加密的内容:");
  130. String content = scanner.next();
  131. System.out.println("根据输入的规则"+encodeRules+"加密后的密文是:"+se.AESEncode(encodeRules, content));
  132. /*
  133. * 解密
  134. */
  135. System.out.println("使用AES对称解密,请输入加密的规则:(须与加密相同)");
  136. encodeRules=scanner.next();
  137. System.out.println("请输入要解密的内容(密文):");
  138. content = scanner.next();
  139. System.out.println("根据输入的规则"+encodeRules+"解密后的明文是:"+se.AESDncode(encodeRules, content));
  140. }
  141. }

发表评论

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

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

相关阅读

    相关 AES对称加密

    AES对称加密,比DES安全性高。 AES通常用于移动通信系统加密以及基于SSH协议的软件。 AES对称加密:AES常用的有ECB和CBC两种模式。常用的填充方式有

    相关 JAVA-对称加密AES解密示例

    这几天在解决报文中敏感字段传输问题时,由于对AES对称加密不熟悉,遇到了不少问题。特此记录,多的不说,直接上代码!代码中做了向量的异或(generateIv),如无特殊需要,可