1. package com.wangbo.util;
  2.  
  3. import java.security.Key;
  4. import java.security.Security;
  5. import javax.crypto.Cipher;
  6.  
  7. /**
  8. * DES加密和解密工具,可以对字符串进行加密和解密操作。
  9. */
  10. public class DesUtil {
  11.  
  12. /** 字符串默认键值 */
  13. private static String strDefaultKey = "national";
  14.  
  15. /** 加密工具 */
  16. private Cipher encryptCipher = null;
  17.  
  18. /** 解密工具 */
  19. private Cipher decryptCipher = null;
  20.  
  21. /**
  22. * 无参数构造方法:默认构造方法,使用默认密钥
  23. */
  24. public DesUtil() throws Exception {
  25. this(strDefaultKey);
  26. }
  27.  
  28. /**
  29. * 含参数构造方法:指定密钥构造方法
  30. * @param strKey 指定的密钥
  31. */
  32. public DesUtil(String strKey) throws Exception {
  33. Security.addProvider(new com.sun.crypto.provider.SunJCE());
  34. Key key = getKey(strKey.getBytes());
  35.  
  36. encryptCipher = Cipher.getInstance("DES");
  37. encryptCipher.init(Cipher.ENCRYPT_MODE, key);
  38.  
  39. decryptCipher = Cipher.getInstance("DES");
  40. decryptCipher.init(Cipher.DECRYPT_MODE, key);
  41. }
  42.  
  43. /**
  44. * 将byte数组转换为表示16进制值的字符串, 如:byte[]{8,18}转换为:0813,
  45. * 和hexStr2ByteArr(String strIn) 互为可逆的转换过程
  46. *
  47. * @param arrB 需要转换的byte数组
  48. * @return 转换后的字符串
  49. * @throws Exception 本方法不处理任何异常,所有异常全部抛出
  50. */
  51. public static String byteArr2HexStr(byte[] arrB) throws Exception {
  52. int iLen = arrB.length;
  53. // 每个byte用两个字符才能表示,所以字符串的长度是数组长度的两倍
  54. StringBuffer sb = new StringBuffer(iLen * 2);
  55. for (int i = 0; i < iLen; i++) {
  56. int intTmp = arrB[i];
  57. // 把负数转换为正数
  58. while (intTmp < 0) {
  59. intTmp = intTmp + 256;
  60. }
  61. // 小于0F的数需要在前面补0
  62. if (intTmp < 16) {
  63. sb.append("0");
  64. }
  65. sb.append(Integer.toString(intTmp, 16));
  66. }
  67. return sb.toString();
  68. }
  69.  
  70. /**
  71. * 将表示16进制值的字符串转换为byte数组,
  72. * 和byteArr2HexStr(byte[] arrB)互为可逆的转换过程
  73. *
  74. * @param strIn 需要转换的字符串
  75. * @return 转换后的byte数组
  76. * @throws Exception 本方法不处理任何异常,所有异常全部抛出
  77. */
  78. public static byte[] hexStr2ByteArr(String strIn) throws Exception {
  79. byte[] arrB = strIn.getBytes();
  80. int iLen = arrB.length;
  81. // 两个字符表示一个字节,所以字节数组长度是字符串长度除以2
  82. byte[] arrOut = new byte[iLen / 2];
  83. for (int i = 0; i < iLen; i = i + 2) {
  84. String strTmp = new String(arrB, i, 2);
  85. arrOut[i / 2] = (byte) Integer.parseInt(strTmp, 16);
  86. }
  87. return arrOut;
  88. }
  89.  
  90. /**
  91. * 加密byte数组
  92. *
  93. * @param arrB 需加密的byte数组
  94. * @return 加密后的字节数组
  95. * @throws Exception
  96. */
  97. public byte[] encrypt(byte[] arrB) throws Exception {
  98. return encryptCipher.doFinal(arrB);
  99. }
  100.  
  101. /**
  102. * 解密byte数组
  103. *
  104. * @param arrB 需解密的byte数组
  105. * @return 解密后的字节数组
  106. * @throws Exception
  107. */
  108. public byte[] decrypt(byte[] arrB) throws Exception {
  109. return decryptCipher.doFinal(arrB);
  110. }
  111.  
  112. /**
  113. * 加密字符串
  114. *
  115. * @param strIn 需加密的字符串
  116. * @return 加密后的字符串
  117. * @throws Exception
  118. */
  119. public String encrypt(String strIn) throws Exception {
  120. return byteArr2HexStr(encrypt(strIn.getBytes()));
  121. }
  122.  
  123. /**
  124. * 解密字符串
  125. *
  126. * @param strIn 需解密的字符串
  127. * @return 解密后的字符串
  128. * @throws Exception
  129. */
  130. public String decrypt(String strIn) throws Exception {
  131. return new String(decrypt(hexStr2ByteArr(strIn)));
  132. }
  133.  
  134. /**
  135. * 从指定字符串生成密钥,密钥所需的字节数组长度为8位 不足8位时后面补0,超出8位只取前8位
  136. *
  137. * @param arrBTmp 构成该字符串的字节数组
  138. * @return 生成的密钥
  139. * @throws Exception
  140. */
  141. private Key getKey(byte[] arrBTmp) throws Exception {
  142. // 创建一个空的8位字节数组(默认值为0)
  143. byte[] arrB = new byte[8];
  144. // 将原始字节数组转换为8位
  145. for (int i = 0; i < arrBTmp.length && i < arrB.length; i++) {
  146. arrB[i] = arrBTmp[i];
  147. }
  148. // 生成密钥
  149. Key key = new javax.crypto.spec.SecretKeySpec(arrB, "DES");
  150. return key;
  151. }
  152.  
  153. /**
  154. * main方法。
  155. */
  156. public static void main(String[] args) {
  157. try {
  158. String test = "123456789wagnb";
  159. DesUtil des = new DesUtil("leemenzz");//自定义密钥
  160. System.out.println("加密前的字符:" + test);
  161. System.out.println("加密后的字符:" + des.encrypt(test));
  162. System.out.println("解密后的字符:" + des.decrypt(des.encrypt(test)));
  163. System.out.println("解密后的字符:" + des.decrypt("e6fe1261b606850ef72d0b6dfbbc6a33"));
  164. }catch (Exception e) {
  165. e.printStackTrace();
  166. }
  167. }
  168. }

