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 时,正确情况下应该输出“你们好啊”,
可是后台输出的是“你们好?”,不知道什么原因,输入其他汉字也大多是这样,解密过程不知道哪里除了问题,但是算法是和加密是一样的。
...全文
689 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以上的
源码下载地址: https://pan.quark.cn/s/8d2c461c797c JavaWeb程序设计构成了掌握Web交互式应用程序开发的核心领域,对于初学者来说,精通这一技术具有决定性意义。在“JavaWeb程序设计(第三版)作业答案”中,我们可以预期获得针对该教材习题的一系列深入解析,从而协助学习者强化知识体系。 JavaWeb所包含的技术组件涵盖了Servlet、JSP(JavaServer Pages)、JDBC(Java Database Connectivity)以及各类框架如Spring MVC、Struts等。Servlet是Java平台提供的一种扩展服务器功能的接口,能够处理HTTP请求并生成相应的反馈。JSP则是一种用于构建动态网页的工具,它支持开发者将HTML代码与Java代码进行整合编写,从而简化了Web应用程序的开发流程。 作业答案通常会涉及以下几个核心内容: 1. **Servlet基础**:可能包含Servlet生命周期、init(), service(), destroy()方法的应用,以及如何在web.xml文件中设定Servlet的映射关系。 2. **JSP基础**:JSP的九大内置对象,如request、response、session、application等的使用,以及EL(Expression Language)和JSTL(JavaServer Pages Standard Tag Library)的实际操作。 3. **HTTP协议理解**:GET和POST请求方法的差异,请求头与响应头的应用,以及会话管理的概念阐释。 4. **JDBC数据库操作**:与数据库建立连接,执行SQL指令,处理查询结果集,以及...
源码链接: https://pan.quark.cn/s/a4b39357ea24 斐讯K2是一款广受用户青睐的无线路由器,其运行表现稳定且具备较高的可操作性,在DIY爱好者群体中拥有极高的声誉。本资料将系统性地阐述斐讯K2的固件刷机方法及其关联的技术要点。固件升级是路由器爱好者改善设备性能、扩展功能的一种普遍手段,经由替换出厂固件,能够达成更加个性化的网络配置、增强安全防护等目标。斐讯K2固件资源库涵盖了多种知名的非官方固件,诸如Tomato Pheonix 不死鸟、高恪、PandoraBox 潘多拉等,这些固件均具备独特的优势,能够适配不同用户的需求。 1. Tomato Pheonix 不死鸟:Tomato是一款立足于Linux的开源固件,以其精巧、高效而备受推崇。不死鸟版本是专门为华硕及斐讯路由器优化的分支,提供了卓越的QoS(服务质量)配置、详尽的图表监控以及便捷的固件升级途径。对于那些需要精准调控带宽和监测网络状态的用户而言,这是一个理想的选项。 2. 高恪:高恪固件是OpenWrt的定制化版本,着重于操作的便捷性和运行的可靠性,特别适合对路由器操作不甚熟悉的用户群体。它提供了一些实用的功能,例如内置的广告屏蔽、快速测速工具等,同时保留了OpenWrt的适应性。 3. PandoraBox 潘多拉:潘多拉盒是另一款基于OpenWrt的固件,它以丰富的插件库和强大的自定义潜力而闻名。用户能够依据个人需求安装各类插件,实现更多功能,如远程接入、DDNS(动态域名解析服务)等。 4. 官方固件的纯净版本与定制版本:官方固件通常更侧重于稳定性,纯净版意味着未预置额外的应用或服务,适合注重稳定性的用户。定制版则可能包含了制造商的特色功能或优...

62,621

社区成员

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

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