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

    通过命令来备份数据库: 通过数据库软件里面的,mysqldump模块来操作,如下: mysqldump -u root db1 > db1.sql -p; //没有-d就是备份的时候:数据表结构 ...

  2. MySQL 7种 JOIN连表方法

    规定:左边的圆代表表 a,右边的代表 b. JOIN 关键字可以在两表之间选中任意部分.] 通过以下代码制造一些数据: delimiter // drop procedure if exists pr ...

  3. join 与 countdownlatch 的区别 扩展 栅栏 CyclicBarrier

    我们先看一个 小例子 , 使用 join 与CountDownSlatch 都可以完成 当1,2线程 完全结束后 3 线程 start 对比我们就能够知道 CountDownSlatch 比 JOIN ...

  4. wpf Textbox 回车就换行

    将 TextWrapping 属性设置为 Wrap 会导致输入的文本在到达 TextBox 控件的边缘时换至新行,必要时会自动扩展 TextBox 控件以便为新行留出空间. 将 AcceptsRetu ...

  5. YUV格式详解【转】

    转自:http://blog.csdn.net/searchsun/article/details/2443867 [-] YUV格式解析1播放器project2 YUV 采样 表面定义 YUV格式解 ...

  6. python-函数3(全局变量与局部变量)

    python-函数3(全局变量与局部变量) 全局变量与局部变量 school = "goy edu" 全局变量,在最上面定义的 def change_name(name): glo ...

  7. TCP/IP基础总结性学习(2)

    简单的HTTP协议 一.HTTP 协议用于客户端和服务器端之间的通信 客户端和服务器的定义:请求访问文本或图像等资源的一端称为客户端,而提供资源响应的一 端称为服务器端.在两台计算机之间使用 HTTP ...

  8. 从输入一个URL到页面渲染的流程简介

    首先说明以下是我参考网上答案和自己的思考,给出自己的想法,如果有问题,欢迎大家吐槽从用户在浏览器中输入一个URL,到整个页面渲染,这个过程中究竟发生了什么呢?今天先简单写下整个过程,后面再一点点完善. ...

  9. DevExpress Windows 10 v19.1新版亮点:UWP控件新功能全面解析

    行业领先的.NET界面控件DevExpress 日前正式发布v19.1版本,本站将以连载的形式介绍各版本新增内容.在本系列文章中将为大家介绍DevExpress WPF v19.1中新增的一些控件及部 ...

  10. 【vue-router的基础】history了解一下

    概述 window.onpopstate是popstate事件在window对象上的事件处理程序. 每当处于激活状态的历史记录条目发生变化时,popstate事件就会在对应window对象上触发. 如 ...