时间:2021-05-21
128进制加密数据,可以自定符号表,使用自己喜欢的符号做加密
复制代码 代码如下:
package com.wmly.enc;
import java.util.HashMap;
/**
* 128进制加解密, 一个符号可表示7个bit
* 可以自定义符号表, 符号不能重复
*/
public class MyBASE128 {
public static final char[] symbolTable = new char[128];
public static final HashMap<Character, Integer> indexTable = new HashMap<>(128);
static {
int i = 0;
for (int j = 0; j < 128; j++) {
//symbolTable[j] = (char) 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 = "这是我的加解密测试";
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)) {
//d = new String(base128.decode(base128.encode(r.getBytes())));
System.out.println("加解密失败!: " + r);
}
}
}
private static String randomData() {
String textString = "了咖啡机累啊戴假发\n\r哦-";
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);
}
}
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
1、首先计算MD5加密的二进制数组(128位),然后再对这个二进制数组进行base64编码(而不是对32位字符串编码)。例如,用Python计算01234567
本文实例讲述了C#实现将32位MD5摘要串转换为128位二进制字符串的方法。分享给大家供大家参考,具体如下:将32为MD5摘要串转换为128位二进制字符串://
首先,必须要强调的一点,MD5不是加密算法,而是消息摘要算法,具有不可逆性。字符串通过MD5处理后会生成128位的二进制串。我们通常会将其转化为16进制串,用于
一开始使用ASCII编码来读取文本数据,模拟读取二进制数据,但是发现如果字符编码大于127时,只会得到小于128的值,相当于和128取余了,因此ASCII编码是
介绍byte,即字节,由8位的二进制组成。在Java中,byte类型的数据是8位带符号的二进制数。在计算机中,8位带符号二进制数的取值范围是[-128,127]