Dados criptografados em 128, você pode personalizar a tabela de símbolos e usar seus símbolos favoritos para criptografia
A cópia do código é a seguinte:
pacote com.wmly.enc;
importar java.util.hashmap;
/**
* Criptografia e descriptografia de 128 bits, um símbolo pode representar 7 bits
* Você pode personalizar a tabela de símbolos, mas o símbolo não pode ser repetido
*/
classe pública mybase128 {
public static final char [] simboltable = novo char [128];
HashMap final estático público HashMap <personagem, Integer> Indextable = new Hashmap <> (128);
estático {
int i = 0;
for (int j = 0; j <128; j ++) {
// simboltable [j] = (char) j;
if ('a' <= j && j <= 'z'
||.
||.
simboltável [i ++] = (char) j;
}
}
para (char c: "Isso é escrito pelo povo chinês [BIE SI YAO AIFA] Programa de codec e possui uma tabela de símbolo personalizada exclusiva | Mas o pano pode usar palavras duplicadas, suor (ainda é 12 conhecimento*. #). nós, querido!
simboltável [i ++] = c;
}
checkTable ();
for (int j = 0; j <128; j ++) {
Indextable.put (simboltável [j], j);
}
}
private static void checkTable () lança erro {
if (simboltável [127] == 0) {
lançar um novo erro ("O comprimento da tabela de símbolos está incorreto!");
}
para (char a: simboltable) {
int conting = 0;
para (Char B: Simboltable) {
if (a == b) {
contagem ++;
}
}
if (contagem> 2) {
lançar um novo erro ("A tabela de símbolos tem símbolos repetidos!");
}
}
}
public string cody (byte [] dados) {
if (data == null || data.length == 0) {
return new string ();
}
StringBuilder resultado = new StringBuilder ();
int cauda = 0;
for (int i = 0; i <data.length; i ++) {
int mov = (i % 7 + 1);
int curr = 0xff & dados [i];
int código = cauda + (curr >> mov);
resultado.append (simboltable [código]);
cauda = (0xff & (curr << (8 - mov))) >> 1;
if (mov == 7) {
resultado.append (simboltável [cauda]);
cauda = 0;
}
}
resultado.append (simboltável [cauda]);
return resultado.toString ();
}
public byte [] Decode (String base128) {
if (base128 == null || base128.length () == 0) {
retornar novo byte [] {};
}
int length = (int) math.floor (base128.length () * 0,875);
byte [] resultado = novo byte [comprimento];
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 ++));
resultado [idx ++] = (byte) (0xff & (cabeça+(código >> (7 - mod))));
if (mod == 7) {
Head = 0xff & (Indextable.get (base128.Charat (i ++)) << 1);
} outro {
cabeça = 0xff & (código << (mod + 1));
}
}
resultado de retorno;
}
/////////////////////////////////////////////////////////Tipos /////////////////////////////////////////////////////////Tipos /////////////////////////////////////////////////////////Tipos /////////////////////////////////////////////////////////Tipos /////////////////////////////////////////////////////////Tipos ////////////////////
public static void main (string [] args) {
MyBase128 base128 = new MyBase128 ();
teste (base128);
String txt = "Esta é a minha criação de criptografia e descriptografia";
String ENC = base128.Encode (txt.getBytes ());
System.out.println (ENC);
System.out.println ("--------------");
System.out.println (new String (base128.Decode (ENC)));
}
Teste de vazio estático privado (mybase128 base128) {
for (int i = 0; i <10000; i ++) {
String r = aleatomData ();
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 ("A criptografia falhou!:" + R);
}
}
}
String estática privada RandomData () {
String textString = "Estou cansado da cafeteira e uso uma peruca/n/r-";
int start = aleatório (0, textString.Length () - 3);
int end = aleatório (start + 1, textString.length () - 1);
return textstring.substring (start, fim);
}
estático privado int aleatória (int i, int j) {
return (int) math.ceil (math.random ()*(ji)+i);
}
}