128의 암호화 된 데이터, 심볼 테이블을 사용자 정의하고 좋아하는 기호를 암호화에 사용할 수 있습니다.
코드 사본은 다음과 같습니다.
패키지 com.wmly.enc;
java.util.hashmap import;
/**
* 128 비트 암호화 및 암호 해독, 하나의 기호는 7 비트를 나타낼 수 있습니다.
* 심볼 테이블을 사용자 정의 할 수 있지만 기호는 반복 할 수 없습니다.
*/
공개 클래스 MyBase128 {
공개 정적 최종 문자 [] SymbolTable = New Char [128];
공개 정적 최종 해시 맵 <문자, integer> indextable = new Hashmap <> (128);
정적 {
int i = 0;
for (int j = 0; j <128; j ++) {
// symplictable [j] = (char) j;
if ( 'a'<= j && j <= 'z'
||. 'a'= J && j <= 'z'
||. '0'= J && j <= '9') {
SafformTable [i ++] = (char) j;
}
}
for (char c : "이것은 중국인 [bie si yao aifa] 코덱 프로그램이 작성하고 고유 한 사용자 정의 기호 테이블이 있지만 천은 중복 단어, 땀을 사용할 수 있습니다 (여전히 12 지식*. #). 우리, 친애하는! "" "tocharray ()) {
SafformTable [i ++] = C;
}
checkTable ();
for (int j = 0; j <128; j ++) {
indextable.put (symboltable [j], j);
}
}
개인 정적 void checkTable ()가 오류 {{
if (symboltable [127] == 0) {
새 오류를 던지십시오 ( "기호 테이블 길이가 잘못되었습니다!");
}
for (char a : symboltable) {
int count = 0;
for (char b : symplictable) {
if (a == b) {
카운트 ++;
}
}
if (count> 2) {
새 오류를 던지십시오 ( "기호 테이블에는 반복 된 기호가 있습니다!");
}
}
}
public string encode (byte [] data) {
if (data == null || data.length == 0) {
새 문자열 ()을 반환합니다.
}
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);
결과.
꼬리 = (0xff & (curr << (8 -mov))) >> 1;
if (mov == 7) {
결과.
꼬리 = 0;
}
}
결과.
return result.toString ();
}
public byte [] decode (String base128) {
if (base128 == null || base128.length () == 0) {
새로운 바이트를 반환합니다 [] {};
}
int length = (int) math.floor (base128.length () * 0.875);
바이트 [] 결과 = 새로운 바이트 [길이];
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 ++));
결과 [idx ++] = (byte) (0xff & (head+(code >> (7 -mod)));
if (mod == 7) {
head = 0xff & (indextable.get (base128.charat (i ++)) << 1);
} 또 다른 {
head = 0xff & (코드 << (mod + 1));
}
}
반환 결과;
}
//////////////////////////////////////////////////////////////////////////////////4 //////////////////////////////////////////////////////////////////////////////////4 //////////////////////////////////////////////////////////////////////////////////4 //////////////////////////////////////////////////////////////////////////////////4 //////////////////////////////////////////////////////////////////////////////////4 ////////////////////
public static void main (String [] args) {
mybase128 Base128 = 새로운 mybase128 ();
시험 (Base128);
문자열 txt = "이것은 내 암호화 및 암호 해독 테스트입니다";
문자열 enc = base128.encode (txt.getBytes ());
System.out.println (ENC);
System.out.println ( "--------------");
System.out.println (새 문자열 (base128.decode (enc)));
}
개인 정적 무효 테스트 (MyBase128 Base128) {
for (int i = 0; i <10000; i ++) {
문자열 r = randomData ();
문자열 d = 새 문자열 (base128.decode (base128.encode (r.getBytes ()));
if (! r.equals (d)) {
// d = new String (base128.decode (base128.encode (r.getBytes ()));
System.out.println ( "암호화 실패! :" + r);
}
}
}
개인 정적 문자열 randomData () {
문자열 textstring = "나는 커피 메이커에 지쳤고 가발/n/r-를 착용한다";
int start = random (0, textstring.length () -3);
int end = random (start + 1, textstring.length () -1);
Return Textstring.substring (시작, 끝);
}
개인 정적 int random (int i, int j) {
return (int) math.ceil (math.random ()*(ji)+i);
}
}