java 根据秘钥,对数据进行加解密
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 根据秘钥,对数据进行加解密的更多相关文章
- 使用JDK中的安全包对数据进行加解密
本文以使用DES对称加密算法为例使用jdk对数据进行加密解密. 首先需要了解Provider类,它是jdk引入的密码服务提供者概念,实现了Java安全性的一部分或者全部.Provider 可能实现的服 ...
- SpringBoot中如何灵活的实现接口数据的加解密功能?
数据是企业的第四张名片,企业级开发中少不了数据的加密传输,所以本文介绍下SpringBoot中接口数据加密.解密的方式. 本文目录 一.加密方案介绍二.实现原理三.实战四.测试五.踩到的坑 一.加密方 ...
- C#实现SHA256WithRSA加密用于Java的秘钥私钥
首先要把Java秘钥进行转换,然后再进行加密 转制秘钥的方法 public static string RSAPrivateKeyJava2DotNet(string privateKey) { Rs ...
- Java实验五报告——TCP传输及加解密
一.实验内容 1.运行教材上TCP代码,结对进行,一人服务器,一人客户端: 2.利用加解密代码包,编译运行代码,一人加密,一人解密: 3.集成代码,一人加密后通过TCP发送: 注:加密使用AES或者D ...
- Mybatis使用TypeHandler实现数据的加解密转换
参考: MyBatis之TypeHandler: https://www.cnblogs.com/yulinfeng/p/5991170.html 前段时间收到这么个需求:为安全起见,要求在数据库 ...
- java实现根据特定密钥对字符串进行加解密功能
在项目中我们经常遇到这样的场景,我们避免重要资源泄露需要将一些信息按照特定的方式(密钥)进行加密保存,然后在使用的时候再按照特定的方式(密钥)进行解密读取,以保证信息的相对安全.那么如何对信息进行加解 ...
- Java、C#双语版配套AES加解密示例
这年头找个正经能用的东西那是真难,网上一搜索一大堆,正经能用的没几个,得,最后还是得靠自己,正巧遇上需要AES加解密的地方了,而且还是Java和C#间的相互加解密操作,这里做个备忘 这里采用的加解 ...
- 转载:Java、C#双语版配套AES加解密示例
转载,原文出处 http://www.cnblogs.com/lzrabbit/p/3639503.html 这年头找个正经能用的东西那是真难,网上一搜索一大堆,正经能用的没几个,得,最后还是得靠自己 ...
- 怎样用Java代码来把SSL的证书自己主动导入到Java的秘钥存储文件(keystore)
我们在开发或者使用SSL的过程中,非常多的软件须要我们提供java的keystore.特别是一些基于Java的中间件产品. 我们常规的做法是JDK自带的工具命令(keytool)去做.比方,以下的样例 ...
随机推荐
- 读书笔记--Head First 设计模式 目录
1.设计模式入门 2.观察者模式 3.装饰者模式 4.工厂模式 5.单件模式 6.命令模式 7.适配器模式与外观模式 8.模板方法模式 9.迭代器与组合模式 10.状态模式 11.代理模式 12.复合 ...
- netbeans性能分析文件保存位置
C:\Users\Administrator\AppData\Roaming\NetBeans\8.2\config\HTTPMonitor 分析完,记得把文件删除,不然系统盘要满了
- nyoj zb的生日【背包型DFS/选or不选】
zb的生日 时间限制:3000 ms | 内存限制:65535 KB 难度:2 描述 今天是阴历七月初五,acm队员zb的生日.zb正在和C小加.never在武汉集训.他想给这两位兄弟买点什么 ...
- appium+python 启动一个app步骤
询问度娘搭好appium和python环境,开启移动app自动化的探索(基于Android),首先来记录下如何启动待测的app吧! 如何启动APP?1.获取包名:2.获取launcherActivit ...
- IbatchBolt和BaseTransactionalBolt区别
void prepare(java.util.Map conf, TopologyContext context, BatchOutputCollector collector, T id) T id ...
- Uva437 The Tower of Babylon
https://odzkskevi.qnssl.com/5e1fdf8cae5d11a8f572bae96d6095c0?v=1507521965 Perhaps you have heard of ...
- Laravel 中 offset,limit 或 skip , take 的使用
laravel 本身有一个自带的快速分页方法 paginate,只需要传入每页显示多少条数据就可以 了,但是如果想使用自定义从哪里开始呢. 一.offset,limit (offset 设置从哪里开始 ...
- SpringBoot启动报错Failed to determine a suitable driver class
SpringBoot启动报错如下 Error starting ApplicationContext. To display the conditions report re-run your app ...
- SDUT-3398_数据结构实验之排序一:一趟快排
数据结构实验之排序一:一趟快排 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 给定N个长整型范围内的整数,要求输出以给 ...
- JSP Web第五章整理复习 JSP访问数据库
P164 例5-1 常用SQL语句 P178 数据库连接池 (1)连接池的作用 存储多个数据库连接对象,当程序需要时,从池中获取1个连接,程序执行完成后再还给连接池.避免数据库连接建立.关闭的开 ...