java实现RC4算法,出现乱码问题,如何解决?

zhoutt1989 2010-04-14 10:57:19


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 时,正确情况下应该输出“你们好啊”,
可是后台输出的是“你们好?”,不知道什么原因,输入其他汉字也大多是这样,解密过程不知道哪里除了问题,但是算法是和加密是一样的。
...全文
580 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
wo243567952 2011-10-27
  • 打赏
  • 举报
回复
我的也是这个问题。。中文可以。。但是英文就是乱码!
lonicera0036 2011-06-16
  • 打赏
  • 举报
回复
我的C语言也是这个问题,怎么处理啊?
zhoutt1989 2010-07-02
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 sxzlc 的回复:]
96163时乱码
961633就没有问题

什么原因啊!?
[/Quote]
我开始也遇到这个问题,后来把key的类型换为byte[]的也是这样,最后在加密后把得到的密文的byte[]保存,之后再解密就ok!如果是用字符串类型的话,依然是乱码!
sun0322 2010-06-28
  • 打赏
  • 举报
回复
96163时乱码
961633就没有问题

什么原因啊!?
sun0322 2010-06-28
  • 打赏
  • 举报
回复
乱码应该是密钥的问题!
sun0322 2010-06-28
  • 打赏
  • 举报
回复
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 );
}

}
zhoutt1989 2010-05-12
  • 打赏
  • 举报
回复
问题已经解决了!
zhoutt1989 2010-04-16
  • 打赏
  • 举报
回复
啊,怎么没人回答这个问题啊!?
amdgaming 2010-04-16
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 zhoutt1989 的回复:]

啊,怎么没人回答这个问题啊!?
[/Quote]
分太少 了,问 问题就大方点,给个100以上的

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