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

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);
    }
}

 

分享到:
评论

相关推荐

    Java实现的进制转换工具类完整示例

    Java实现的进制转换工具类完整示例 Java实现的进制转换工具类是...Java实现的进制转换工具类可以广泛应用于各种场景,如数据加密、颜色表示、IP地址表示等。在使用该工具类时,需要根据实际情况选择合适的方法和参数。

    128进制加密数据示例分享

    在本文中,我们将深入探讨128进制加密数据的概念以及如何使用Java进行实现。128进制加密是一种将数据编码为128个不同符号的方法,每个符号代表7位二进制数据。这种编码方式允许自定义符号表,但需要注意的是,符号...

    JavaClass二进制文件加密专家

    总的来说,保护Java代码不被反编译是软件开发中的一项重要任务,"JavaClass二进制文件加密专家"提供了有效的工具和技术,帮助开发者实现这一目标。通过混淆、加密、签名等手段,可以大大提高代码的安全性,减少潜在...

    java 实现十六进制数转为图片Java源码

    在Java编程语言中,将十六进制数转换为图片是一项常见的任务,特别是在数据可视化或加密解密领域。这个过程通常涉及到将十六进制字符串解析成字节数组,然后将这些字节用作像素值来创建图像。以下是一个详细的步骤...

    用java程序实现各进制转换

    在实际应用中,进制转换有着广泛的应用,例如在数据存储、网络传输和加密解密等领域。因此,掌握Java实现进制转换的方法是非常重要的。 在本文中,我们讨论了使用Java实现各进制转换的方法,包括十进制到二进制、八...

    通过java编程得到.jpg图片16进制的数据

    在Java编程中,处理图像数据并将其转换为16进制表示是一项常见的任务,尤其是在进行数据存储、加密或分析时。本示例中,我们关注的是如何读取一个.jpg格式的图片文件,并提取其最后部分的数据,将其转换为16进制字符...

    Java中3DES加密解密示例(封装byte数组16进制互转)

    在本示例中,我们将展示如何使用 3DES 算法在 Java 中实现加密和解密操作,并封装 byte 数组和 16 进制字符串之间的互转。 Java 中的 3DES 加密算法 在 Java 中,我们可以使用 javax.crypto 包中的 Cipher 类来...

    java 26进制转换

    在Java中,我们可以自定义一个工具类,如`ConvertUtil.java`,来实现26进制和其他进制之间的转换。以下是一些可能的方法: 1. **26进制转十进制**:这个过程可以通过映射每个字母到其对应的数字值(A=1,B=2,...,...

    16进制加密_解密源代码和demo.exe

    "16进制加密_解密源代码"可能包含C++、Java、Python、C#等编程语言的源代码实现,这些代码展示了如何进行16进制加密和解密。源代码通常分为两个主要部分:加密函数和解密函数。加密函数会接收输入的明文,将其转换为...

    用Java实现的图片加密程序

    以上就是关于"用Java实现的图片加密程序"的一些主要知识点,这个项目不仅涉及了Java的IO流技术,还涵盖了加密算法、数据安全等多个方面,对于学习和提升Java编程技能以及信息安全知识非常有帮助。

    java实现字符转换成十六进制的ASCII码

    在Java编程语言中,将字符转换为十六进制表示的ASCII码是一项常见的任务,尤其是在处理字符串数据时。本文将深入探讨如何实现这个功能,并通过一个具体的示例代码`StringToAscii.java`进行演示。 首先,我们需要...

    Java实现url加密处理的方法示例

    Java中的URL加密处理是网络安全传输数据的一个重要环节,它可以防止敏感信息在传输过程中被窃取或篡改。本文将深入探讨如何使用Java实现URL加密,特别是基于Base64编码和编码转换的方式。我们将重点关注以下几个方面...

    16进制数据转换

    在Java编程中,十六进制数据和字符串之间的转换是一项基本且重要的技能,特别是在处理编码、加密或网络通信等场景时。 #### 关键知识点解析 1. **十六进制与字符串转换的方法** 在给定的代码片段中,`CodeChange...

    java实现加密算法

    在IT领域,加密算法是确保数据...综上所述,这个Java项目不仅展示了如何使用纯Java实现16进制加密算法,还强调了加密在数据安全中的作用以及测试的重要性。通过深入理解这些概念,开发者可以更好地构建安全的应用程序。

    java二进制转化界面

    在深入探讨“Java二进制转化界面”的主题之前...总之,设计和实现一个Java二进制转化界面是一个综合了编程技巧、UI设计和数据处理能力的过程。通过遵循上述指导原则,开发者可以创建出既功能强大又用户友好的应用程序。

    JAVA实现DES加密

    总的来说,Java实现DES加密涉及到了对称加密的概念、DES算法的原理、Java的加密API使用,以及Base64编码。理解并掌握这些知识点对于进行数据安全编程至关重要。在编写和使用这类工具类时,应确保密钥管理的安全性,...

    C#加密 解密对接java 的加密AES/CBC/PKCS7Padding 转16进制.rar

    本主题主要探讨的是如何使用C#实现加密和解密操作,以便与Java应用程序进行无缝对接,特别是使用AES/CBC/PKCS7Padding算法,并将结果转换为16进制表示。下面将详细阐述相关知识点。 **AES(Advanced Encryption ...

    十六进制字符串按位异或运算工具和java位异或运算

    本节将详细介绍十六进制字符串的按位异或运算以及如何在Java中实现这一运算。 十六进制字符串是由0到9和A到F(或a到f)组成的字符序列,每个字符代表4位二进制数。例如,十六进制数"AB"在二进制下表示为10101011。...

    Java实现AES加密和解密算法

    `parseByte2HexStr`方法将字节数组转换为十六进制字符串,这允许在日志、存储或显示时以人类可读的形式表示加密数据。相反,`parseHexStr2Byte`方法将十六进制字符串转换回字节数组,以便于解密。 在实际应用中,...

Global site tag (gtag.js) - Google Analytics