数字加密在项目中时常会遇到,如手机号,身份证号信息等,下面小白将自己手写的数字加密算法分享给大家,可在项目中直接运用.
加密规则,入参时传递一个字段时间戳 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数字加密算法的更多相关文章

  1. Java数字格式化输出时前面补0

    Java数字格式化输出时前面补0 星期日 2014年11月30日|  分类: Java     /** * 里数字转字符串前面自动补0的实现. * */ public class TestString ...

  2. java HMAC_SHA1加密算法

      java HMAC_SHA1加密算法 CreationTime--2018年7月14日16点46分 Author:Marydon 1.准备工作 import javax.crypto.Mac; i ...

  3. java sm3加密算法

      java sm3加密算法实现 CreationTime--2018年7月13日09点28分 Author:Marydon 1.准备工作 所需jar包: bcprov-jdk15on-1.59.ja ...

  4. java单向加密算法小结(1)--Base64算法

    从这一篇起整理一下常见的加密算法以及在java中使用的demo,首先从最简单的开始. 简单了解 Base64严格来说并不是一种加密算法,而是一种编码/解码的实现方式. 我们都知道,数据在计算机网络之间 ...

  5. java基本加密算法

    简单的java加密算法有: BASE64 严格地说,属于编码格式,而非加密算法 MD5(Message Digest algorithm 5,信息摘要算法) SHA(Secure Hash Algor ...

  6. JAVA 上加密算法的实现用例---转载

    通常 , 使用的加密算法 比较简便高效 , 密钥简短,加解密速度快,破译极其困难.本文介绍了 MD5/SHA1,DSA,DESede/DES,Diffie-Hellman 的使用. 第 1 章基础知识 ...

  7. Java中加密算法介绍及其实现

    1.Base64编码算法 Base64简介 Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法.可查看RFC2045-RF ...

  8. JAVA 上加密算法的实现用例,MessageDigest介绍

    第 1 章基础知识 1.1. 单钥密码体制 单钥密码体制是一种传统的加密算法,是指信息的发送方和接收方共同使用同一把密钥进行加解密. 通常 , 使用的加密算法 比较简便高效 , 密钥简短,加解密速度快 ...

  9. java常用加密算法

    常用加密算法的Java实现(一) ——单向加密算法MD5和SHA 日期:2014/6/1 文:阿蜜果 1.Java的安全体系架构 1.1           Java的安全体系架构介绍 Java中为安 ...

随机推荐

  1. Java 计算两点间的全部路径(一)

    算法要求: 在一个无向连通图中求出两个给定点之间的所有路径: 在所得路径上不能含有环路或重复的点: 算法思想描述: 整理节点间的关系,为每个节点建立一个集合,该集合中保存所有与该节点直接相连的节点(不 ...

  2. linux centos中安装flash player

    本机为centos 7.0 64 1.用火狐浏览器随便打开一个视频网站,找到一个视频点进去,网站会提示未安装flash player.点击进去到adobe官网.2.下载flash player插件,可 ...

  3. linux设置用户自定义别名

    设置用户自定义别名 首先进入当前用户家目录 我这里是 root 查看隐藏文件 注意到.bashrc文件,修改此可以用户自定义别名 保存退出,读入.bashrc设定 看看alias里有没 以后此用户就永 ...

  4. SQL查询操作

    有7个筛选条件任意一个条件都可以筛选.采用LINQ查询比较繁琐,且操作步骤增加,选择用SQL判断. public DataTable GetData(string cboCld, string cbo ...

  5. LAMP网站架构方案解剖

    LAMP网站架构方案解剖 2011-03-18 10:46 月光 网络转载 字号:T | T 网站架构是比较考研技术的一件事,所以要对一种好用的工具,那么网站架构就会事半功倍,LAMP具有通用.跨平台 ...

  6. ES6---new Promise()讲解(尤其注意里面的参数resolve、reject)

    直接打印出来看看吧,console.dir(Promise). 这么一看就明白了,Promise是一个构造函数,自己身上有all.reject.resolve这几个眼熟的方法,原型上有then.cat ...

  7. 【NOIP2016提高A组模拟9.24】天使的分裂

    题目 分析 这题可以递推, 但是\(O(n)\)还是会超时, 就用矩阵快速幂. #include <cmath> #include <iostream> #include &l ...

  8. BZOJ 4245: [ONTAK2015]OR-XOR 贪心 + 位运算

    Description 给定一个长度为n的序列a[1],a[2],...,a[n],请将它划分为m段连续的区间,设第i段的费用c[i]为该段内所有数字的异或和,则总费用为c[1] or c[2] or ...

  9. BZOJ1491 Red is good

    题目链接:Click here Solution: 考虑设\(f(i,j)\)表示当前还有\(i\)张红牌,\(j\)张黑牌时的期望收益 易得状态转移方程:\(f(i,j)=\frac{i}{i+j} ...

  10. Cloud Computing——Everything as a Service

    service 分类 有Iaas, Paas, SaaS HDFS 总结☞: HDFS应付不了的场景 无法低时延 小文件存储存在空间利用率问题 文件不可修改 三副本有什么作用 防止单机故障,提高可用性 ...