当前位置:   article > 正文

DES对称加密算法_des加密算法

des加密算法

前言:

1.DES是一个经典的分组加密算法,以64位为分组对数据进行加密(分组),加密和解密使用的是同一个算法(对称);
2.密钥长64位,事实上56位参与DES运算,每8位中最后一位是奇偶校验位(保证密钥每8位都有奇数个1);
3.加密过程:对于每一个明文分组,进行一次初始置换IP(Initial Permutation),之后循环使用16个子密钥进行16轮加密,最后进行一次末置换(IP^-1)。
 

  1. public class DesEncrypt {
  2. private static Logger logger = Logger.getLogger(DesEncrypt.class);
  3. //算法名称
  4. public static final String KEY_ALGORITHM = "DES";
  5. public static final String KEY_KEY = "A1B2C3D4E5F60708";
  6. //算法名称/加密模式/填充方式
  7. //DES共有四种工作模式-->>ECB:电子密码本模式、CBC:加密分组链接模式、CFB:加密反馈模式、OFB:输出反馈模式
  8. //public static final String CIPHER_ALGORITHM = "DES/ECB/NoPadding";
  9. public static final String CIPHER_ALGORITHM = "DES/ECB/PKCS5Padding";
  10. /**
  11. *
  12. * 生成密钥key对象
  13. * @param KeyStr 密钥字符串
  14. * @return 密钥对象
  15. * @throws InvalidKeyException
  16. * @throws NoSuchAlgorithmException
  17. * @throws InvalidKeySpecException
  18. * @throws Exception
  19. */
  20. private static SecretKey keyGenerator(String keyStr) throws Exception {
  21. byte input[] = HexString2Bytes(keyStr);
  22. DESKeySpec desKey = new DESKeySpec(input);
  23. //创建一个密匙工厂,然后用它把DESKeySpec转换成
  24. SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
  25. SecretKey securekey = keyFactory.generateSecret(desKey);
  26. return securekey;
  27. }
  28. private static int parse(char c) {
  29. if (c >= 'a') return (c - 'a' + 10) & 0x0f;
  30. if (c >= 'A') return (c - 'A' + 10) & 0x0f;
  31. return (c - '0') & 0x0f;
  32. }
  33. // 从十六进制字符串到字节数组转换
  34. public static byte[] HexString2Bytes(String hexstr) {
  35. byte[] b = new byte[hexstr.length() / 2];
  36. int j = 0;
  37. for (int i = 0; i < b.length; i++) {
  38. char c0 = hexstr.charAt(j++);
  39. char c1 = hexstr.charAt(j++);
  40. b[i] = (byte) ((parse(c0) << 4) | parse(c1));
  41. }
  42. return b;
  43. }
  44. /**
  45. * 加密数据
  46. * @param data 待加密数据
  47. * @param key 密钥
  48. * @return 加密后的数据
  49. */
  50. public static String encrypt(String data, String key) {
  51. byte[] results = null;
  52. try {
  53. Key deskey = keyGenerator(key);
  54. // 实例化Cipher对象,它用于完成实际的加密操作
  55. Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
  56. SecureRandom random = new SecureRandom();
  57. // 初始化Cipher对象,设置为加密模式
  58. cipher.init(Cipher.ENCRYPT_MODE, deskey, random);
  59. results = cipher.doFinal(data.getBytes());
  60. // 该部分是为了与加解密在线测试网站的十六进制结果进行核对
  61. for (int i = 0; i < results.length; i++) {
  62. System.out.print(results[i] + " ");
  63. }
  64. System.out.println();
  65. // 执行加密操作。加密后的结果通常都会用Base64编码进行传输
  66. } catch (InvalidKeyException e) {
  67. e.printStackTrace();
  68. } catch (NoSuchAlgorithmException e) {
  69. // TODO Auto-generated catch block
  70. e.printStackTrace();
  71. } catch (NoSuchPaddingException e) {
  72. // TODO Auto-generated catch block
  73. e.printStackTrace();
  74. } catch (IllegalBlockSizeException e) {
  75. // TODO Auto-generated catch block
  76. e.printStackTrace();
  77. } catch (BadPaddingException e) {
  78. // TODO Auto-generated catch block
  79. e.printStackTrace();
  80. } catch (Exception e) {
  81. // TODO Auto-generated catch block
  82. e.printStackTrace();
  83. }
  84. return Base64.encodeBase64String(results);
  85. }
  86. /**
  87. * 解密数据
  88. * @param data 待解密数据
  89. * @param key 密钥
  90. * @return 解密后的数据
  91. */
  92. public static String decrypt(String data, String key) {
  93. byte[] ret = null;
  94. try {
  95. Key deskey = keyGenerator(key);
  96. Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
  97. //初始化Cipher对象,设置为解密模式
  98. cipher.init(Cipher.DECRYPT_MODE, deskey);
  99. // 执行解密操作
  100. ret = cipher.doFinal(Base64.decodeBase64(data));
  101. } catch (InvalidKeyException e) {
  102. e.printStackTrace();
  103. } catch (NoSuchAlgorithmException e) {
  104. e.printStackTrace();
  105. } catch (NoSuchPaddingException e) {
  106. e.printStackTrace();
  107. } catch (IllegalBlockSizeException e) {
  108. e.printStackTrace();
  109. } catch (BadPaddingException e) {
  110. e.printStackTrace();
  111. } catch (Exception e) {
  112. e.printStackTrace();
  113. }
  114. return new String(ret);
  115. }
  116. /**
  117. * 批量验证权限
  118. * @param request
  119. * @param chkParamNames
  120. * @return
  121. */
  122. public static boolean checkScrect(HttpServletRequest request,
  123. String[] chkParamNames) {
  124. StringBuffer buffer = new StringBuffer();
  125. for(int i=0;i<chkParamNames.length;i++){
  126. String param=StringUtils.trimToEmpty(request.getParameter(chkParamNames[i]));
  127. buffer.append(new String(DesEncrypt.decrypt(param, DesEncrypt.KEY_KEY)));
  128. }
  129. String secret=request.getParameter(AppConstant.PARAM_SECRECT);
  130. String secretD=new String(DesEncrypt.decrypt(secret,DesEncrypt.KEY_KEY ));
  131. logger.info("buffer:"+buffer.toString());
  132. logger.info("secretD:"+secretD);
  133. if(buffer.toString().equals(secretD)){
  134. return true;
  135. }
  136. return false;
  137. }
  138. public static void main(String[] args) throws Exception {
  139. String source = "哈哈";
  140. System.out.println("原文: " + source);
  141. String key = "A1B2C3D4E5F60708";
  142. String encryptData = encrypt(source, key);
  143. System.out.println("加密后: " + encryptData);
  144. String decryptData = decrypt(encryptData, key);
  145. System.out.println("解密后: " + decryptData);
  146. System.out.println(DesEncrypt.decrypt("Xo5QuTUR/GIMocTHz1FIQIc9+Id22JDj", DesEncrypt.KEY_KEY));
  147. }
  148. }

 


 

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号