zl程序教程

您现在的位置是:首页 >  大数据

当前栏目

128进制加密数据示例分享

数据加密 示例 分享 进制 128
2023-06-13 09:15:20 时间

128进制加密数据,可以自定符号表,使用自己喜欢的符号做加密

复制代码代码如下:


packagecom.wmly.enc;

importjava.util.HashMap;

/**
 *128进制加解密,一个符号可表示7个bit
 *可以自定义符号表,符号不能重复
 */
publicclassMyBASE128{

 publicstaticfinalchar[]symbolTable=newchar[128];
 publicstaticfinalHashMap<Character,Integer>indexTable=newHashMap<>(128);
 static{
  inti=0;
  for(intj=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;
   }
  }
  for(charc:"这是中国人写地[备思要爱发]编解码程序&拥有独特的自定义符号表|不过布能使用重复字,汗啊(还差一十二个知*.#)。为我们加油吧,亲!".toCharArray()){
   symbolTable[i++]=c;
  }

  checkTable();

  for(intj=0;j<128;j++){
   indexTable.put(symbolTable[j],j);
  }
 }

 privatestaticvoidcheckTable()throwsError{
  if(symbolTable[127]==0){
   thrownewError("符号表长度不正确!");
  }
  for(chara:symbolTable){
   intcount=0;
   for(charb:symbolTable){
    if(a==b){
     count++;
    }
   }
   if(count>2){
    thrownewError("符号表有重复符号!");
   }
  }
 }

 publicStringencode(byte[]data){
  if(data==null||data.length==0){
   returnnewString();
  }
  StringBuilderresult=newStringBuilder();
  inttail=0;
  for(inti=0;i<data.length;i++){
   intmov=(i%7+1);
   intcurr=0xFF&data[i];
   intcode=tail+(curr>>mov);
   result.append(symbolTable[code]);
   tail=(0xFF&(curr<<(8-mov)))>>1;
   if(mov==7){
    result.append(symbolTable[tail]);
    tail=0;
   }
  }
  result.append(symbolTable[tail]);
  returnresult.toString();
 }

 publicbyte[]decode(Stringbase128){
  if(base128==null||base128.length()==0){
   returnnewbyte[]{};
  }
  intlength=(int)Math.floor(base128.length()*0.875);
  byte[]result=newbyte[length];
  intidx=0;
  inthead=indexTable.get(base128.charAt(0))<<1;
  for(inti=1;i<base128.length();){
   intmod=i%8;
   intcode=indexTable.get(base128.charAt(i++));
   result[idx++]=(byte)(0xFF&(head+(code>>(7-mod))));
   if(mod==7){
    head=0xFF&(indexTable.get(base128.charAt(i++))<<1);
   }else{
    head=0xFF&(code<<(mod+1));
   }
  }
  returnresult;
 }

 ///////////////////////测试方法///////////////////////////////
 publicstaticvoidmain(String[]args){
  MyBASE128base128=newMyBASE128();
  test(base128);

  Stringtxt="这是我的加解密测试";
  Stringenc=base128.encode(txt.getBytes());
  System.out.println(enc);
  System.out.println("----------------");
  System.out.println(newString(base128.decode(enc)));
 }

 privatestaticvoidtest(MyBASE128base128){
  for(inti=0;i<10000;i++){
   Stringr=randomData();
   Stringd=newString(base128.decode(base128.encode(r.getBytes())));
   if(!r.equals(d)){
//    d=newString(base128.decode(base128.encode(r.getBytes())));
    System.out.println("加解密失败!:"+r);
   }
  }
 }

 privatestaticStringrandomData(){
  StringtextString="了咖啡机累啊戴假发\n\r哦-";
  intstart=random(0,textString.length()-3);
  intend=random(start+1,textString.length()-1);
  returntextString.substring(start,end);
 }

 privatestaticintrandom(inti,intj){
  return(int)Math.ceil(Math.random()*(j-i)+i);
 }
}