gpt4 book ai didi

javascript - 时间:2019-03-17 标签:c#xorcryptotojavascriptdecrypt

转载 作者:行者123 更新时间:2023-11-28 07:20:54 25 4
gpt4 key购买 nike

我正在测试 C# 中字符串的简单加密,并使用 xor 在 javascript 中解密。

在 C# 中,我编码如下:

private byte[] _Key { get; set; }
private Encoding _Encoding { get; set; }

public XOREncryption(string key)
{
_Encoding = Encoding.UTF8;
_Key = _Encoding.GetBytes(key).Where(a1 => a1 != 0).ToArray();
}

public string Encrypt(string plain_text)
{
int i = 0;
byte[] octets = _Encoding
.GetBytes(plain_text)
.Select(b => (byte)(b ^ _Key[(++i) % _Key.Length]))
.ToArray()
;
string cipherText = Convert.ToBase64String(octets);
return cipherText;
}

使用以下内容:

plainText = "The quick brown fox jumped over the lazy dog.";
key = "19631280-2e7d-4ffe-8d80-f310c590d37e";

结果:

encryptedText = bV5WEUNNWU5ZRVUWQkMIRgNCQERSRUAWVlUQDENcQkRHXwARVVdJSBJcX0oc

现在我想用 javascript 解密它:

function xor_string( str, key ) {
var xored = "";

for (i=0; i < str.length;i++) {
var a = str.charCodeAt(i);
var b = a ^ key;
xored = xored + String.fromCharCode(b);
}

return xored;
}

但它返回相同的值。示例:

var key = "19631280-2e7d-4ffe-8d80-f310c590d37e"
var data = "bV5WEUNNWU5ZRVUWQkMIRgNCQERSRUAWVlUQDENcQkRHXwARVVdJSBJcX0oc"

var dd = xor_string(data, key);

Output: bV5WEUNNWU5ZRVUWQkMIRgNCQERSRUAWVlUQDENcQkRHXwARVVdJSBJcX0oc

dd = xor_string(key, data);

Output: 19631280-2e7d-4ffe-8d80-f310c590d37e

关于我做错了什么有什么想法吗?

更新1

我可能表述错误。

这是 C# 方法 Encrypt() 返回的加密数据

var data = "bV5WEUNNWU5ZRVUWQkMIRgNCQERSRUAWVlUQDENcQkRHXwARVVdJSBJcX0oc"

我想使用 javascript 函数 xor_string 将其解密回:

var dd = "The quick brown fox jumped over the lazy dog.";

更新2好吧,我发现了我的问题。我误解了 xor 是什么。乔恩·斯基特的建议让我更加深入地研究它。我的问题是我的 key 是一个字符串。我必须获取它的整数值,然后使用该值对文本进行异或。

这是我编写的粗略代码。虽然很粗糙,但我想看看我是否理解它。

这是 C# 代码:

        string plainText = "The quick brown fox jumped over the lazy dog.";
string key = "19631280-2e7d-4ffe-8d80-f310c590d37e";

int nKey = 0;
string sKey = "";
for(var x = 0; x < key.Length; x++)
{
nKey += Convert.ToInt32(key[x]);
}

string nText = "";
for (var x = 0; x < plainText.Length; x++)
{
int charValue = Convert.ToInt32(plainText[x]);
charValue ^= nKey;

nText += char.ConvertFromUtf32(charValue);
}

nText = nText.Base64Encode();

第一个 for 循环创建键的 int 值。然后第二个 for 循环使用新的 int 键对文本进行异或。然后我将异或文本转换为 base64。

在 JavaScript 方面:

data = '4KWP4KWz4KW+4KS74KWq4KWu4KWy4KW44KWw4KS74KW54KWp4KW04KWs4KW14KS74KW94KW04KWj4KS74KWx4KWu4KW24KWr4KW+4KW/4KS74KW04KWt4KW+4KWp4KS74KWv4KWz4KW+4KS74KW34KW64KWh4KWi4KS74KW/4KW04KW84KS1';
key = "19631280-2e7d-4ffe-8d80-f310c590d37e";


function xor_string( str, key ) {
var xored = "";

for (i=0; i < str.length;i++) {
var a = str.charCodeAt(i);
var b = a ^ key;
xored = xored + String.fromCharCode(b);
}

return xored;
}

function xor_key(key)
{
var keyVal = 0;
for(x=0; x < key.length; x++)
{
keyVal += key.charCodeAt(x);
}

return keyVal;
}

var bdecode = $().base64('decode', data);
var newKey = xor_key(key);
var dd = xor_string(bdecode, newKey);

首先我对数据进行 Base64 解码。然后第一个循环重新创建 key ,第二个循环对 key 进行异或

现在可以了。我知道解决办法很粗糙,但这帮助我解决了这个问题。C# 有没有一种方法可以将键转换为其 int 值而无需循环。我尝试了以下方法:

byte[] asciiBytes = Encoding.ASCII.GetBytes(key); int d1 = BitConverter.ToInt16(asciiBytes, 0); 但这返回的数字与上面的循环不同。我也尝试过:

if (BitConverter.IsLittleEndian) Array.Reverse(asciiBytes);

但键的值仍然错误

最佳答案

其中有两件事与其他事情不同:

function xor_string( str, key ) {
^^^--^^^
dd = xor_string(key, data);
^^^ ^^^^

您已经颠倒了输入,因此您取回了 key ,而不是原始字符串。

例如,您应该:

crypted = xor_string(original_data, key);
decrypted = xor_string(crypted, key);

关于javascript - 时间:2019-03-17 标签:c#xorcryptotojavascriptdecrypt,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30331859/

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