1. package test;
  2.  
  3. import com.alibaba.fastjson.JSONObject;
  4.  
  5. import sun.misc.BASE64Decoder;
  6. import sun.misc.BASE64Encoder;
  7.  
  8. import javax.crypto.Cipher;
  9. import javax.crypto.SecretKey;
  10. import javax.crypto.SecretKeyFactory;
  11. import javax.crypto.spec.DESKeySpec;
  12.  
  13. import org.apache.commons.lang.StringUtils;
  14.  
  15. import java.io.IOException;
  16. import java.net.URLEncoder;
  17. import java.security.SecureRandom;
  18.  
  19. public class FpayEncryTool {
  20.  
  21. private final static String ENCODE = "GBK";
  22. private final static String DES = "DES";
  23. private final static int keyLengthMax=24;
  24.  
  25. //对数据进行加密
  26. //type:pay,refund
  27. public static String encryFpayData(String key,String data) throws Exception {
  28. //将数据转为json验证数据有效性
  29.  
  30. JSONObject jsonStr = JSONObject.parseObject(data);
  31. if(jsonStr.get("type").equals("pay")){
  32. if(jsonStr.get("order_amount")==null||!StringUtils.isNumeric(jsonStr.get("order_amount").toString())){
  33. return null;
  34. }
  35. if(jsonStr.get("product_name")==null||(jsonStr.get("product_name")).toString().length()>100){
  36. return null;
  37. }
  38. if(jsonStr.get("order_info")==null||(jsonStr.get("order_info")).toString().length()>100){
  39. return null;
  40. }
  41. if(jsonStr.get("auth_code")==null||(jsonStr.get("auth_code")).toString().length()>128){
  42. return null;
  43. }
  44. if(jsonStr.get("order_no")==null||(jsonStr.get("order_no")).toString().length()>30){
  45. return null;
  46. }
  47. }else if(jsonStr.get("type").equals("refund")){
  48. if(jsonStr.get("order_no")==null||(jsonStr.get("order_no")).toString().length()>30){
  49. return null;
  50. }
  51. if(jsonStr.get("ref_desc")==null||(jsonStr.get("ref_desc")).toString().length()>30){
  52. return null;
  53. }
  54. }else if(jsonStr.get("type").equals("result")){
  55.  
  56. }else{
  57. return null;
  58. }
  59. return encrypt(data, key);
  60.  
  61. }
  62.  
  63. //对数据进行解密
  64. public static String decrypFpayData(String key,String data) throws Exception {
  65. return decrypt(data,key);
  66. }
  67.  
  68. /**
  69. * Description 根据键值进行加密
  70. * @param data 待加密数据
  71. * @param key 密钥
  72. * @return
  73. * @throws Exception
  74. */
  75. public static String encrypt(String data, String key) throws Exception {
  76. byte[] bt = encrypt(data.getBytes(ENCODE), key.getBytes(ENCODE));
  77. String strs = new BASE64Encoder().encode(bt);
  78. return strs;
  79. }
  80.  
  81. /**
  82. * 根据键值进行解密
  83. * @param data 待解密数据
  84. * @param key 密钥
  85. * @return
  86. * @throws IOException
  87. * @throws Exception
  88. */
  89. public static String decrypt(String data, String key) throws IOException,
  90. Exception {
  91. if (data == null)
  92. return null;
  93. BASE64Decoder decoder = new BASE64Decoder();
  94. byte[] buf = decoder.decodeBuffer(data);
  95. byte[] bt = decrypt(buf, key.getBytes(ENCODE));
  96. return new String(bt, ENCODE);
  97. }
  98.  
  99. /**
  100. * Description 根据键值进行加密
  101. *
  102. * @param data
  103. * @param key
  104. * 加密键byte数组
  105. * @return
  106. * @throws Exception
  107. */
  108. private static byte[] encrypt(byte[] data, byte[] key) throws Exception {
  109. key=extendKey(key);
  110.  
  111. // 生成一个可信任的随机数源
  112. SecureRandom sr = new SecureRandom();
  113.  
  114. // 从原始密钥数据创建DESKeySpec对象
  115. DESKeySpec dks = new DESKeySpec(key);
  116.  
  117. // 创建一个密钥工厂,然后用它把DESKeySpec转换成SecretKey对象
  118. SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(DES);
  119. SecretKey securekey = keyFactory.generateSecret(dks);
  120.  
  121. // Cipher对象实际完成加密操作
  122. Cipher cipher = Cipher.getInstance(DES);
  123.  
  124. // 用密钥初始化Cipher对象
  125. cipher.init(Cipher.ENCRYPT_MODE, securekey, sr);
  126.  
  127. return cipher.doFinal(data);
  128. }
  129.  
  130. public static byte[] extendKey(byte[] key) {
  131. //System.out.println("length:"+key.length);
  132. byte[] tmpKey = new byte[keyLengthMax];
  133. if (key.length < keyLengthMax) { // short key ? .. extend to 24 byte key
  134. int i;int iMax=(int)(keyLengthMax/key.length);int iRem=(int)(keyLengthMax%key.length);
  135. System.arraycopy(key, 0, tmpKey, 0,iRem+1);
  136. //System.out.println(" begI:"+0+" endI:"+(iRem));
  137. for(i=0;i<iMax;i++) {
  138. //System.out.println("i:"+i+" begI:"+(i*key.length+iRem)+" endI:"+(i*key.length+iRem+key.length));
  139. //System.out.println("keyL:"+key.length+" temL:"+tmpKey.length);
  140. System.arraycopy(key, 0, tmpKey, i*key.length+iRem, key.length);
  141. }
  142. }else {
  143. System.arraycopy(key, 0, tmpKey, 0,keyLengthMax);
  144. }
  145. return tmpKey;
  146. }
  147.  
  148. /**
  149. * Description 根据键值进行解密
  150. *
  151. * @param data
  152. * @param key 加密键byte数组
  153. * @return
  154. * @throws Exception
  155. */
  156. private static byte[] decrypt(byte[] data, byte[] key) throws Exception {
  157. key=extendKey(key);
  158. // 生成一个可信任的随机数源
  159. SecureRandom sr = new SecureRandom();
  160.  
  161. // 从原始密钥数据创建DESKeySpec对象
  162. DESKeySpec dks = new DESKeySpec(key);
  163.  
  164. // 创建一个密钥工厂,然后用它把DESKeySpec转换成SecretKey对象
  165. SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(DES);
  166. SecretKey securekey = keyFactory.generateSecret(dks);
  167.  
  168. // Cipher对象实际完成解密操作
  169. Cipher cipher = Cipher.getInstance(DES);
  170.  
  171. // 用密钥初始化Cipher对象
  172. cipher.init(Cipher.DECRYPT_MODE, securekey, sr);
  173.  
  174. return cipher.doFinal(data);
  175. }
  176.  
  177. public static void main(String[] args){
  178. /*String data = "12AUism810jsqASI08";
  179. String key ="qwerrewq";
  180. System.out.println("加密前===>"+data);
  181. try {
  182. //System.err.println(encrypt(data, key));
  183. //System.err.println(decrypt(encrypt(data, key), key));
  184. String jiamihou = encrypt(data,key);
  185. System.out.println("加密后===>"+jiamihou);
  186. System.out.println("解密后===>"+decrypt(jiamihou,key));
  187. } catch (Exception e) {
  188. e.printStackTrace();
  189. }*/
  190. String temp;
  191. // temp="{'order_amount':'1','product_name':'测试','order_info':'测试加解密','auth_code':'285192674239050687','order_no':'201905140953','type':'pay'}";
  192. temp="{'order_no':'TY_YH_ali_1557814483393_61','ref_desc':'测试退款退款','type':'refund'}";
  193. String key="544646";
  194.  
  195. String str1=null;
  196. String str2=null;
  197. try {
  198. str1=FpayEncryTool.encryFpayData(key,temp);
  199. str2=FpayEncryTool.decrypFpayData(key,str1);
  200. } catch (Exception e) {
  201. e.printStackTrace();
  202. }
  203. JSONObject jsonStr = JSONObject.parseObject(str2);
  204. System.out.println("str1:"+str1);
  205. System.out.println("str1转译:"+URLEncoder.encode(str1));
  206. System.out.println("str2:"+str2);
  207. System.out.println("type:"+jsonStr.get("type"));
  208. }
  209.  
  210. //将结果对特殊字符转译
  211.  
  212. }