Java 实现字符串的加密与解密的更多相关文章

  1. java对字符串进行加密和解密(以下是来自其他博主)

    背景:需要对读取数据库配置的文件进行加密,防止他人拿到数据,而对自己的代码,有要实现进行解密,网上给的加密方式,什么MD5,base64,还有等等,都太复杂,而且有些是单向的,只加密不解密,以下代码, ...

  2. 【Java】通过DES加密和解密工具,对字符串进行加密和解密操作

    分享一个非常不错的字符串加密和解密的程序. 可以指定不同的密钥对同一字符串进行不同的加密操作,增强加密性能. Java代码如下: package com.app; import java.securi ...

  3. IOS, Android, Java Web Rest : RSA 加密和解密问题

    IOS, Android, Java Web Rest :  RSA 加密和解密问题 一对公钥私钥可以使用 OpenSSL创建, 通常 1024位长度够了. 注意: 1. 公钥私钥是BASE64编码的 ...

  4. JAVA中AES对称加密和解密以及与Python兼容

    引言:本文主要解决Java中用AES加密及解密,同时可通过Python脚本对Java加密后的字符进行解密的操作. 由于近期工作中用到需要使用Java对一串密钥进行加密,并且后台通过Python语言读取 ...

  5. MVC项目实践,在三层架构下实现SportsStore-10,连接字符串的加密和解密

    SportsStore是<精通ASP.NET MVC3框架(第三版)>中演示的MVC项目,在该项目中涵盖了MVC的众多方面,包括:使用DI容器.URL优化.导航.分页.购物车.订单.产品管 ...

  6. JAVA实现AES的加密和解密算法

    原文 JAVA实现AES的加密和解密算法 import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import ja ...

  7. ASP.NET数据库连接字符串的加密与解密

    ASP.NET web.config中,数据库连接字符串的加密与解密. 虽然不怎么新鲜,但相信还是有许多人不知道,好,不说废话,直接给方法:开始--->运行,输入cmd,接着输入以下内容 加密: ...

  8. Java实现文件的加密与解密

    最近在做一个项目,需要将资源文件(包括图片.动画等类型)进行简单的加密后再上传至云上的服务器,而在应用程序中对该资源使用前先将读取到的文件数据进行解密以得到真正的文件信息.此策略的原因与好处是将准备好 ...

  9. JavaScript前端和Java后端的AES加密和解密

    在实际开发项目中,有些数据在前后端的传输过程中需要进行加密,那就需要保证前端和后端的加解密需要统一.这里给大家简单演示AES在JavaScript前端和Java后端是如何实现加密和解密的. 直接上代码 ...

随机推荐

  1. BP神经网络与Python实现

    人工神经网络是一种经典的机器学习模型,随着深度学习的发展神经网络模型日益完善. 联想大家熟悉的回归问题, 神经网络模型实际上是根据训练样本创造出一个多维输入多维输出的函数, 并使用该函数进行预测, 网 ...

  2. 记号一下selenium+Firefox自动下载的参数

    参考: https://blog.csdn.net/wxstar8/article/details/80782556 https://blog.csdn.net/xiaoguanyusb/articl ...

  3. jscript DOM操作

    \n 换行符 \b 空格 \r 回车 && 与 || 或 ! 非(取反) classList属性 classList 属性返回元素的类名,作为 DOMTokenList 对象. 该属性 ...

  4. 【python深入】dict和list实现排序:sorted()和lambda的使用

    Python中经常需要对dict中的key值或者value值进行排序,可以通过sorted方法和lambda结合使用,接下来就是sorted()和lambda 一.sorted()和lambda so ...

  5. 通过django的rest-framework……(CBV)

    为什么不使用FBV,因为CBV重用性很高 先看一个例子: from django.views.generic.base import View from django.http import Http ...

  6. 手动添加jar包到本地maven仓库

    我们都知道使用maven管理jar包的时候,我们需要到远程仓库下载相关的jar包到本地仓库,但是如果远程仓库没有这个jar包呢?这时候我们就需要手动将jar包添加到本地仓库. 起因是我想用百度的富文本 ...

  7. 386. Lexicographical Numbers 输出1到n之间按lexico排列的数字序列

    [抄题]: Given an integer n, return 1 - n in lexicographical order. For example, given 13, return: [1,1 ...

  8. Python开发——【循环】语句

    while循环 while 条件: # 要执行的循环体 # 如果条件为真,那么循环体则执行 # 如果条件为假,那么循环体不执行 死循环 count = 0 while True:# 条件永远为真 pr ...

  9. 探索未知种族之osg类生物---呼吸分解之更新循环二

    _scene->updateSceneGraph(*_updateVisitor); 我们用了前面4节才刚刚算是完成对DatabasePager::DatabaseThread::run()函数 ...

  10. 201621123002《JAVA程序设计》第二周学习总结

    1.本周学习总结 1.重点String类 2.Java的数据类型 3.Java中的引用类,包装类 for(类型 元素变量名(任取):遍历对象(数组名)) 2.书面作业 1.String-使用Eclip ...