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)去做.比方,以下的样例 ...
随机推荐
- laravel--request类获取传值
request类获取传值 Request类的方法很多,常用的有如下几个: Request -> all() : 表示一次性获取所有的传值(包括get和post,但不能获取参数) Request ...
- 前端(jQuery)(9)-- jQuery菜单
1.垂直菜单布局 2.垂直菜单实现 <!DOCTYPE html> <html lang="en"> <head> <meta chars ...
- jquery源码学习(四)—— jquery.extend()
a.jQuery.extend( source ) b.jQuery.extend(destination, source1, source2, source3 ....) c.jQuery.exte ...
- LintCode刷题笔记-- PaintHouse 1&2
标签: 动态规划 题目描述: There are a row of n houses, each house can be painted with one of the k colors. The ...
- Python执行时间的计算方法小结
Python执行时间的计算方法小结 首先说一下我遇到的坑,生产上遇到的问题,我调度Python脚本执行并监控这个进程,python脚本运行时间远远大于python脚本中自己统计的程序执行时间. 监控p ...
- git之操作准则
每天下班前合一次代码,每次合代码先pull 不要多人同时修改同一个文件,避免冲突 在每个人自己的分支进行开发,先合并到dev分支解决冲突,确认无冲突后再合并到master
- 那些年,我们见过的Java服务端乱象
导读 查尔斯·狄更斯在<双城记>中写道:“这是一个最好的时代,也是一个最坏的时代.”移动互联网的快速发展,出现了许多新机遇,很多创业者伺机而动:随着行业竞争加剧,互联网红利逐渐消失,很多创 ...
- php 简单加密解密
<?php namespace App\Service; /* * @link http://kodcloud.com/ * @author warlee | e-mail:kodcloud@q ...
- Python学习笔记(三)Python基本数字类型及其简单操作(1)
一.数字类型 表示数字或数值的数据类型称为数字类型,Python语言提供3种数字类型:整数.浮点数和复数,分别对应数学中的整数.实数和复数,下面就一起来了解一下他们吧! 1.整数类型 整数类型与数学中 ...
- git解决冲突的最佳方法2
1.冲突后和远程仓库的文件进行比对的时候,善于用上图所示的按钮,会提高效率 copy all-nonconflicting changes from right to left next differ ...