当前位置:   article > 正文

Java之DES/AES算法实现简单的加密以及解密_java des加密解密算法

java des加密解密算法
  1. import javax.crypto.Cipher;
  2. import javax.crypto.spec.IvParameterSpec;
  3. import javax.crypto.spec.SecretKeySpec;
  4. public class DESUtil {
  5. /**
  6. * Cipher类:
  7. * getInstance方法:
  8. * 加密算法:DES,DES3,AES,RSA
  9. * 模式:CBC(有向量模式)和ECB(无向量模式) 向量模式可以简单理解为偏移量,使用CBC需要定义一个IvParameterSpec对象
  10. * 填充模式: NoPadding: 加密内容不足8位用0补足8位 PKCS5Padding: 加密内容不足8位用余位数补足8位 如{197,97,97,97,97,97,2,2}
  11. * 参数按"算法/模式/填充模式
  12. * <p>
  13. * init方法参数:
  14. * Cipher.ENCRYPT_MODE(加密模式)和 Cipher.DECRYPT_MODE(解密模式)
  15. * key:SecretKeySpec和KeyGenerator 支持AES,DES,DES3三种加密算法创建密匙 KeyPairGenerator支持RSA加密算法创建密匙
  16. * params: 使用CBC模式时必须传入该参数 这边使用的是 IvParameterSpec
  17. * <p>
  18. * IvParameterSpec此类指定一个初始化向量 (IV)。使用 IV 的例子是反馈模式中的密码,如,CBC 模式中的 DES 和使用 OAEP 编码操作的 RSA 密码。
  19. */
  20. private static final String CIPHER_ALGORITHM = "DES/CBC/PKCS5Padding";
  21. /**
  22. * 不同加密算法所需要的值不一样 如:DES:8 AES:16
  23. */
  24. private static final int IV_SIZE = 8;
  25. private static final String KEY_CHARSET = "UTF-8";
  26. /**
  27. * @param input 加密字符串
  28. * @param key 密钥 不同加密算法所需要的值密钥Key长度不一样 如:8个字节(56位) AES: 密钥长度可以为128、192或256位,分组长度128位
  29. * @return
  30. */
  31. public static String aes256Enc(String input, String key) {
  32. byte[] keyBytes = key.getBytes();
  33. byte[] inputBytes = input.getBytes();
  34. byte[] ivBytes = new byte[IV_SIZE];
  35. try {
  36. SecretKeySpec keySpec = new SecretKeySpec(keyBytes, "DES");
  37. IvParameterSpec iv = new IvParameterSpec(ivBytes);
  38. Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
  39. cipher.init(Cipher.ENCRYPT_MODE, keySpec, iv);
  40. byte[] encryptedBytes = cipher.doFinal(inputBytes);
  41. return bytesToHex(encryptedBytes).toUpperCase();
  42. } catch (Exception e) {
  43. e.printStackTrace();
  44. return null;
  45. }
  46. }
  47. /**
  48. * 转换为16进制
  49. *
  50. * @param bytes
  51. * @return
  52. */
  53. private static String bytesToHex(byte[] bytes) {
  54. StringBuilder sb = new StringBuilder();
  55. for (byte b : bytes) {
  56. sb.append(String.format("%02x", b));
  57. }
  58. return sb.toString();
  59. }
  60. public static String decrypt(String cipherText, String key) {
  61. try {
  62. byte[] cipherBytes = hexToBytes(cipherText);
  63. byte[] keyBytes = key.getBytes(KEY_CHARSET);
  64. byte[] ivBytes = new byte[IV_SIZE];
  65. SecretKeySpec keySpec = new SecretKeySpec(keyBytes, "DES");
  66. IvParameterSpec ivSpec = new IvParameterSpec(ivBytes);
  67. Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
  68. cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec);
  69. byte[] plainBytes = cipher.doFinal(cipherBytes);
  70. return new String(plainBytes, KEY_CHARSET);
  71. } catch (Exception e) {
  72. e.printStackTrace();
  73. return null;
  74. }
  75. }
  76. private static byte[] hexToBytes(String hex) {
  77. int len = hex.length();
  78. byte[] bytes = new byte[len / 2];
  79. for (int i = 0; i < len; i += 2) {
  80. bytes[i / 2] = (byte) ((Character.digit(hex.charAt(i), 16) << 4)
  81. + Character.digit(hex.charAt(i + 1), 16));
  82. }
  83. return bytes;
  84. }
  85. // 测试DES算法+CBC模式+PKCS5Padding填充模式结果
  86. public static void main(String[] args) {
  87. String encryptionStr = aes256Enc("18866667777", "1q2w3e4r");
  88. System.out.println("加密后:" + encryptionStr);
  89. // print:加密后:E583E178EB4DF1AD3AC3BCE687EB2C16
  90. String decryptStr = decrypt(encryptionStr, "1q2w3e4r");
  91. System.out.println("解密后:" + decryptStr);
  92. // print:解密后:18866667777
  93. }
  94. }
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/木道寻08/article/detail/900960
推荐阅读
相关标签
  

闽ICP备14008679号