2015-01-30 2 views
3

У меня есть зашифрованная строка C#, которая должна быть расшифрована в node.js. В настоящее время я использую cryptoJS в качестве расшифровки.triple des encrypt C# и расшифровать в javascript

Ниже приведен код, сначала зашифровать строку в C#:

Конструктор CryptoAgent строит вектор ключа алгоритма и инициализации с помощью Guid. Например, «A925B4D6-A8D0-11E4-BA34-AC7BA1ACF56B».

public CryptoAgent(Guid keyGuid) 
    { 
     _UseSymmetricEncryption = true; 
     byte[] guidArr = keyGuid.ToByteArray(); 
     Array.Resize<byte>(ref guidArr, 24); 
     _Key = (byte[])guidArr.Clone(); 
     Array.Reverse(guidArr); 
     _IV = guidArr; 
    } 

Метод шифрования довольно прямолинейный. Он принимает plainText и шифрует данные с помощью ключа и iv, созданного выше, а затем возвращает его в дружественной URL-строке. Например, "[email protected] & ProductUserId = C4B80D7F-A8D0-11E4-BA34-AC7BA1ACF56B"

private string EncryptSymmetric(string plainText) 
    { 
     if (string.IsNullOrEmpty(plainText)) 
     { 
      throw new ArgumentNullException("The string to be encrypted cannot be null."); 
     } 
     ICryptoTransform transform; 
     TripleDESCryptoServiceProvider csp = new TripleDESCryptoServiceProvider(); 
     transform = csp.CreateEncryptor(_Key, _IV); 
     MemoryStream memoryStream = new MemoryStream(); 
     CryptoStream cryptoStream = new CryptoStream(memoryStream, transform, CryptoStreamMode.Write); 
     byte[] plaintextBytes = Encoding.Unicode.GetBytes(plainText); 
     cryptoStream.Write(plaintextBytes, 0, plaintextBytes.Length); 
     cryptoStream.FlushFinalBlock(); 
     byte[] encryptedData = memoryStream.GetBuffer(); 
     Console.WriteLine(csp.Mode); 
     Console.WriteLine(csp.Padding); 
     return UrlNormalize(Convert.ToBase64String(encryptedData, 0, (int)memoryStream.Length)); 
    } 

В результате зашифрованная строка будет следующим:

ZuD6CIEY6b- sh9Q6DRh9SWE0YyC92Jmw1oplTqy7kjETXoNio42hoJxDmMr7V-Sp14aX9lwTxYBM_KjA bEevElE_7nUzC_C4nM13LHHbpg6aR8xO39RseQjpLCLYj5ZKKWiXZREqpvDBlvtF-F1VuqyAMa0ECYOD N8ZCcmmyIHuCpalcUkLZ0zZajwutIrtmmqg3VXQNT3E ~

Мне поручено получить эту зашифрованную строку и дешифровать строку в node.js и разобрать два параметра для дальнейшего использования. Ниже мой исходный файл для расшифровки:

var CryptoJS = require("crypto-js"); 

var text = "[email protected]&ProductUserId=C4B80D7F-A8D0-11E4-BA34-AC7BA1ACF56B"; 
var key = "A925B4D6-A8D0-11E4-BA34-AC7BA1ACF56B"; 
var useHashing = true; 

if (useHashing){ 
    key = CryptoJS.MD5(key).toString(); 
    key = key + '0000000000000000'; 
} 

var textWordArray = CryptoJS.enc.Utf16.parse(text); 
var keyHex = CryptoJS.enc.Hex.parse(key); 

var iv = reverseHexString(keyHex.toString()); 
var ivHex = CryptoJS.enc.Hex.parse(iv); 

console.log('hexadecimal key: ' + keyHex + '\n'); 

console.log('hexadecimal iv: ' + ivHex + '\n'); 

var options = { 
    mode: CryptoJS.mode.CBC, 
    padding: CryptoJS.pad.Pkcs7, 
    iv: ivHex 
}; 

var encrypted = CryptoJS.TripleDES.encrypt(textWordArray, keyHex, options); 

var base64String = encrypted.toString(); 

console.log('base64: ' + base64String + '\n'); 

var decrypted = CryptoJS.TripleDES.decrypt({ 
    ciphertext: CryptoJS.enc.Base64.parse(base64String) 
}, keyHex, options); 

console.log('decrypted: ' + decrypted.toString(CryptoJS.enc.Utf16)); 

function reverseHexString(hexStr) { 
    var first32 = hexStr.substring(0, 32); 
    var reverseFirst32 = first32.split("").reverse().join("").split(""); 

    var reverseHex = '0000000000000000'; 

    for (var i = 0; i < reverseFirst32.length; i+=2) { 
     reverseHex += reverseFirst32[i+1]; 
     reverseHex += reverseFirst32[i]; 
    }; 

    return reverseHex; 
} 

Мой первоначальный запуск на решение привело к расшифровке неисправного и производит линию вопросительных знаков.

Используя код C#, я смог распечатать ключи и значения iv. Я попытался заменить значения keyHex и ivHex Javascript ключевыми и iv значениями, напечатанными на C#, но дешифрование все еще не выполняется.

Любая помощь, которая может быть оказана, очень ценится.

Спасибо

+1

Взгляните на - http://stackoverflow.com/a/13386173/3191896 –

ответ

0

Причина этого не работает, вероятно, генерации ключей: Вы можете использовать ASCII нули вместо \0 и у вас есть 16 из них, а не 8 (MD5 дает 16 байт, и вы хотите 24 байт TDES). Это не плохо для ключа, поскольку CryptoJS просто игнорирует дополнительные байты, но, так как вы отменяете ключ, чтобы получить IV, вместо этого вы получаете неправильный IV.

+0

i уменьшил количество ведущих нулей от 16 до 8, а также использовал '\ 0', но я все еще получаю строку вопросительные знаки при попытке расшифровать зашифрованную строку из C#. – gparedes09

+0

Я не использую C#, поэтому я не могу его протестировать, но я бы посоветовал вам проверить соответствие ключа и IV между двумя языками, напечатав на консоли как шестую или какую-либо другую кодировку. –

+1

Короче говоря, я использовал функцию шифрования C# для печати исходных значений ключа и IV и их жесткого кодирования в файл дешифрования node.js. Заключительная часть головоломки использовала кодировку Utf16LE, а не Utf16. @ artjom-b спасибо за вашу помощь. Сокращение нулей послало меня по правильному пути. – gparedes09