128進(jìn)制加密數(shù)據(jù)示例分享
128進(jìn)制加密數(shù)據(jù),可以自定符號(hào)表,使用自己喜歡的符號(hào)做加密
package com.wmly.enc;
import java.util.HashMap;
/**
* 128進(jìn)制加解密, 一個(gè)符號(hào)可表示7個(gè)bit
* 可以自定義符號(hào)表, 符號(hào)不能重復(fù)
*/
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 : "這是中國(guó)人寫(xiě)地[備思要愛(ài)發(fā)]編解碼程序&擁有獨(dú)特的自定義符號(hào)表|不過(guò)布能使用重復(fù)字,汗啊(還差一十二個(gè)知*.#)。為我們加油吧,親!".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("符號(hào)表長(zhǎng)度不正確!");
}
for (char a : symbolTable) {
int count = 0;
for (char b : symbolTable) {
if(a == b) {
count++;
}
}
if(count > 2) {
throw new Error("符號(hào)表有重復(fù)符號(hào)!");
}
}
}
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;
}
///////////////////////測(cè)試方法///////////////////////////////
public static void main(String[] args) {
MyBASE128 base128 = new MyBASE128();
test(base128);
String txt = "這是我的加解密測(cè)試";
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 = "了咖啡機(jī)累啊戴假發(fā)\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);
}
}
- 使用java自帶des加密算法實(shí)現(xiàn)文件加密和字符串加密
- java使用des加密解密示例分享
- java位運(yùn)算加密示例
- java使用異或?qū)崿F(xiàn)變量互換和異或加密解密示例
- java加密解密示例分享
- java不可逆加密算法之md5加密算法使用示例
- JAVA實(shí)現(xiàn)caesar凱撒加密算法
- java中使用DES加密解密實(shí)例
- java異或加密算法
- des加密解密JAVA與.NET互通實(shí)例
- java實(shí)現(xiàn)MD5加密算法的實(shí)例代碼
- Javascript腳本實(shí)現(xiàn)靜態(tài)網(wǎng)頁(yè)加密實(shí)例代碼
- javascript實(shí)現(xiàn)的DES加密示例
- PHP加密函數(shù) Javascript/Js 解密函數(shù)
- 利用JAVA實(shí)現(xiàn)DES加密算法
- java開(kāi)發(fā)之MD5加密算法的實(shí)現(xiàn)
- java加密枝術(shù)深入理解
- javascript增加干擾數(shù)據(jù)實(shí)現(xiàn)簡(jiǎn)單加密效果
相關(guān)文章
使用spring boot通過(guò)自定義注解打印所需日志
這篇文章主要介紹了使用spring boot通過(guò)自定義注解打印所需日志的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07Java 如何將表格數(shù)據(jù)導(dǎo)入word文檔中
這篇文章主要介紹了Java將表格數(shù)據(jù)導(dǎo)入word文檔中的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06基于jQuery獲取table數(shù)據(jù)發(fā)送到后端
這篇文章主要介紹了基于jQuery獲取table數(shù)據(jù)發(fā)送到后端,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-02-02關(guān)于SpringBoot整合RabbitMQ實(shí)現(xiàn)死信隊(duì)列
這篇文章主要介紹了關(guān)于SpringBoot整合RabbitMQ實(shí)現(xiàn)死信隊(duì)列,死信隊(duì)列實(shí)際上就是一個(gè)普通的隊(duì)列,只是這個(gè)隊(duì)列跟死信交換機(jī)進(jìn)行了綁定,用來(lái)存放死信而已,需要的朋友可以參考下2023-05-05SpringMVC中@RequestMapping注解用法實(shí)例
通過(guò)@RequestMapping注解可以定義不同的處理器映射規(guī)則,下面這篇文章主要給大家介紹了關(guān)于SpringMVC中@RequestMapping注解用法的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-06-06Mybatis或Mybatis-Plus框架的xml文件中特殊符號(hào)的使用詳解
這篇文章主要介紹了Mybatis或Mybatis-Plus框架的xml文件中特殊符號(hào)的使用詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11