日期:2014-05-20  浏览次数:20650 次

请问这个程序为什么会出现这样的密文?密文是:邐嶟奦嬧
public class Example3_1{
  public static void main(String args[]){
  char a1='郑',a2='州',a3='大',a4='学';
  char secret='A';
  a1=(char)(a1^secret);
  a2=(char)(a2^secret);
  a3=(char)(a3^secret);
  a4=(char)(a4^secret);
  System.out.println("密文:"+a1+a2+a3+a4);
  a1=(char)(a1^secret);
  a2=(char)(a2^secret);
  a3=(char)(a3^secret);
  a4=(char)(a4^secret);
  System.out.println("原文:"+a1+a2+a3+a4);
  }
}

------解决方案--------------------
Java code


public class Example3_1{
    public static void main(String args[]){
    
    
    char a1='郑',a2='州',a3='大',a4='学';//16个二进制位
    char secret='A';//16个二进制位
    String string = "A郑州大学邐嶟奦嬧";
    for(int i=0; i<string.length(); i++)//求字符的uincode代号
    System.out.println( string.charAt(i)+"= " + Integer.toBinaryString((int)string.charAt(i)));
    
    /*高位的0没有显示出来
    A= 1000001
    郑= 1001000011010001
    州= 101110111011110
    大= 101100100100111
    学= 101101101100110
    邐= 1001000010010000
    嶟= 101110110011111
    奦= 101100101100110
    嬧= 101101100100111
    */
    
    //补齐到32个二进制位,对应位异或  相同为0不同为1  比如 郑^A =1001000011010001^1000001= 1001000010010000 = 邐 
    a1=(char)(a1^secret);//自动转化为32个二进制位后再异或(高16位补0) 然后强制转为16个二进制位,(高16位去掉)
    a2=(char)(a2^secret);
    a3=(char)(a3^secret);
    a4=(char)(a4^secret);
    System.out.println("密文:"+a1+a2+a3+a4);

  //再次补齐到32个二进制位,对应位异或  相同为0不同为1  比如邐^A =1001000010010000 ^ 1000001=  1001000011010001 = 郑 
    a1=(char)(a1^secret);      
    a2=(char)(a2^secret);
    a3=(char)(a3^secret);
    a4=(char)(a4^secret);
    System.out.println("原文:"+a1+a2+a3+a4);
    
  }