2015-05-19 1 views
1

Я тестирую простой шифр строки из C# и расшифровываю в javascript с помощью xor.C# xor encrypt to javascript decrypt

В 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

я, возможно, сформулировал это неправильно.

Это является encyrpted данные о том, что C# метод Шифрование() возвращаемых

var data = "bV5WEUNNWU5ZRVUWQkMIRgNCQERSRUAWVlUQDENcQkRHXwARVVdJSBJcX0oc" 

Я хотела бы использовать яваскрипт функцию xor_string, чтобы расшифровать его обратно:

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

Update 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(); 

Первый цикл получает создает Int значение ключа. Затем второй цикл for создает xor текста с новым ключом int. Затем я конвертирую текст xor в base64.

На яваскрипте стороны:

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); Но это возвращает другое число, а затем мой цикл выше. Я также пробовал:

если (битконвертер.IsLittleEndian) Array.Reverse (asciiBytes);

но значение по-прежнему неправильно для ключа

+0

Вы, кажется, не делать каких-либо base64-декодирование в Javascript ... Кроме того, по всей видимости, XORing с * целом * ключ на каждом итерация в коде Javascript. Мне даже не ясно, что это значит ... –

+0

Вы не можете использовать UTF8 C# -side. Используйте 'Encoding.GetEncoding (" iso-8859-1 ")' или 'Encoding.ASCII' – xanatos

+0

Использование .ascii или iso-8859-1 возвращает то же значение xor – adviner

ответ

0

Два из этих вещей не как другие:

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

Вы обращенные входы, так что вы получаете ключ обратно, не исходная строка.

например, вы должны иметь:

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

Надеюсь, я понимаю, что вы говорите. Я не пытаюсь encyrpt на конец javascript. Я пытаюсь расшифровать значение, которое было зашифровано с помощью метода C#. – adviner