c# xor加密到javascript解密

c# xor encrypt to javascript decrypt

本文关键字:javascript 解密 加密 xor      更新时间:2023-09-26

我正在测试一个简单的加密字符串从c#和解密javascript使用xor。

在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是什么。乔恩·斯基特的提示让我更深入地研究了一下。我的问题是我的键是字符串。我必须得到它的整数值,然后使用该值来xor文本。

这是我做的一个粗略的代码。它很粗糙,但我想看看我是否理解它。

下面是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循环get创建了键的int值。然后,第二个for循环使用新的int键对文本执行xor操作。然后我将xor文本转换为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解码数据。然后第一个循环重新创建键第二个循环对键

执行xor操作

现在它工作了。我知道解决这个问题很困难,但这帮助我想出了解决办法。c#中是否有一种方法可以将键转换为它的int值而不需要循环?我尝试了以下操作:

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

如果(BitConverter.IsLittleEndian)Array.Reverse (asciiBytes);

这两件事和其他的不一样:

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

你已经反转了输入,所以你得到的是键,而不是原来的字符串。

e。G,你应该有:

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