`
yu120
  • 浏览: 80117 次
社区版块
存档分类
最新评论

Java实现128进制加密数据

    博客分类:
  • Java
阅读更多
package cn.wiki.openapi.lry.tool;

import java.util.HashMap;

/**
 * 128进制加解密, 一个符号可表示7个bit
 * 可以自定义符号表, 符号不能重复
 * @author lry
 *
 */
public class MyBASE128 {
 
    public static final char[] symbolTable = new char[128];
    public static final HashMap<Character, Integer> indexTable = new HashMap<Character, Integer>(128);
    static {
        int i = 0;
        for (int j = 0; j < 128; j++) {
            if('A' <= j && j <= 'Z'
                || 'a' <= j && j <= 'z'
                || '0' <= j && j <= '9') {
                symbolTable[i++] = (char) j;
            }
        }
        for (char c : "这是中国人写地[备思要爱发]编解码程序&拥有独特的自定义符号表|不过布能使用重复字,汗啊(还差一十二个知*.#)。为我们加油吧,亲!".toCharArray()) {
            symbolTable[i++] = c;
        }
         
        checkTable();
 
        for (int j = 0; j < 128; j++) {
            indexTable.put(symbolTable[j], j);
        }
    }
 
    private static void checkTable() throws Error {
        if(symbolTable[127] == 0) {
            throw new Error("符号表长度不正确!");
        }
        for (char a : symbolTable) {
            int count = 0;
            for (char b : symbolTable) {
                if(a == b) {
                    count++;
                }
            }
            if(count > 2) {
                throw new Error("符号表有重复符号!");
            }
        }
    }
 
    public String encode(byte[] data) {
        if(data == null || data.length == 0) {
            return new String();
        }
        StringBuilder result = new StringBuilder();
        int tail = 0;
        for (int i = 0; i < data.length; i++) {
            int mov = (i % 7 + 1);
            int curr = 0xFF & data[i];
            int code = tail + (curr >> mov);
            result.append(symbolTable[code]);
            tail = (0xFF & (curr << (8 - mov))) >> 1;
            if(mov == 7) {
                result.append(symbolTable[tail]);
                tail = 0;
            }
        }
        result.append(symbolTable[tail]);
        return result.toString();
    }
 
    public byte[] decode(String base128) {
        if(base128 == null || base128.length() == 0) {
            return new byte[] { };
        }
        int length = (int) Math.floor(base128.length() * 0.875);
        byte[] result = new byte[length];
        int idx = 0;
        int head = indexTable.get(base128.charAt(0)) << 1;
        for (int i = 1; i < base128.length();) {
            int mod = i % 8;
            int code = indexTable.get(base128.charAt(i++));
            result[idx++] = (byte) (0xFF & (head + (code >> (7 - mod))));
            if(mod == 7) {
                head = 0xFF & (indexTable.get(base128.charAt(i++)) << 1);
            } else {
                head = 0xFF & (code << (mod + 1));
            }
        }
        return result;
    }
     
    ///////////////////////测试方法///////////////////////////////
    public static void main(String[] args) {
        MyBASE128 base128 = new MyBASE128();
        test(base128);
         
        String txt = "李茹钰的所得税的速度是滴哦osidusiou3247IZIiauydiYUI";
        String enc = base128.encode(txt.getBytes());
        System.out.println(enc);
        System.out.println("----------------");
        System.out.println(new String(base128.decode(enc)));
    }
 
    private static void test(MyBASE128 base128) {
        for (int i = 0; i < 10000; i++) {
            String r = randomData();
            String d = new String(base128.decode(base128.encode(r.getBytes())));
            if(!r.equals(d)) {
                System.out.println("加解密失败!: " + r);
            }
        }
    }
 
    private static String randomData() {
        String textString = "了咖啡机累啊戴假发\n\r哦\\\\地 \\ 方i \\ 就啊 \n\n\\ \r\\ n\\ 我诶\n人\\ 竟\n \\然n\n\\a\f去tr品\r\f \t\b 味a rad\\ \n\\r\\bn\\r\\h\\j\\\f\\g\\g\\yoi端午节凹入30498305u8tfjlerf-12345i0rwe94ri349-1=-230rcki库i情况i爬q-23r0iwe我饿去骗人34091239581-454-512¥!@#——%)!#¥……×!()¥@#%——(CR!#$U*(%_#*_$%*!245=-";
        int start = random(0, textString.length() - 3);
        int end = random(start + 1, textString.length() - 1);
        return textString.substring(start, end);
    }
 
    private static int random(int i, int j) {
        return (int) Math.ceil(Math.random()*(j-i)+i);
    }
}

 

分享到:
评论

相关推荐

    128进制加密数据示例分享

    主要介绍了128进制加密数据示例,这里使用JAVA实现,需要的朋友可以参考下

    JavaClass二进制文件加密专家

    JavaClass文件加密专家通过分析Class文件的结构,将Class二进制代码中耗时较多的部份抽出并替换为Native C代码, 并且使用1024位加密算法将Class文件数据加密,任何Java反编译工具均不可能对加密后的文件...

    Java实现AES加密和解密算法

    本文就简单介绍如何通过JAVA实现AES加密: /** * 测试AES加密和解密 * @param args */ public static void main(String[] args) { /**数据初始化**/ String content = "http://www.mbaike.net"; String...

    Java类文件加密专家

    Java 类文件加密专家通过分析Class文件的结构,使用1024位加密算法将Class文件数据加密,任何Java反编译工具均不可能对加密后的文件进行破解。 系统特点 1.采用纯C语言开发的内核算法,运行速度极快。 2.彻底...

    Java和C#通过DES加密得到相同数据

    NULL 博文链接:https://luanxiyuan.iteye.com/blog/1938348

    Base64加密解密java/js

    因为是参照 js Base64写的java实现,所以代码可实现前台js,后台java的加密,解密的任意组合,当然也可自己简单改下参照序列顺序,使自己的加密解密变为独一的,网上无法使用工具解密出正确的数据。熟悉二进制的可...

    java密码加密解密算法代码实现

    例如,在Java Persistence系统Hibernate中,就采用了Base64来将一个较长的唯一标识符(一般为128-bit的UUID)编码为一个字符串,用作HTTP表单和HTTP GET URL中的参数。在其他应用程序中,也常常需要把二进制数据编码...

    Java实现Des加密(不用加载包)

    // 二进制加密数据 int[] encryptdata = new int[64]; // 加密操作完成后的字节数组 byte[] EncryptCode = new byte[8];// 密钥初试化成二维数组 int[][] KeyArray = new int[16][48];// 将密钥字节数组转换成...

    将图片转成二进制并生成Base64编码字符串,再将二进制转换成各种图片

    NULL 博文链接:https://iszhao.iteye.com/blog/1140899

    java des加密算法 + base64格式转换

    java中将数据通过des算法加密解密,可修改向量和加密填充方式,代码中有注释。

    java语言实现3des加密

    使用java实现了des 和 3des * @param strKey 密钥 * @param result 要解密的数据 * @throws Exception */ public String desDecrypt(String strKey,byte[] result) throws Exception { if(strKey....

    java源码包---java 源码 大量 实例

     Java实现的FTP连接与数据浏览程序,实现实例化可操作的窗口。  部分源代码摘录:  ftpClient = new FtpClient(); //实例化FtpClient对象  String serverAddr=jtfServer.getText(); //得到服务器地址  ...

    JAVA上百实例源码以及开源项目源代码

     Java实现的FTP连接与数据浏览程序,实现实例化可操作的窗口。  部分源代码摘录:  ftpClient = new FtpClient(); //实例化FtpClient对象  String serverAddr=jtfServer.getText(); //得到服务器地址  ...

    Delphi/Java兼容的AES加密代碼 R2

    群裏星星大神寫的,我改了一下,默認改為BASE64編碼輸出...再次修改,原版只针对文字的加密,对二进制不能处理,这次修改我增加了一个加密类,改写了几个函数,速度比上一个版本快多了,而且能对任何数据进行加密解密。

    Java之Base64编解码.pptx.pptx

    Java Base64编码是一种用64个字符表示任意二进制数据的方法,通过将3个字节的数据转换为4个Base64字符,实现数据的压缩和传输。 Java Base64解码过程 Java Base64解码是将Base64编码后的字符串还原为原始二进制数据...

    JAVA上百实例源码以及开源项目

    百度云盘分享 ... Java实现的FTP连接与数据浏览程序,实现实例化可操作的窗口。  部分源代码摘录:  ftpClient = new FtpClient(); //实例化FtpClient对象  String serverAddr=jtfServer.getText();...

    java源码包4

     Java实现的FTP连接与数据浏览程序,实现实例化可操作的窗口。  部分源代码摘录:  ftpClient = new FtpClient(); //实例化FtpClient对象  String serverAddr=jtfServer.getText(); //得到服务器...

    java源码包3

     Java实现的FTP连接与数据浏览程序,实现实例化可操作的窗口。  部分源代码摘录:  ftpClient = new FtpClient(); //实例化FtpClient对象  String serverAddr=jtfServer.getText(); //得到服务器...

    DES加密工具

    DES/3DES加解密、MAC运算、数据异或、数据拆分、CRC16运算工具

    TXT文件转DAT文件(ASCII转BINARY)

    可以实现把文本文件转为二进制加密文件,且保证写入前后数据不发生变化

Global site tag (gtag.js) - Google Analytics