2013-02-15 3 views
-1

Я учусь о шифровании и использовании крипто-Js Я сделал Js & C# версию. Что я пытаюсь сделать, так это то, что версия JS или C# сможет декодировать друг друга.Crypto-Js с C#

Для тестирования я сохранил IV и KEY, paddding и режим такой же, как в # например JS и C.

У меня есть они как дешифрование, так и шифрование данных с уважением, но то, что я еще должен выполнить, заключается в предоставлении зашифрованного JS возможности декодирования с использованием C#.

JS

var key = CryptoJS.enc.Base64.parse('7061737323313233'); 
var iv = CryptoJS.enc.Base64.parse('7061737323313233'); 
var encrypted = CryptoJS.AES.encrypt("It works", key, 
{ keySize: 128/8, iv: iv, mode: CryptoJS.mode.CBC,padding: CryptoJS.pad.Pkcs7 }); 

var decrypted = CryptoJS.AES.decrypt(encrypted, key, { 
keySize: 128/8, iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 }); 

document.write('Encrypted :' + encrypted + '<br>'); 
document.write('Key :' + encrypted.key + '<br>'); 
document.write('Salt :' + encrypted.salt + '<br>'); 
document.write('iv :' + encrypted.iv + '<br>'); 
document.write('Decrypted : ' + decrypted + '<br>'); 
document.write('utf8 = ' + decrypted.toString(CryptoJS.enc.Utf8) + '<br>'); 

С #

public void startEncryption(string original) 
     { 

      using (RijndaelManaged myRijndael = new RijndaelManaged()) 
      { 
       //Settings 
       myRijndael.Mode = CipherMode.CBC; 
       myRijndael.Padding = PaddingMode.PKCS7; 
       myRijndael.FeedbackSize = 128; 

       keybytes = Encoding.UTF8.GetBytes("7061737323313233"); 
       //Should be made unique for each message!. TODO 
       iv = Encoding.UTF8.GetBytes("7061737323313233"); 

       // Encrypt the string to an array of bytes. 
       encrypted = EncryptStringToBytes(original, keybytes, iv); 

       //Show Encrypted data 
       txt_Output.Text = Convert.ToBase64String(encrypted); 

       // Decrypt the bytes to a string. 
       string roundtrip = DecryptStringFromBytes(encrypted, keybytes, iv); 

       //Display the original data and the decrypted data. 
       Console.WriteLine("Original: {0}", original); 
       Console.WriteLine("Round Trip: {0}", roundtrip); 
      } 


     } 

В случае, если возникает проблема в дешифрования.

private void btn_Decrypt_Click(object sender, EventArgs e) 
    { 
     Console.WriteLine("Decrypting.."); 
     using (RijndaelManaged myRijndael = new RijndaelManaged()) 
     { 
      //Settings 
      myRijndael.Mode = CipherMode.CBC; 
      myRijndael.Padding = PaddingMode.PKCS7; 
      myRijndael.FeedbackSize = 128; 

      keybytes = Encoding.UTF8.GetBytes("7061737323313233"); 
      //Should be made unique for each message!. TODO 
      iv = Encoding.UTF8.GetBytes("7061737323313233"); 

      // Decrypt the bytes to a string. 
      string roundtrip = DecryptToString(txt_Output.Text); 

      txt_Output.Text = roundtrip; 
      //Display the original data and the decrypted data. 

     } 
    } 

    public string DecryptToString(string TextValue) 
    { 

     return DecryptStringFromBytes(Convert.FromBase64String(TextValue), keybytes, iv); 
    } 


     static string DecryptStringFromBytes(byte[] cipherText, byte[] Key, byte[] IV) 
    { 
     // Check arguments. 
     if (cipherText == null || cipherText.Length <= 0) 
      throw new ArgumentNullException("cipherText"); 
     if (Key == null || Key.Length <= 0) 
      throw new ArgumentNullException("Key"); 
     if (IV == null || IV.Length <= 0) 
      throw new ArgumentNullException("Key"); 

     // Declare the string used to hold 
     // the decrypted text. 
     string plaintext = null; 

     // Create an RijndaelManaged object 
     // with the specified key and IV. 
     using (RijndaelManaged rijAlg = new RijndaelManaged()) 
     { 
      rijAlg.Key = Key; 
      rijAlg.IV = IV; 
      rijAlg.Padding = PaddingMode.PKCS7; 
      rijAlg.Mode = CipherMode.CBC; 

      // Create a decrytor to perform the stream transform. 
      ICryptoTransform decryptor = rijAlg.CreateDecryptor(rijAlg.Key, rijAlg.IV); 

      // Create the streams used for decryption. 
      using (MemoryStream msDecrypt = new MemoryStream(cipherText)) 
      { 
     using (CryptoStream csDecrypt = 
     new CryptoStream(msDecrypt,decryptor,CryptoStreamMode.Read)) 
       { 
       using (StreamReader srDecrypt = new StreamReader(csDecrypt)) 
       { 

        // Read the decrypted bytes from the decrypting stream 
        // and place them in a string. 
        plaintext = srDecrypt.ReadToEnd(); 
       } 
      } 
     } 

     } 

     return plaintext; 

    } 

Я производить различные строки шифрованного размера:

JS: MhAP11fHa + fUfRzSw2UHVQ == C#: + Ijpt1GDVgM4MqMAQUwf0Q ==

Я получаю Перетяжка является недействительной и не может быть удалена, при попытке расшифровать строку JS в C# Где я ошибаюсь ?.

ответ

3

В основном вы сталкиваетесь с проблемами с кодировкой. Прежде всего, вы анализируете свой IV с использованием декодирования Base64 в одной реализации и один с использованием прямого кодирования символов в другом. Строки Base64 также не похожи на строки Base64.

Кроме того, многие библиотеки (неправильно) позволяют использовать неправильный ключ и размеры IV. Это, однако, запутывает, поскольку не существует общего способа для расширения ключа или IV. Поэтому вы должны убедиться, что двоичные представления ключа и IV верны для конкретного алгоритма.

Для AES вы должны использовать размер ключа 128, 192 или 256 бит и размер IV, идентичный размеру блока, 128 бит. IV должен быть случайным образом сгенерирован и передан на другую сторону, например. путем префикса IV для зашифрованного текста.

Смежные вопросы