java数字加密算法
数字加密在项目中时常会遇到,如手机号,身份证号信息等,下面小白将自己手写的数字加密算法分享给大家,可在项目中直接运用.
加密规则,入参时传递一个字段时间戳 time:
* 1.以字母代替数字,0-9分别为["D","e","C","A","#","b","J","I","z","M"]
* 2.混淆字母为FxYNgq;
* 3.加密字符串等于初始数字加时间戳乘以数字密钥(5658116)再把数字结果转换成字母;
* 4.对于加密字符串长度小于总加密字符串长度(32)的随机插入混淆字母
例:(15755141030 + 1544769549545)*5658116=8829629720137456700-->再转换成字母 qFzzYFCMJYqCMgICDNxFeAqI#bJgIFDD;
package com.example.demo.t2;
import java.util.regex.Pattern; /**
* Created by ypf on 2018/12/14.
*/
public class Test { //数字秘钥
private final static long SECRET_KEY = 5658116;
//转换字符(0-9分别为["D","e","C","A","#","b","J","I","z","M"]
private final static String CONVERT_KEY = "DeCA#bJIzM";
//混淆字母
private final static String CONFUSED_WORDS_KEY = "FxYNgq";
//总加密字符串长度
private final static int LEN_KEY = 32; /**
* 数字加密算法
**/
public String encrypt(String str,long time){ //数字校验
if(!isNumber(str)){
System.out.println(str + "不是数字");
return null;
} long number = Long.parseLong(str);
long newNumber = (number + time) * SECRET_KEY;
String[] numArr = String.valueOf(newNumber).split("");
String[] initArr = CONVERT_KEY.split("");
int len = numArr.length;
StringBuffer buffer = new StringBuffer(); //数字转字母
for(int i = 0; i < len; i++){
int inx = Integer.parseInt(numArr[i]);
buffer.append(initArr[inx]);
} //随机加入混淆字符
String[] cwkArr = CONFUSED_WORDS_KEY.split("");
if(len < LEN_KEY){
int l = LEN_KEY - len;
for(int i = 0; i < l; i++){
int index = (int)(Math.random()*buffer.length());
int inx = (int)(Math.random()*(CONFUSED_WORDS_KEY.length()));
buffer.insert(index,cwkArr[inx]);
}
}
String result = buffer.toString();
System.out.println("加密字符串:" + result);
return result;
} /**
* 解密算法
* */
public String decrypt(String str,long time){
if(null == str || "".equals(str)){
System.out.println("参数为空");
return null;
}
int l = CONFUSED_WORDS_KEY.length();
String[] cwkArr = CONFUSED_WORDS_KEY.split("");
for(int i = 0; i < l; i++){
str = str.replaceAll(cwkArr[i],"");
}
String[] initArr = str.split("");
int len = initArr.length;
StringBuffer result = new StringBuffer();
for(int i = 0; i < len; i++ ){
int k = CONVERT_KEY.indexOf(initArr[i]);
if(k == -1){
System.out.println("转化失败:" + str);
return null;
}
result.append(k);
}
Long number;
try {
long total = Long.parseLong(result.toString());
long sum = total/SECRET_KEY;
number = sum - time;
System.out.println("解密后数字:" + number);
} catch (NumberFormatException e) {
e.printStackTrace();
return null;
}
return number.toString();
} /**
* 测试
**/
public static void main(String[] args) {
long time = System.currentTimeMillis();
System.out.println("time:" + time);
Test t = new Test();
String number = "15755141030";
System.out.println(number);
String result = t.encrypt(number,time);
t.decrypt(result,time);
} /**
* 数字校验
* */
public static boolean isNumber(String value) {
String pattern = "^[0-9]*[1-9][0-9]*$";
boolean isMatch = Pattern.matches(pattern, value);
return isMatch;
}
}
运行结果如下:
Connected to the target VM, address: '127.0.0.1:62962', transport: 'socket'
time:1544769549545
15755141030
加密字符串:qFzzYFCMJYqCMgICDNxFeAqI#bJgIFDD
解密后数字:15755141030
Disconnected from the target VM, address: '127.0.0.1:62962', transport: 'socket' Process finished with exit code 0
总结:此加密算法虽然简单,但加密思想和加密原理值得学习,可以随意修改数字秘钥、转换字符、混淆字母、总加密字符串长度,并用于项目中。
java数字加密算法的更多相关文章
- Java数字格式化输出时前面补0
Java数字格式化输出时前面补0 星期日 2014年11月30日| 分类: Java /** * 里数字转字符串前面自动补0的实现. * */ public class TestString ...
- java HMAC_SHA1加密算法
java HMAC_SHA1加密算法 CreationTime--2018年7月14日16点46分 Author:Marydon 1.准备工作 import javax.crypto.Mac; i ...
- java sm3加密算法
java sm3加密算法实现 CreationTime--2018年7月13日09点28分 Author:Marydon 1.准备工作 所需jar包: bcprov-jdk15on-1.59.ja ...
- java单向加密算法小结(1)--Base64算法
从这一篇起整理一下常见的加密算法以及在java中使用的demo,首先从最简单的开始. 简单了解 Base64严格来说并不是一种加密算法,而是一种编码/解码的实现方式. 我们都知道,数据在计算机网络之间 ...
- java基本加密算法
简单的java加密算法有: BASE64 严格地说,属于编码格式,而非加密算法 MD5(Message Digest algorithm 5,信息摘要算法) SHA(Secure Hash Algor ...
- JAVA 上加密算法的实现用例---转载
通常 , 使用的加密算法 比较简便高效 , 密钥简短,加解密速度快,破译极其困难.本文介绍了 MD5/SHA1,DSA,DESede/DES,Diffie-Hellman 的使用. 第 1 章基础知识 ...
- Java中加密算法介绍及其实现
1.Base64编码算法 Base64简介 Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法.可查看RFC2045-RF ...
- JAVA 上加密算法的实现用例,MessageDigest介绍
第 1 章基础知识 1.1. 单钥密码体制 单钥密码体制是一种传统的加密算法,是指信息的发送方和接收方共同使用同一把密钥进行加解密. 通常 , 使用的加密算法 比较简便高效 , 密钥简短,加解密速度快 ...
- java常用加密算法
常用加密算法的Java实现(一) ——单向加密算法MD5和SHA 日期:2014/6/1 文:阿蜜果 1.Java的安全体系架构 1.1 Java的安全体系架构介绍 Java中为安 ...
随机推荐
- Java 计算两点间的全部路径(一)
算法要求: 在一个无向连通图中求出两个给定点之间的所有路径: 在所得路径上不能含有环路或重复的点: 算法思想描述: 整理节点间的关系,为每个节点建立一个集合,该集合中保存所有与该节点直接相连的节点(不 ...
- linux centos中安装flash player
本机为centos 7.0 64 1.用火狐浏览器随便打开一个视频网站,找到一个视频点进去,网站会提示未安装flash player.点击进去到adobe官网.2.下载flash player插件,可 ...
- linux设置用户自定义别名
设置用户自定义别名 首先进入当前用户家目录 我这里是 root 查看隐藏文件 注意到.bashrc文件,修改此可以用户自定义别名 保存退出,读入.bashrc设定 看看alias里有没 以后此用户就永 ...
- SQL查询操作
有7个筛选条件任意一个条件都可以筛选.采用LINQ查询比较繁琐,且操作步骤增加,选择用SQL判断. public DataTable GetData(string cboCld, string cbo ...
- LAMP网站架构方案解剖
LAMP网站架构方案解剖 2011-03-18 10:46 月光 网络转载 字号:T | T 网站架构是比较考研技术的一件事,所以要对一种好用的工具,那么网站架构就会事半功倍,LAMP具有通用.跨平台 ...
- ES6---new Promise()讲解(尤其注意里面的参数resolve、reject)
直接打印出来看看吧,console.dir(Promise). 这么一看就明白了,Promise是一个构造函数,自己身上有all.reject.resolve这几个眼熟的方法,原型上有then.cat ...
- 【NOIP2016提高A组模拟9.24】天使的分裂
题目 分析 这题可以递推, 但是\(O(n)\)还是会超时, 就用矩阵快速幂. #include <cmath> #include <iostream> #include &l ...
- BZOJ 4245: [ONTAK2015]OR-XOR 贪心 + 位运算
Description 给定一个长度为n的序列a[1],a[2],...,a[n],请将它划分为m段连续的区间,设第i段的费用c[i]为该段内所有数字的异或和,则总费用为c[1] or c[2] or ...
- BZOJ1491 Red is good
题目链接:Click here Solution: 考虑设\(f(i,j)\)表示当前还有\(i\)张红牌,\(j\)张黑牌时的期望收益 易得状态转移方程:\(f(i,j)=\frac{i}{i+j} ...
- Cloud Computing——Everything as a Service
service 分类 有Iaas, Paas, SaaS HDFS 总结☞: HDFS应付不了的场景 无法低时延 小文件存储存在空间利用率问题 文件不可修改 三副本有什么作用 防止单机故障,提高可用性 ...