gpt4 book ai didi

javascript - 在 Javascript 中简单地异或加密并在 Java 中解密

转载 作者:搜寻专家 更新时间:2023-11-01 02:23:09 26 4
gpt4 key购买 nike

这样做的目的不是高度安全相关并且 key 会很长,所以我只想对字符串使用简单的 XOR 加密。

好了,客户端的Javascript如下:

function dc_encrypt(str, key)
{
var ord = []; var res = "";

var i;
for (i = 1; i <= 255; i++) {ord[String.fromCharCode(i)] = i}

for (i = 0; i < str.length; i++)
res += String.fromCharCode(ord[str.substr(i, 1)] ^ ord[key.substr(i % key.length, 1)]);

return(res);
}

Java 是:

public String dc_decrypt(String str, String key)
{
StringBuilder sb = new StringBuilder();
for(int i = 0; i < str.length(); i++)
sb.append((char)(str.charAt(i) ^ key.charAt(i % (key.length()))));
return(sb.toString());
}

不幸的是,这会产生一些非常奇怪的结果。有些字母在JS中加密后会有所不同,通过POST发送结果并在Java中解密。在每种情况下,它似乎都不可靠。

我认为这个问题一定与编码有关...有人知道更可靠的解决方案吗?

非常感谢! :)

最佳答案

当对两个字符串进行异或编码时,各个字符的异或值有时不会产生可以显示的字符。因此,一种解决方案是将结果编码为一系列十六进制值,然后在服务器端解码这些十六进制值。

Javascript:

function encryptStringWithXORtoHex(input,key) {
var c = '';
while (key.length < input.length) {
key += key;
}
for(var i=0; i<input.length; i++) {
var value1 = input[i].charCodeAt(0);
var value2 = key[i].charCodeAt(0);

var xorValue = value1 ^ value2;

var xorValueAsHexString = xorValue.toString("16");

if (xorValueAsHexString.length < 2) {
xorValueAsHexString = "0" + xorValueAsHexString;
}

c += xorValueAsHexString;
}
return c;
}

Java 代码:

private static String decryptStringWithXORFromHex(String input,String key) {
StringBuilder c = new StringBuilder();
while (key.length() < input.length()/2) {
key += key;
}

for (int i=0;i<input.length();i+=2) {
String hexValueString = input.substring(i, i+2);
int value1 = Integer.parseInt(hexValueString, 16);
int value2 = key.charAt(i/2);

int xorValue = value1 ^ value2;

c.append(Character.toString((char) xorValue));

}
return c.toString();
};

例子:用 Javascript 编码:

encryptStringWithXORtoHex('加密','SecretKey');

返回字符串 160b00001c043f452d3b0c10

用 Java 解密:

decryptStringWithXORFromHex("160b00001c043f452d3b0c10","SecretKey")

返回加密

请注意:显示的解决方案仅适用于 charChode 值小于或等于 255 的字符。如果您想对 unicode 字符(例如 €)使用该解决方案,您必须将代码更改为处理好这个。

关于javascript - 在 Javascript 中简单地异或加密并在 Java 中解密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33529103/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com