打印结果如下

  1. 打印结果:
  2. str1:obbHcSjVYQ3rA1CTMYObuFd9zGSvMgfItZGv9MjceSPJa+0HQh1gC/PtgjOsodOxgyaudtddP2Dk
  3. NfiiDN/w0SK6PGpPD9PgTZQiAF4AKvUea29Bae/B2Q==
  4. str1转译:obbHcSjVYQ3rA1CTMYObuFd9zGSvMgfItZGv9MjceSPJa%2B0HQh1gC%2FPtgjOsodOxgyaudtddP2Dk%0D%0ANfiiDN%2Fw0SK6PGpPD9PgTZQiAF4AKvUea29Bae%2FB2Q%3D%3D
  5. str2:{'order_no':'TY_YH_ali_1557814483393_61','ref_desc':'测试退款退款','type':'refund'}
  6. type:refund

如果通过post发送数据,记得转码

java 根据秘钥,对数据进行加解密的更多相关文章

  1. 使用JDK中的安全包对数据进行加解密

    本文以使用DES对称加密算法为例使用jdk对数据进行加密解密. 首先需要了解Provider类,它是jdk引入的密码服务提供者概念,实现了Java安全性的一部分或者全部.Provider 可能实现的服 ...

  2. SpringBoot中如何灵活的实现接口数据的加解密功能?

    数据是企业的第四张名片,企业级开发中少不了数据的加密传输,所以本文介绍下SpringBoot中接口数据加密.解密的方式. 本文目录 一.加密方案介绍二.实现原理三.实战四.测试五.踩到的坑 一.加密方 ...

  3. C#实现SHA256WithRSA加密用于Java的秘钥私钥

    首先要把Java秘钥进行转换,然后再进行加密 转制秘钥的方法 public static string RSAPrivateKeyJava2DotNet(string privateKey) { Rs ...

  4. Java实验五报告——TCP传输及加解密

    一.实验内容 1.运行教材上TCP代码,结对进行,一人服务器,一人客户端: 2.利用加解密代码包,编译运行代码,一人加密,一人解密: 3.集成代码,一人加密后通过TCP发送: 注:加密使用AES或者D ...

  5. Mybatis使用TypeHandler实现数据的加解密转换

    参考: MyBatis之TypeHandler: https://www.cnblogs.com/yulinfeng/p/5991170.html   前段时间收到这么个需求:为安全起见,要求在数据库 ...

  6. java实现根据特定密钥对字符串进行加解密功能

    在项目中我们经常遇到这样的场景,我们避免重要资源泄露需要将一些信息按照特定的方式(密钥)进行加密保存,然后在使用的时候再按照特定的方式(密钥)进行解密读取,以保证信息的相对安全.那么如何对信息进行加解 ...

  7. Java、C#双语版配套AES加解密示例

      这年头找个正经能用的东西那是真难,网上一搜索一大堆,正经能用的没几个,得,最后还是得靠自己,正巧遇上需要AES加解密的地方了,而且还是Java和C#间的相互加解密操作,这里做个备忘 这里采用的加解 ...

  8. 转载:Java、C#双语版配套AES加解密示例

    转载,原文出处 http://www.cnblogs.com/lzrabbit/p/3639503.html 这年头找个正经能用的东西那是真难,网上一搜索一大堆,正经能用的没几个,得,最后还是得靠自己 ...

  9. 怎样用Java代码来把SSL的证书自己主动导入到Java的秘钥存储文件(keystore)

    我们在开发或者使用SSL的过程中,非常多的软件须要我们提供java的keystore.特别是一些基于Java的中间件产品. 我们常规的做法是JDK自带的工具命令(keytool)去做.比方,以下的样例 ...

随机推荐

  1. laravel--request类获取传值

    request类获取传值 Request类的方法很多,常用的有如下几个: Request -> all() : 表示一次性获取所有的传值(包括get和post,但不能获取参数) Request ...

  2. 前端(jQuery)(9)-- jQuery菜单

    1.垂直菜单布局 2.垂直菜单实现 <!DOCTYPE html> <html lang="en"> <head> <meta chars ...

  3. jquery源码学习(四)—— jquery.extend()

    a.jQuery.extend( source ) b.jQuery.extend(destination, source1, source2, source3 ....) c.jQuery.exte ...

  4. LintCode刷题笔记-- PaintHouse 1&2

    标签: 动态规划 题目描述: There are a row of n houses, each house can be painted with one of the k colors. The ...

  5. Python执行时间的计算方法小结

    Python执行时间的计算方法小结 首先说一下我遇到的坑,生产上遇到的问题,我调度Python脚本执行并监控这个进程,python脚本运行时间远远大于python脚本中自己统计的程序执行时间. 监控p ...

  6. git之操作准则

    每天下班前合一次代码,每次合代码先pull 不要多人同时修改同一个文件,避免冲突 在每个人自己的分支进行开发,先合并到dev分支解决冲突,确认无冲突后再合并到master

  7. 那些年,我们见过的Java服务端乱象

    导读 查尔斯·狄更斯在<双城记>中写道:“这是一个最好的时代,也是一个最坏的时代.”移动互联网的快速发展,出现了许多新机遇,很多创业者伺机而动:随着行业竞争加剧,互联网红利逐渐消失,很多创 ...

  8. php 简单加密解密

    <?php namespace App\Service; /* * @link http://kodcloud.com/ * @author warlee | e-mail:kodcloud@q ...

  9. Python学习笔记(三)Python基本数字类型及其简单操作(1)

    一.数字类型 表示数字或数值的数据类型称为数字类型,Python语言提供3种数字类型:整数.浮点数和复数,分别对应数学中的整数.实数和复数,下面就一起来了解一下他们吧! 1.整数类型 整数类型与数学中 ...

  10. git解决冲突的最佳方法2

    1.冲突后和远程仓库的文件进行比对的时候,善于用上图所示的按钮,会提高效率 copy all-nonconflicting changes from right to left next differ ...