Java实现128进制加密数据

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

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以使用 javax.crypto 库中的 DES 算法来实现这个需求。下面是一个示例代码: ```java import javax.crypto.Cipher; import javax.crypto.SecretKey; import javax.crypto.SecretKeyFactory; import javax.crypto.spec.DESKeySpec; import java.nio.charset.StandardCharsets; import java.util.Base64; public class DESExample { public static void main(String[] args) throws Exception { String plainText = "Hello, World!"; // 待加密数据 String keyHex = "0123456789ABCDEF"; // 16进制的密钥,长度为8字节(16个字符) byte[] keyBytes = hexStringToByteArray(keyHex); byte[] plaintextBytes = plainText.getBytes(StandardCharsets.UTF_8); // 创建DESKeySpec对象 DESKeySpec desKeySpec = new DESKeySpec(keyBytes); SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES"); SecretKey secretKey = keyFactory.generateSecret(desKeySpec); // 创建Cipher对象并进行加密 Cipher cipher = Cipher.getInstance("DES/ECB/NoPadding"); cipher.init(Cipher.ENCRYPT_MODE, secretKey); byte[] encryptedBytes = cipher.doFinal(plaintextBytes); // 将加密后的字节数组转为16进制字符串 String encryptedHex = byteArrayToHexString(encryptedBytes); System.out.println("Encrypted Hex: " + encryptedHex); } // 将16进制字符串转为字节数组 public static byte[] hexStringToByteArray(String hexString) { int len = hexString.length(); byte[] byteArray = new byte[len / 2]; for (int i = 0; i < len; i += 2) { byteArray[i / 2] = (byte) ((Character.digit(hexString.charAt(i), 16) << 4) + Character.digit(hexString.charAt(i + 1), 16)); } return byteArray; } // 将字节数组转为16进制字符串 public static String byteArrayToHexString(byte[] byteArray) { StringBuilder hexString = new StringBuilder(); for (byte b : byteArray) { String hex = Integer.toHexString(0xFF & b); if (hex.length() == 1) { hexString.append('0'); } hexString.append(hex); } return hexString.toString(); } } ``` 以上代码使用了 DES/ECB/NoPadding 模式进行加密,密钥长度为8字节(16个字符)。加密后的数据以16进制字符串形式打印输出。 请注意,DES算法已经被认为是不安全的,不推荐在实际应用中使用。如果需要更高的安全性,建议使用AES算法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值