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

总结:此加密算法虽然简单,但加密思想和加密原理值得学习,可以随意修改数字秘钥、转换字符、混淆字母、总加密字符串长度,并用于项目中。

原文地址:https://www.cnblogs.com/myxcf/p/10119702.html

时间: 2024-11-09 04:40:33

java数字加密算法的相关文章

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

java单向加密算法小结(1)--Base64算法 从这一篇起整理一下常见的加密算法以及在java中使用的demo,首先从最简单的开始. 简单了解 Base64严格来说并不是一种加密算法,而是一种编码/解码的实现方式. 我们都知道,数据在计算机网络之间是使用字节流的方式进行传递的,所有的信息都要最终转换为0101的二进制,这本身就涉及到编码,解码的应用. Base64,顾名思义,是使用了64个基本的字符来对任意数据进行编码的一种实现方式,那既然有Base64,是不是也有Base32,Base16

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

通常 , 使用的加密算法 比较简便高效 , 密钥简短,加解密速度快,破译极其困难.本文介绍了 MD5/SHA1,DSA,DESede/DES,Diffie-Hellman 的使用. 第 1 章基础知识 1.1. 单钥密码体制 单钥密码体制是一种传统的加密算法,是指信息的发送方和接收方共同使用同一把密钥进行加解密. 通常 , 使用的加密算法 比较简便高效 , 密钥简短,加解密速度快,破译极其困难.但是加密的安全性依靠密钥保管的安全性 , 在公开的计算机网络上安全地传送和保管密钥是一个严峻的问题,并

java数字字符串累加1的解决方案

近期操作项目遇到这样的问题,研究了下搞出了一个解决方案. //num也可以是在数字字符串里面截取的,比如我有14位的数字字符串前六位是市级,7,8位代表县区,后两位代表乡镇,最后四位是累计+1的,这个时候你就可以根据前10位查出最大的是多少,然后用最大的+1得出新的最大的.. //你要+1的字符串 String num="0000"; //转成整数并执行累加操作,但是可能位数变少了,怎么办呢? int i=Integer.valueOf(Num)+1; //为了拼接字符串使用 Stri

关于《Java数字图像处理-编程技巧与应用实践》一书 源代码

关于<Java数字图像处理-编程技巧与应用实践>一书 源代码 本书所有的源代码我已经整理上传到华章图书的官方网站与 我自己的GITHUB上,本人GITHUB的地址如下: https://github.com/gloomyfish/mybook-java-imageprocess其 中书中的多数内容在本人的博客专栏上面有覆盖,但是不完全 是博客内容的翻版,阅读本人博客想找可以运行源代码的读者 可以到github上自己下载,如果发现有任何源代码错误,请给我 发邮件或者留言,本人感激不尽. 特此声明

【转】Java数字抽奖游戏核心代码

1. [代码][Java]代码    package com.luiszhang.test; import java.util.Arrays; /** * NumberLotteryGame * 一个简单的数字彩票游戏类 * @author LuisZhang * 参考了core java 8th中的例3-7的设计思想 */public class NumberLotteryGame {    private int gamesNumber;    // 生成游戏的数量,为以后多线程扩展做考虑 

Java非对称加密算法--RSA加密算法

Java非对称加密算法--RSA加密算法          RSA加密算法是一种非对称加密算法.在公开密钥加密和电子商业中RSA被广泛使用.RSA是1977年由罗纳德·李维斯特(Ron Rivest).阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的.当时他们三人都在麻省理工学院工作.RSA就是他们三人姓氏开头字母拼在一起组成的. 1973年,在英国政府通讯总部工作的数学家克利福德·柯克斯(Clifford Cocks)在一个内部文件中提出了一个相

java HMAC_SHA1加密算法

java HMAC_SHA1加密算法 CreationTime--2018年7月14日16点46分 Author:Marydon 1.准备工作 import javax.crypto.Mac; import javax.crypto.SecretKey; import javax.crypto.spec.SecretKeySpec; import org.apache.log4j.Logger; /** * HMAC_SHA1加密算法工具类 * @explain 不可逆算法 * @author

Java基本加密算法

简单的java加密算法有: BASE64 严格地说,属于编码格式,而非加密算法 MD5(Message Digest algorithm 5,信息摘要算法) SHA(Secure Hash Algorithm,安全散列算法) HMAC(Hash Message Authentication Code,散列消息鉴别码) 1. BASE64 Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,大家可以查看RFC2045-RFC2049,上面有MIME的详细规范.Base64编码可用于

java常用加密算法

常用加密算法的Java实现(一) ——单向加密算法MD5和SHA 日期:2014/6/1 文:阿蜜果 1.Java的安全体系架构 1.1           Java的安全体系架构介绍 Java中为安全框架提供类和接口.JDK 安全 API 是 Java 编程语言的核心 API,位于 java.security包(及其子包),以及sun.securityAPI包(及其子包)中.设计用于帮助开发人员在程序中同时使用低级和高级安全功能. JDK 1.1 中第一次发布的 JDK 安全中引入了“Java