Я тестирую простой шифр строки из 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);
но значение по-прежнему неправильно для ключа
Вы, кажется, не делать каких-либо base64-декодирование в Javascript ... Кроме того, по всей видимости, XORing с * целом * ключ на каждом итерация в коде Javascript. Мне даже не ясно, что это значит ... –
Вы не можете использовать UTF8 C# -side. Используйте 'Encoding.GetEncoding (" iso-8859-1 ")' или 'Encoding.ASCII' – xanatos
Использование .ascii или iso-8859-1 возвращает то же значение xor – adviner