[英]c# xor encrypt to javascript decrypt
我正在测试来自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循环get创建键的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);
但是钥匙的价值仍然是错误的
其中有两个与其他事物不同:
function xor_string( str, key ) {
^^^--^^^
dd = xor_string(key, data);
^^^ ^^^^
您已经颠倒了输入,所以您要取回密钥,而不是原始字符串。
例如,您应该具有:
crypted = xor_string(original_data, key);
decrypted = xor_string(crypted, key);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.