2015-05-19 60 views
1

我正在測試從c#中的字符串的簡單加密和使用xor在JavaScript解密。c#xor加密到JavaScript解密

在C#中我編碼如下:在

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

結果:

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; 
}  

使用以下

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

我可能有錯誤的話來說。

這是encyrpted數據,在C#方法加密()返回

var data = "bV5WEUNNWU5ZRVUWQkMIRgNCQERSRUAWVlUQDENcQkRHXwARVVdJSBJcX0oc" 

我想用javascript函數xor_string解密回:

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

更新2 好吧,我發現我的問題。我誤解了什麼是異或。 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值。然後第二個循環用新的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); 但是,這返回一個不同的數字,然後我上面的循環。我也試過:

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

但價值仍然是錯誤的關鍵

+0

你似乎沒有做任何形式在Javascript中的base64解碼的......此外,你似乎是與*整體上的每個異或*鍵迭代在Javascript代碼中。我甚至不清楚這是什麼意思... –

+0

你不能使用UTF8 C#端。使用'Encoding.GetEncoding(「iso-8859-1」)'或'Encoding.ASCII' – xanatos

+0

使用.ascii或iso-8859-1返回相同的異或值 – adviner

回答

0

這些東西兩個都不喜歡別人:

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

你已經扭轉了投入,所以你拿到鑰匙回來,不原始字符串。

例如,你應該有:

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

希望我能理解你的話。我不想試圖在JavaScript結束。我試圖解密從C#方法加密的值。 – adviner