Зашифрованные данные в 128, вы можете настроить таблицу символов и использовать свои любимые символы для шифрования
Кода -копия выглядит следующим образом:
пакет com.wmly.enc;
импортировать java.util.hashmap;
/**
* 128-битное шифрование и дешифрование, один символ может представлять 7 бит
* Вы можете настроить таблицу символов, но символ нельзя повторить
*/
открытый класс mybase128 {
Public Static Final Char [] Symboltable = New Char [128];
Public Static Final Hashmap <персонаж, целое число> indextable = new Hashmap <> (128);
статический {
int i = 0;
for (int j = 0; j <128; j ++) {
// symboltable [j] = (char) j;
if ('a' <= j && j <= 'z'
||
||
Symboltable [i ++] = (char) j;
}
}
Для (Char C: «Это написано китайским народом [Bie Si Yao Aifa] программа кодекса и имеет уникальную таблицу символов, но ткань может использовать дублирующие слова, пот (это все еще 12 знаний*. #). Давай Мы, дорогой!
Symboltable [i ++] = c;
}
checkTable ();
for (int j = 0; j <128; j ++) {
indextable.put (symboltable [j], j);
}
}
private static void checktable () бросает ошибку {
if (symboltable [127] == 0) {
Выбросить новую ошибку («Длина таблицы символов неверна!»);
}
для (char a: symboltable) {
int count = 0;
для (char b: symboltable) {
if (a == b) {
count ++;
}
}
if (count> 2) {
Выбросить новую ошибку («Таблица символов имеет повторяющиеся символы!»);
}
}
}
public String Encode (byte [] data) {
if (data == null || data.length == 0) {
вернуть new String ();
}
StringBuilder result = new StringBuilder ();
int tail = 0;
для (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]);
хвост = 0;
}
}
result.append (symboltable [tail]);
return result.tostring ();
}
public byte [] decode (String Base128) {
if (base128 == null || base128.length () == 0) {
вернуть новый байт [] {};
}
int length = (int) math.floor (base128.length () * 0,875);
byte [] result = new Byte [длина];
int idx = 0;
int head = indextable.get (base128.charat (0)) << 1;
для (int i = 1; i <base128.length ();) {
int mod = i % 8;
int code = indextable.get (base128.charat (i ++));
Результат [idx ++] = (byte) (0xff & (head+(code >> (7 - mod))));
if (mod == 7) {
head = 0xff & (indextable.get (base128.charat (i ++)) << 1);
} еще {
Head = 0xff & (code << (mod + 1));
}
}
результат возврата;
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////
public static void main (string [] args) {
Mybase128 base128 = new mybase128 ();
тест (Base128);
String txt = "Это мой тест на шифрование и дешифрование";
String enc = base128.encode (txt.getbytes ());
System.out.println (ENC);
System.out.println ("----------------");
System.out.println (New String (base128.decode (enc)));
}
Частный статический тест void (mybase128 Base128) {
для (int i = 0; i <10000; i ++) {
String r = randomData ();
String d = new String (base128.decode (base128.encode (r.getbytes ())));
if (! r.equals (d)) {
// d = новая строка (base128.decode (base128.encode (r.getbytes ())));
System.out.println ("шифрование не удалось!:" + R);
}
}
}
частная статическая строка randomData () {
String Textstring = «Я устал от кофеварки и ношу парик/н/r-»;
int start = random (0, textstring.length () - 3);
int end = случайный (start + 1, textstring.length () - 1);
вернуть текстовые тексты.
}
private static int random (int i, int j) {
return (int) math.ceil (math.random ()*(ji)+i);
}
}