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)去做.比方,以下的样例 ...
随机推荐
- 使用nodejs安装http-server
一.下载nodejs(https://nodejs.org/) 二.在环境变量中配置nodejs路径: path: D:\Program\nodejs\ 三.打开终端: 使用node -v测试node ...
- Git的基本了解与使用、向github提交代码
#Git的基本了解与使用.向github提交代码- git:是一个版本控制系统.- github:一个代码托管提供商.开源网站.是一个面向开源及私有软件项目的托管平台,因为支持Git作为唯一的版本库格 ...
- jnhs-java实体类的有参构造器 无参构造器Could not instantiate bean class 实体类No default constructor found
new一个对象的时候要用到构造函数, 例如Hello hello = new Hello();这时调用的是Hello的无参数构造方法; Hello hello = new Hello("hi ...
- 【Django入坑之路】Models操作
1:字段 AutoField(Field) - int自增列,必须填入参数 primary_key=True BigAutoField(AutoField) - bigint自增列,必须填入参数 pr ...
- Codeforces Round #436 (Div. 2) 题解864A 864B 864C 864D 864E 864F
A. Fair Game time limit per test 1 second memory limit per test 256 megabytes input standard input o ...
- 用 Python 写一个 NoSQL 数据库Python
NoSQL 这个词在近些年正变得随处可见. 但是到底 “NoSQL” 指的是什么? 它是如何并且为什么这么有用? 在本文, 我们将会通过纯 Python (我比较喜欢叫它, “轻结构化的伪代码”) 写 ...
- CTSC2016时空旅行
当时看这道题AC的人数比较多,就开了这道题. 很容易发现是这是一个有关凸包的题. 然后不知道怎么维护凸包,一直在想cdq,感觉复杂度不行,于是被这玩意难住了…… 幸好有亲学长yyh造福人类的题解:ht ...
- js实现翻转一个字符串
字符串作在程序中是非常常见的,因为程序中绝大部分的数据都可以当作字符串来处理.在这里介绍几种翻转字符串的方法. (1)使用字符串函数 //使用数组翻转函数 function reverseString ...
- 第十章—DOM(一)——Document类型
DOCUMENT类型 JS通过document类型表示文档,在文档中document对象是HTMLDocument的一个实例,表示整个HTML页面.document对象是window对象的一个属性,因 ...
- SVN 打包时,出现File not found: transaction '148-48', path ''https://xxxxxx/svn/xxxxx/tag/2017-9-30'
svn打包时,出现错误如下: 解决办法: 在SVN目录结构中,增加tag这个目录.