2015-10-02 3 views
0

Я пытаюсь шифровать и расшифровывать текст, используя TripleDESCryptoServiceProvider.Невозможно расшифровать обратно plainText с помощью TripleDESCryptoServiceProvider

Мое требование для одного и того же открытого текста, шифрованный текст не должен быть таким же, для этого я каждый раз генерировал разные vector.

Это код для шифрования и расшифровки текста.

public string EncryptString(string PlainText) 
     { 
      GenerateIV(); 
      GenerateKey(); 
      if (PlainText == null || PlainText.Length <= 0) 
      { 
       throw new ArgumentNullException("Invalid Plaintext."); 
      } 

      if (Key == null || Key.Length <= 0) 
      { 
       throw new ArgumentNullException("Key Can Not Be Null Or Empty."); 
      } 

      if (IV == null || IV.Length <= 0) 
      { 
       throw new ArgumentNullException("Vector Can Not Be Null Or Empty."); 
      } 

      byte[] encryptedText; 

      using (TripleDESCryptoServiceProvider tdsObj = new TripleDESCryptoServiceProvider()) 
      { 
       if (!isKeyStrengthChecked) 
       { 
        bool isWeekKey = TripleDESCryptoServiceProvider.IsWeakKey(Key); 
        if (isWeekKey) 
        { 
         throw new Exception("Weak Key."); 
        } 
        else 
        { 
         isKeyStrengthChecked = true; 
        } 
       } 
       tdsObj.Key = Key; 
       tdsObj.IV = IV; 
       tdsObj.Mode = CipherMode.CBC; 
       tdsObj.Padding = PaddingMode.PKCS7; 
       ICryptoTransform encryptor = tdsObj.CreateEncryptor(tdsObj.Key, tdsObj.IV); 
       using (MemoryStream msEncrypt = new MemoryStream()) 
       { 
        using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write)) 
        { 
         using (StreamWriter srEncrypt = new StreamWriter(csEncrypt)) 
         { 
          srEncrypt.Write(PlainText); 
         } 
         encryptedText = msEncrypt.ToArray(); 
        } 
       } 
      } 
      return Convert.ToBase64String(encryptedText); 
     } 

     public string DecryptString(string cipherText) 
     { 
      GenerateIV(); 
      GenerateKey(); 
      if (cipherText == null || cipherText.Length <= 0) 
      { 
       throw new ArgumentNullException("Invalid CipherText."); 
      } 

      if (Key == null || Key.Length <= 0) 
      { 
       throw new ArgumentNullException("Key Can Not Be Null Or Empty."); 
      } 

      if (IV == null || IV.Length <= 0) 
      { 
       throw new ArgumentNullException("Vector Can Not Be Null Or Empty."); 
      } 

      byte[] cipherBytes = Convert.FromBase64String(cipherText); 
      string PlainText = null; 
      using (TripleDESCryptoServiceProvider tdsDecrypt = new TripleDESCryptoServiceProvider()) 
      { 
       tdsDecrypt.Key = Key; 
       tdsDecrypt.IV = IV; 
       tdsDecrypt.Mode = CipherMode.CBC; 
       tdsDecrypt.Padding = PaddingMode.PKCS7; 
       ICryptoTransform decrytor = tdsDecrypt.CreateDecryptor(Key, IV); 
       using (MemoryStream msDecrypt = new MemoryStream(cipherBytes)) 
       { 
        using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decrytor, CryptoStreamMode.Read)) 
        { 
         using (StreamReader srDecrypt = new StreamReader(csDecrypt)) 
         { 
          PlainText = srDecrypt.ReadToEnd(); 
         } 
        } 
       } 
      } 
      return PlainText; 
     } 

Мой полный код находится здесь .Net Fiddle

Но когда я расшифровать текст, я не получаю один и тот же простой текст. Что случилось, я сделал.

ответ

2

Вы генерировать новый IV и Клавиша с вызовом расшифровка

public string DecryptString(string cipherText) 
    { 
     GenerateIV(); 
     GenerateKey(); 
     if (cipherText == null || cipherText.Length <= 0) 

Вы должны использовать тот же IV и ключ как на шифровать и дешифровать

+0

Я с использованием такой же ключ, но другой вектор, потому что я не хочу, чтобы генерировать тот же зашифрованный текст для той же обычного текста. –

+0

Да - вы должны использовать новый IV с каждым шифрованием .. но вам нужно использовать правый IV, когда вы расшифровываете .. не просто генерируете новый. –

+0

Если вы прокомментируете 'GenerateIV()' и 'GenerateKey()' в методе 'DecryptString', программа возвращает ** Hello Amit ** –

0

Попробуйте

Dotnet Fiddle Demo

Комментарий // GenerateIV(); GenerateKey(); как на EncryptString и функции DecryptString

 string plainText1 = "Hello Amit"; 
     string plainText2 = "Hello Amit"; 
     Helper helper = new Helper(); 

     helper.GenerateIV(); 
     helper.GenerateKey(); 
     string encryptedData1 = helper.EncryptString(plainText1); 
     string encryptedData2 = helper.EncryptString(plainText2); 
     string getBackText = helper.DecryptString(encryptedData1); 
     Console.WriteLine(getBackText); 
     Console.ReadLine(); 
+0

Но если комментировать 'GenerateIV()', тогда я получу одинаковый шифрованный текст для того же простого текста. –

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