Data terenkripsi di 128, Anda dapat menyesuaikan tabel simbol dan menggunakan simbol favorit Anda untuk enkripsi
Salinan kode adalah sebagai berikut:
paket com.wmly.enc;
impor java.util.hashmap;
/**
* Enkripsi dan dekripsi 128-bit, satu simbol dapat mewakili 7 bit
* Anda dapat menyesuaikan tabel simbol, tetapi simbol tidak dapat diulangi
*/
kelas publik mybase128 {
Char final statis publik [] Symboltable = Char baru [128];
hashmap final statis publik <karakter, integer> indextable = hashmap baru <> (128);
statis {
int i = 0;
untuk (int j = 0; j <128; j ++) {
// Symboltable [j] = (char) j;
if ('a' <= j && j <= 'z'
||.
||. '0' <= j && j <= '9') {
Symboltable [i ++] = (char) j;
}
}
untuk (char c: "Ini ditulis oleh orang -orang Cina [bie si Yao aifa] program codec & memiliki tabel simbol kustom yang unik | tetapi kain dapat menggunakan kata -kata duplikat, keringat (masih 12 pengetahuan*. #). Ayo kami, sayang! "
Symboltable [i ++] = c;
}
Offtable ();
untuk (int j = 0; j <128; j ++) {
indextable.put (simboltable [j], j);
}
}
private static void checkTable () melempar kesalahan {
if (Symboltable [127] == 0) {
Lempar kesalahan baru ("Panjang tabel simbol salah!");
}
untuk (char a: simboltable) {
Int Count = 0;
untuk (char b: symboltable) {
if (a == b) {
Count ++;
}
}
if (count> 2) {
Lempar kesalahan baru ("Tabel simbol memiliki simbol berulang!");
}
}
}
public string encode (byte [] data) {
if (data == null || data.length == 0) {
mengembalikan string baru ();
}
StringBuilder hasil = stringBuilder baru ();
int ekor = 0;
untuk (int i = 0; i <data.length; i ++) {
int mov = (i % 7 + 1);
int Curr = 0xff & data [i];
Kode int = tail + (Curr >> mov);
result.append (Symboltable [kode]);
tail = (0xff & (Curr << (8 - mov)) >> 1;
if (mov == 7) {
hasil. Lapeh (Symboltable [tail]);
ekor = 0;
}
}
hasil. Lapeh (Symboltable [tail]);
return result.toString ();
}
byte publik [] decode (string base128) {
if (base128 == null || base128.length () == 0) {
mengembalikan byte baru [] {};
}
int panjang = (int) math.floor (base128.length () * 0.875);
byte [] hasil = byte baru [panjang];
int idx = 0;
int head = indextable.get (base128.charat (0)) << 1;
untuk (int i = 1; i <base128.length ();) {
int mod = i % 8;
Int code = indextable.get (base128.charat (i ++));
Hasil [idx ++] = (byte) (0xff & (head+(kode >> (7 - mod))));
if (mod == 7) {
head = 0xff & (indextable.get (base128.charat (i ++)) << 1);
} kalau tidak {
head = 0xff & (kode << (mod + 1));
}
}
hasil pengembalian;
}
////////////////////////////////////////////////// ////////////////////////////////////////////////// ////////////////////////////////////////////////// ////////////////////////////////////////////////// ////////////////////////////////////////////////// ////////////////////
public static void main (string [] args) {
Mybase128 base128 = mybase128 baru ();
tes (base128);
String txt = "Ini adalah uji enkripsi dan dekripsi saya";
String enc = base128.encode (txt.getbytes ());
System.out.println (ENC);
System.out.println ("----------------");
System.out.println (string baru (base128.decode (ENC)));
}
tes void statis pribadi (mybase128 base128) {
untuk (int i = 0; i <10000; i ++) {
String r = randomData ();
String d = string baru (base128.decode (base128.encode (r.getbytes ())));
if (! r.equals (d)) {
// d = string baru (base128.decode (base128.encode (r.getbytes ())));
System.out.println ("Enkripsi Gagal!:" + R);
}
}
}
Private Static String RandomData () {
String textString = "Saya bosan dengan pembuat kopi dan memakai wig/n/r-";
int start = acak (0, textString.length () - 3);
int end = acak (mulai + 1, textString.length () - 1);
kembalikan textString.substring (start, end);
}
private static int random (int i, int j) {
return (int) math.ceil (math.random ()*(ji)+i);
}
}