public class Again {
private String plaintext;
private String ciphertext;
byte[] K = {0,7,0,9,0,3,0,1,2,2};
byte k;
private int[] S;
private int[] T;
public Again(){
S = new int[256];
T = new int[256];
}
public void initST(){
int size = this.K.length;
for(int i = 0;i<256;i++){
S[i] = i;
T[i] = K[i % size];
}
}
public void permS(){
int j = 0;
for(int i = 0;i < 256;i++){
j = (j + S[i] + T[i]) % 256;
int temp;
temp = S[j];
S[j] = S[i];
S[i] = temp;
}
}
public void encryp(){
int t,i = 0,j = 0;
byte b[] = this.plaintext.getBytes();
byte z[] = new byte[b.length];
    for(int m = 0;m < b.length; m++){
i = (i + 1) % 256;
j = (j + 1) % 256;
int temp;
temp = S[j];
S[j] = S[i];
S[i] = temp;
t = (S[i] + S[j]) % 256;
System.out.println();
k = (byte) S[t];
z[m] = (byte) ((byte)b[m]^k);
    }
    this.ciphertext = new String(z);
}
public static void main(String[] args){
Again a = new Again();
a.plaintext = "你们好啊";
a.initST();
a.permS();
a.encryp();
System.out.println(a.plaintext);
System.out.println(a.ciphertext);
}
}
此时console输出的密文是“溽笫萉”,
但是我把密文“溽笫萉”当做明文赋给a.plaintext 时,正确情况下应该输出“你们好啊”,
可是后台输出的是“你们好?”,不知道什么原因,输入其他汉字也大多是这样,解密过程不知道哪里除了问题,但是算法是和加密是一样的。

解决方案 »

  1.   

    package com.sxzlc.test.rc4;public class RC4 {
    public  static byte[] RC42(byte[] aInput, byte[] aKey) {
    int[] iS = new int[256];
    byte[] iK = new byte[256]; for (int i = 0; i < 256; i++)
    iS[i] = i; int j = 1; for (short i = 0; i < 256; i++) {
    iK[i] = (byte) aKey[i%aKey.length];
    } j = 0; for (int i = 0; i < 256; i++) {
    j = (j + iS[i] + iK[i]) &0xff;
    int temp = iS[i]&0xff;
    iS[i] = iS[j]&0xff;
    iS[j] = temp;
    } int i = 0;
    j = 0; for (int x = 0; x < aInput.length; x++) {
    i = (i + 1) &0xff;
    j = (j + iS[i]) &0xff;
    int temp = iS[i]&0xff;
    iS[i] = iS[j]&0xff;
    iS[j] = temp;
    int t = ((iS[i] + iS[j] ))&0xff;
    int iY = iS[t];
    byte iCY = (byte) (iY&0xff);
    aInput[x] = (byte) ((aInput[x]^iCY)&0xff);
    } return aInput; }
        

    public static void main(String[] args) 

    String inputStr = "你们好啊"; 
    String key = "961633"; 
    byte[] bytes = inputStr.getBytes();
    //打印加密后的字符串 
    bytes = RC4.RC42(inputStr.getBytes(), key.getBytes());
    inputStr = new String(bytes);
    System.out.println( inputStr ); 
    //打印加密后的字符串 
    bytes = RC4.RC42(inputStr.getBytes(), key.getBytes());
    inputStr = new String(bytes);
    System.out.println( inputStr ); 
    }}
      

  2.   

    我开始也遇到这个问题,后来把key的类型换为byte[]的也是这样,最后在加密后把得到的密文的byte[]保存,之后再解密就ok!如果是用字符串类型的话,依然是乱码!