package test;

import com.alibaba.fastjson.JSONObject;

import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder; import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec; import org.apache.commons.lang.StringUtils; import java.io.IOException;
import java.net.URLEncoder;
import java.security.SecureRandom; public class FpayEncryTool { private final static String ENCODE = "GBK";
private final static String DES = "DES";
private final static int keyLengthMax=24; //对数据进行加密
//type:pay,refund
public static String encryFpayData(String key,String data) throws Exception {
//将数据转为json验证数据有效性 JSONObject jsonStr = JSONObject.parseObject(data);
if(jsonStr.get("type").equals("pay")){
if(jsonStr.get("order_amount")==null||!StringUtils.isNumeric(jsonStr.get("order_amount").toString())){
return null;
}
if(jsonStr.get("product_name")==null||(jsonStr.get("product_name")).toString().length()>100){
return null;
}
if(jsonStr.get("order_info")==null||(jsonStr.get("order_info")).toString().length()>100){
return null;
}
if(jsonStr.get("auth_code")==null||(jsonStr.get("auth_code")).toString().length()>128){
return null;
}
if(jsonStr.get("order_no")==null||(jsonStr.get("order_no")).toString().length()>30){
return null;
}
}else if(jsonStr.get("type").equals("refund")){
if(jsonStr.get("order_no")==null||(jsonStr.get("order_no")).toString().length()>30){
return null;
}
if(jsonStr.get("ref_desc")==null||(jsonStr.get("ref_desc")).toString().length()>30){
return null;
}
}else if(jsonStr.get("type").equals("result")){ }else{
return null;
}
return encrypt(data, key); } //对数据进行解密
public static String decrypFpayData(String key,String data) throws Exception {
return decrypt(data,key);
} /**
* Description 根据键值进行加密
* @param data 待加密数据
* @param key 密钥
* @return
* @throws Exception
*/
public static String encrypt(String data, String key) throws Exception {
byte[] bt = encrypt(data.getBytes(ENCODE), key.getBytes(ENCODE));
String strs = new BASE64Encoder().encode(bt);
return strs;
} /**
* 根据键值进行解密
* @param data 待解密数据
* @param key 密钥
* @return
* @throws IOException
* @throws Exception
*/
public static String decrypt(String data, String key) throws IOException,
Exception {
if (data == null)
return null;
BASE64Decoder decoder = new BASE64Decoder();
byte[] buf = decoder.decodeBuffer(data);
byte[] bt = decrypt(buf, key.getBytes(ENCODE));
return new String(bt, ENCODE);
} /**
* Description 根据键值进行加密
*
* @param data
* @param key
* 加密键byte数组
* @return
* @throws Exception
*/
private static byte[] encrypt(byte[] data, byte[] key) throws Exception {
key=extendKey(key); // 生成一个可信任的随机数源
SecureRandom sr = new SecureRandom(); // 从原始密钥数据创建DESKeySpec对象
DESKeySpec dks = new DESKeySpec(key); // 创建一个密钥工厂,然后用它把DESKeySpec转换成SecretKey对象
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(DES);
SecretKey securekey = keyFactory.generateSecret(dks); // Cipher对象实际完成加密操作
Cipher cipher = Cipher.getInstance(DES); // 用密钥初始化Cipher对象
cipher.init(Cipher.ENCRYPT_MODE, securekey, sr); return cipher.doFinal(data);
} public static byte[] extendKey(byte[] key) {
//System.out.println("length:"+key.length);
byte[] tmpKey = new byte[keyLengthMax];
if (key.length < keyLengthMax) { // short key ? .. extend to 24 byte key
int i;int iMax=(int)(keyLengthMax/key.length);int iRem=(int)(keyLengthMax%key.length);
System.arraycopy(key, 0, tmpKey, 0,iRem+1);
//System.out.println(" begI:"+0+" endI:"+(iRem));
for(i=0;i<iMax;i++) {
//System.out.println("i:"+i+" begI:"+(i*key.length+iRem)+" endI:"+(i*key.length+iRem+key.length));
//System.out.println("keyL:"+key.length+" temL:"+tmpKey.length);
System.arraycopy(key, 0, tmpKey, i*key.length+iRem, key.length);
}
}else {
System.arraycopy(key, 0, tmpKey, 0,keyLengthMax);
}
return tmpKey;
} /**
* Description 根据键值进行解密
*
* @param data
* @param key 加密键byte数组
* @return
* @throws Exception
*/
private static byte[] decrypt(byte[] data, byte[] key) throws Exception {
key=extendKey(key);
// 生成一个可信任的随机数源
SecureRandom sr = new SecureRandom(); // 从原始密钥数据创建DESKeySpec对象
DESKeySpec dks = new DESKeySpec(key); // 创建一个密钥工厂,然后用它把DESKeySpec转换成SecretKey对象
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(DES);
SecretKey securekey = keyFactory.generateSecret(dks); // Cipher对象实际完成解密操作
Cipher cipher = Cipher.getInstance(DES); // 用密钥初始化Cipher对象
cipher.init(Cipher.DECRYPT_MODE, securekey, sr); return cipher.doFinal(data);
} public static void main(String[] args){
/*String data = "12AUism810jsqASI08";
String key ="qwerrewq";
System.out.println("加密前===>"+data);
try {
//System.err.println(encrypt(data, key));
//System.err.println(decrypt(encrypt(data, key), key));
String jiamihou = encrypt(data,key);
System.out.println("加密后===>"+jiamihou);
System.out.println("解密后===>"+decrypt(jiamihou,key));
} catch (Exception e) {
e.printStackTrace();
}*/
String temp;
// temp="{'order_amount':'1','product_name':'测试','order_info':'测试加解密','auth_code':'285192674239050687','order_no':'201905140953','type':'pay'}";
temp="{'order_no':'TY_YH_ali_1557814483393_61','ref_desc':'测试退款退款','type':'refund'}";
String key="544646"; String str1=null;
String str2=null;
try {
str1=FpayEncryTool.encryFpayData(key,temp);
str2=FpayEncryTool.decrypFpayData(key,str1);
} catch (Exception e) {
e.printStackTrace();
}
JSONObject jsonStr = JSONObject.parseObject(str2);
System.out.println("str1:"+str1);
System.out.println("str1转译:"+URLEncoder.encode(str1));
System.out.println("str2:"+str2);
System.out.println("type:"+jsonStr.get("type"));
} //将结果对特殊字符转译 }

打印结果如下

 打印结果:
str1:obbHcSjVYQ3rA1CTMYObuFd9zGSvMgfItZGv9MjceSPJa+0HQh1gC/PtgjOsodOxgyaudtddP2Dk
NfiiDN/w0SK6PGpPD9PgTZQiAF4AKvUea29Bae/B2Q==
str1转译:obbHcSjVYQ3rA1CTMYObuFd9zGSvMgfItZGv9MjceSPJa%2B0HQh1gC%2FPtgjOsodOxgyaudtddP2Dk%0D%0ANfiiDN%2Fw0SK6PGpPD9PgTZQiAF4AKvUea29Bae%2FB2Q%3D%3D
str2:{'order_no':'TY_YH_ali_1557814483393_61','ref_desc':'测试退款退款','type':'refund'}
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. PhpExcel参考网址

    参考网址: http://www.cnblogs.com/yuwensong/p/3771787.html

  2. Hdu 1403(后缀数组)

    题目链接 Longest Common Substring Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 65536/32768 K ...

  3. 使用 git 及 github

    1.github 开户.创建项目 2.以下是本地操作: #初始本地库 git init#设置git的全局邮箱和用户名git config --global user.email "<e ...

  4. JEECMS二次开发 -------标签使用说明

    转载:https://blog.csdn.net/u012176984/article/details/45501771 一:标签套用结构说明 登录后台管理页面,这些嵌套在html中的标签 以[@标签 ...

  5. JavaScript 面试:什么是纯函数?

    原文:Eric Elliott  译文:众成翻译 www.zcfy.cc/article/master-the-javascript-interview-what-is-a-pure-function ...

  6. Python服务端工程师就业面试指导

    Python服务端工程师就业面试指导 整个课程都看完了,这个课程的分享可以往下看,下面有链接,之前做java开发也做了一些年头,也分享下自己看这个视频的感受,单论单个知识点课程本身没问题,大家看的时候 ...

  7. 未加星标 ajax三级联动的实现方法

    <div id="sanji"></div> 下面考虑的是要有省市区这三列,这三列用的是下拉列表,那么里面要用<option></opti ...

  8. Python 字符编码处理总结

    Python中经常遇到这样那样的字符编码问题,尤其在处理网页源码时(特别是爬虫中): UnicodeDecodeError: 'XXX' codec can't decode bytes in pos ...

  9. Linux常用命令6 压缩解压命令

    .zip是Linux和Windows共有的压缩格式 1.压缩解压命令:gzip 命令英文原意:GNU zip   命令所在路径:/bin/gzip 执行权限:所有用户 语法: gzip [文件]   ...

  10. Hdu 4143

    题目链接 好久没有在Hdu水题了,于是乎在无聊之际还是找了一道水题, 但是看完题目之后,明显是个数学题,我还是感觉有点打触的. 因为一直对数学题没有多大信心. 分析了一下,Y^2 = X^2 + n ...