【问题标题】:c# xor encrypt to javascript decrypt时间:2019-05-10 标签:c#xorencrypt to javascript解密
【发布时间】:2015-05-19 17:04:46
【问题描述】:

我正在测试来自 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 是什么。 Jon Skeet 的小贴士让我更深入地研究它。我的问题是我的密钥是一个字符串。我必须获取它的整数值,然后使用该值对文本进行异或运算。

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

这是 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 键对文本进行异或。然后我将 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解码。然后第一个循环重新创建密钥,第二个循环对密钥进行异或操作

现在它可以工作了。我知道修复很粗糙,但这帮助我想出来了。 C# 有没有办法将键转换为其 int 值而无需循环。 我尝试了以下方法:

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

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

但是键的值仍然是错误的

【问题讨论】:

  • 您似乎没有在 Javascript 中进行任何类型的 base64 解码...此外,您似乎在每次迭代中都使用 whole 键进行异或Javascript 代码。我什至不清楚这意味着什么......
  • 您不能使用 UTF8 C# 端。使用Encoding.GetEncoding("iso-8859-1")Encoding.ASCII
  • 使用 .ascii 或 iso-8859-1 返回相同的异或值
  • 这是我第一次破解它。是否有一个 javascript 解决方案可以根据我的 c# 编码方法对其进行解密?
  • @adviner 这不是一个解决方案,但是当你让它工作时,这是一个建议的改变。

标签: javascript c# xor


【解决方案1】:

其中有两个与其他不同:

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

您已经反转了输入,因此您得到的是密钥,而不是原始字符串。

例如,你应该有:

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

【讨论】:

  • 希望我能理解你的意思。我不想在 javascript 端加密。我正在尝试解密从 C# 方法加密的值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-15
  • 2020-10-01
  • 2015-06-14
  • 2011-07-08
  • 2012-02-03
相关资源
最近更新 更多