当前位置:   article > 正文

DES加密

des加密

一.简介

DES对称加密,是一种比较传统的加密方式,其加密运算、解密运算使用的是同样的密钥,信息的发送者和信息的接收者在进行信息的传输与处理时,必须共同持有该密码(称为对称密码),是一种对称加密算法。

DES全称Data Encryption Standard,是一种使用密匙加密的块算法。现在认为是一种不安全的加密算法,因为现在已经有用穷举法攻破DES密码的报道了。尽管如此,该加密算法还是运用非常普遍,是一种标准的加密算法。3DES是DES的加强版本。

二.加密原理

DES 使用一个 56 位的密钥以及附加的 8 位奇偶校验位,产生最大 64 位的分组大小。这是一个迭代的分组密码,使用称为 Feistel 的技术,其中将加密的文本块分成两半。使用子密钥对其中一半应用循环功能,然后将输出与另一半进行“异或”运算;接着交换这两半,这一过程会继续下去,但最后一个循环不交换。DES 使用 16 个循环,使用异或,置换,代换,移位操作四种基本运算。

三.代码说明

1.工具类

  1. package com.wjn.okhttpmvpdemo.mode.utils;
  2. import java.nio.charset.Charset;
  3. import javax.crypto.Cipher;
  4. import javax.crypto.SecretKey;
  5. import javax.crypto.SecretKeyFactory;
  6. import javax.crypto.spec.DESKeySpec;
  7. import javax.crypto.spec.IvParameterSpec;
  8. public class DesUtil {
  9. /**
  10. * 加密 外部调用
  11. *
  12. * @param srcStr
  13. * @param charset
  14. * @param sKey
  15. * @return
  16. */
  17. public static String encrypt(String srcStr, Charset charset, String sKey) {
  18. byte[] src = srcStr.getBytes(charset);
  19. byte[] buf = encrypt(src, sKey);
  20. return parseByte2HexStr(buf);
  21. }
  22. /**
  23. * 解密 外部调用
  24. *
  25. * @param hexStr
  26. * @param sKey
  27. * @return
  28. */
  29. public static String decrypt(String hexStr, Charset charset, String sKey) throws Exception {
  30. byte[] src = parseHexStr2Byte(hexStr);
  31. byte[] buf = decrypt(src, sKey);
  32. return new String(buf, charset);
  33. }
  34. /**
  35. * 加密 内部调用
  36. *
  37. * @param data
  38. * @param sKey
  39. * @return
  40. */
  41. public static byte[] encrypt(byte[] data, String sKey) {
  42. try {
  43. byte[] key = sKey.getBytes();
  44. // 初始化向量
  45. IvParameterSpec iv = new IvParameterSpec(key);
  46. DESKeySpec desKey = new DESKeySpec(key);
  47. // 创建一个密匙工厂,然后用它把DESKeySpec转换成securekey
  48. SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
  49. SecretKey securekey = keyFactory.generateSecret(desKey);
  50. // Cipher对象实际完成加密操作
  51. Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
  52. // 用密匙初始化Cipher对象
  53. cipher.init(Cipher.ENCRYPT_MODE, securekey, iv);
  54. // 现在,获取数据并加密
  55. // 正式执行加密操作
  56. return cipher.doFinal(data);
  57. } catch (Throwable e) {
  58. e.printStackTrace();
  59. }
  60. return null;
  61. }
  62. /**
  63. * 解密 内部调用
  64. *
  65. * @param src
  66. * @param sKey
  67. * @return
  68. */
  69. public static byte[] decrypt(byte[] src, String sKey) throws Exception {
  70. byte[] key = sKey.getBytes();
  71. // 初始化向量
  72. IvParameterSpec iv = new IvParameterSpec(key);
  73. // 创建一个DESKeySpec对象
  74. DESKeySpec desKey = new DESKeySpec(key);
  75. // 创建一个密匙工厂
  76. SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
  77. // 将DESKeySpec对象转换成SecretKey对象
  78. SecretKey securekey = keyFactory.generateSecret(desKey);
  79. // Cipher对象实际完成解密操作
  80. Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
  81. // 用密匙初始化Cipher对象
  82. cipher.init(Cipher.DECRYPT_MODE, securekey, iv);
  83. // 真正开始解密操作
  84. return cipher.doFinal(src);
  85. }
  86. /**
  87. * 将二进制转换成16进制
  88. *
  89. * @param buf
  90. * @return
  91. */
  92. public static String parseByte2HexStr(byte buf[]) {
  93. StringBuffer sb = new StringBuffer();
  94. for (int i = 0; i < buf.length; i++) {
  95. String hex = Integer.toHexString(buf[i] & 0xFF);
  96. if (hex.length() == 1) {
  97. hex = '0' + hex;
  98. }
  99. sb.append(hex.toUpperCase());
  100. }
  101. return sb.toString();
  102. }
  103. /**
  104. * 将16进制转换为二进制
  105. *
  106. * @param hexStr
  107. * @return
  108. */
  109. public static byte[] parseHexStr2Byte(String hexStr) {
  110. if (hexStr.length() < 1) return null;
  111. byte[] result = new byte[hexStr.length() / 2];
  112. for (int i = 0; i < hexStr.length() / 2; i++) {
  113. int high = Integer.parseInt(hexStr.substring(i * 2, i * 2 + 1), 16);
  114. int low = Integer.parseInt(hexStr.substring(i * 2 + 1, i * 2 + 2), 16);
  115. result[i] = (byte) (high * 16 + low);
  116. }
  117. return result;
  118. }
  119. }

2.调用

  1. private void myDesMethod(){
  2. String SKEY = "1q2w3e4r";//必须8位
  3. Charset CHARSET = Charset.forName("GBK");
  4. //待加密内容
  5. String str = "今天是你的生日,我的中国236598";
  6. Log.d("TAG","原字符串:"+str);
  7. Log.d("TAG","********************************************");
  8. String encryptResult = DesUtil.encrypt(str, CHARSET, SKEY);
  9. Log.d("TAG","加密后:"+encryptResult);
  10. Log.d("TAG","********************************************");
  11. // 解密
  12. String decryResult = "";
  13. try {
  14. decryResult = DesUtil.decrypt(encryptResult, CHARSET, SKEY);
  15. } catch (Exception e1) {
  16. e1.printStackTrace();
  17. }
  18. Log.d("TAG","解密后:"+decryResult);
  19. }

3.结果

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/411748
推荐阅读
相关标签
  

闽ICP备14008679号