Datos cifrados en 128, puede personalizar la tabla de símbolos y usar sus símbolos favoritos para el cifrado
La copia del código es la siguiente:
paquete com.wmly.enc;
import java.util.hashmap;
/**
* Cifrado y descifrado de 128 bits, un símbolo puede representar 7 bits
* Puede personalizar la tabla de símbolos, pero el símbolo no se puede repetir
*/
clase pública mybase128 {
Public static final char [] Symboltable = nuevo char [128];
Public static final hashmap <carácter, integer> indextable = new Hashmap <> (128);
estático {
int i = 0;
para (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;
}
}
para (Char C: "Esto está escrito por el programa de códec de los pueblos chinos [bie si yao aifa] y tiene una mesa de símbolos personalizada única | Pero la tela puede usar palabras duplicadas, sudor (todavía es 12 conocimiento*. #). Ven a buscar nosotros, querido!
Symboltable [i ++] = c;
}
tittable ();
para (int j = 0; j <128; j ++) {
indextable.put (Symboltable [j], j);
}
}
TETABLE DE CHECKABLE DE VOCO ESTÁTICO PRIVADO () arroja error {
if (symboltable [127] == 0) {
arrojar un nuevo error ("La longitud de la tabla del símbolo es incorrecta!");
}
para (char a: Symboltable) {
int count = 0;
para (char b: Symboltable) {
if (a == b) {
contar ++;
}
}
if (Count> 2) {
tirar un nuevo error ("La tabla de símbolos tiene símbolos repetidos!");
}
}
}
Public String code (byte [] data) {
if (data == null || data.length == 0) {
devolver nueva cadena ();
}
StringBuilder result = new StringBuilder ();
int tail = 0;
para (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 [código]);
cola = (0xff & (Curr << (8 - Mov))) >> 1;
if (mov == 7) {
result.append (Symboltable [cola]);
cola = 0;
}
}
resultado.append (Symboltable [cola]);
return result.toString ();
}
public byte [] decode (string base128) {
if (base128 == null || base128.length () == 0) {
devolver nuevo byte [] {};
}
int longitud = (int) math.floor (base128.length () * 0.875);
byte [] resultado = nuevo byte [longitud];
int idx = 0;
int head = indextable.get (base128.charat (0)) << 1;
para (int i = 1; i <base128.length ();) {
int mod = i % 8;
int code = indextable.get (base128.charat (i ++));
resultado [idx ++] = (byte) (0xff & (head+(código >> (7 - mod))));
if (mod == 7) {
head = 0xff & (indextable.get (base128.charat (i ++)) << 1);
} demás {
head = 0xff & (código << (mod + 1));
}
}
resultado de retorno;
}
/////////////////////////////////////////////// /////////////////////////////////////////////// /////////////////////////////////////////////// /////////////////////////////////////////////// /////////////////////////////////////////////// ///// ///////////
public static void main (string [] args) {
Mybase128 base128 = nuevo mybase128 ();
prueba (base128);
String txt = "Esta es mi prueba de cifrado y descifrado";
Cadena enc = base128.Encode (txt.getBytes ());
System.out.println (ENC);
System.out.println ("----------------");
System.out.println (nueva cadena (base128.decode (enc)));
}
Prueba de vacío estático privado (mybase128 base128) {
para (int i = 0; i <10000; i ++) {
Cadena r = randomData ();
Cadena d = nueva cadena (base128.decode (base128.Encode (r.getBytes ())));
if (! r.equals (d)) {
// d = nueva cadena (base128.Decode (base128.Encode (r.getBytes ())));
System.out.println ("Cifryption falló!:" + R);
}
}
}
cadena estática privada randomData () {
String TextString = "Estoy cansado de la cafetera y usar una peluca/N/R-";
int start = Random (0, TextString.Length () - 3);
int end = Random (Start + 1, TextString.Length () - 1);
devolver TextString.SUbstring (inicio, finalización);
}
privado static int random (int i, int j) {
return (int) math.ceil (math.random ()*(ji)+i);
}
}