java实现rc4算法后十六进制转换

xiaoqiulqs xiaoqiulqs 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
其它系统给我们这个系统发过来用户名和密码,只能以URL形式发送,必须加密,目前采用的是RC4算法。
但RC4加密后的数据存在乱码字符,且通过URL形式传送过来时需要转换成十六进制。
于是产生问题:
通过RC4加密后的数据再转换成十六进制后,解密时通过16进制转换后再进行解密后的数据与加密前的数据不一致
public class RC4 {
public static String HloveyRC4(String aInput, String aKey) {
int[] iS = new int[256];
byte[] iK = new byte[256];
for (int i = 0; i < 256; i++) {
iS[i] = i;
}
int j = 0;
for (short i = 0; i < 256; i++) {
iK[i] = (byte) aKey.charAt((i % aKey.length())); // charAt函数的作用是返回指定索引位置处的字符
}
for (int i = 0; i < 255; i++) {
j = (j + iS[i] + iK[i]) % 256;
int temp = iS[i];
iS[i] = iS[j];
iS[j] = temp;
}
int i = 0;
j = 0;
char[] iInputChar = aInput.toCharArray();
char[] iOutputChar = new char[iInputChar.length];
for (short x = 0; x < iInputChar.length; x++) {
i = (i + 1) % 256;
j = (j + iS[i]) % 256;
int temp = iS[i];
iS[i] = iS[j];
iS[j] = temp;
int t = (iS[i] + (iS[j] % 256)) % 256;
int iY = iS[t];
char iCY = (char) iY;
iOutputChar[x] = (char) (iInputChar[x] ^ iCY);
}
return new String(iOutputChar);
}

public static String EncryptRC4(String aInput, String aKey) {
String str = HloveyRC4(aInput, aKey);
str = bin2hex(str);
return str;
}

public static String DecryptRC4(String aInput, String aKey) {
aInput = hex2bin(aInput);
String str = HloveyRC4(aInput, aKey);
return str;
}

/**
* 字符串转换成十六进制值
*
* @param bin
* String 我们看到的要转换成十六进制的字符串
* @return
*/
public static String bin2hex(String bin) {
char[] digital = "0123456789ABCDEF".toCharArray();
StringBuffer sb = new StringBuffer("");
byte[] bs = bin.getBytes();
int bit;
for (int i = 0; i < bs.length; i++) {
bit = (bs[i] & 0x0f0) >> 4;
sb.append(digital[bit]);
bit = bs[i] & 0x0f;
sb.append(digital[bit]);
}
return sb.toString();
}

/**
* 十六进制转换字符串
*
* @param hex
* String 十六进制
* @return String 转换后的字符串
*/
public static String hex2bin(String hex) {
String digital = "0123456789ABCDEF";
char[] hex2char = hex.toCharArray();
byte[] bytes = new byte[hex.length() / 2];
int temp;
for (int i = 0; i < bytes.length; i++) {
temp = digital.indexOf(hex2char[2 * i]) * 16;
temp += digital.indexOf(hex2char[2 * i + 1]);
bytes[i] = (byte) (temp & 0xff);
}
//System.out.println("hex2bin:"+new String(bytes));
return new String(bytes);
}

public static void main(String[] args) {
String inputStr = "abcdefghijklmnopqrstuvwxyz_1234567890";
String key = "opensso";// 加密因子
String str = EncryptRC4(inputStr, key);
System.out.println(str);
System.out.println(DecryptRC4(str, key));
}
}
...全文

相关推荐

评论 11
收藏 已收藏
分享
返回顶部
xiaoqiulqs
Java SE 62,621 成员 307,251 内容