2015-06-12 8 views
3

У меня есть текстовое поле и кнопка «дешифровать» в моем приложении Windows Form, где я помещаю там зашифрованную строку и пытаюсь ее расшифровать, но проблема в этом. Во-первых, я получил этот класс код, называемый DataEncryptor от парня на этом сайте:Расшифровать зашифрованный текст

public class DataEncryptor 
{ 
    TripleDESCryptoServiceProvider symm; 

    #region Factory 
    public DataEncryptor() 
    { 
     this.symm = new TripleDESCryptoServiceProvider(); 
     this.symm.Padding = PaddingMode.PKCS7; 
    } 
    public DataEncryptor(TripleDESCryptoServiceProvider keys) 
    { 
     this.symm = keys; 
    } 

    public DataEncryptor(byte[] key, byte[] iv) 
    { 
     this.symm = new TripleDESCryptoServiceProvider(); 
     this.symm.Padding = PaddingMode.PKCS7; 
     this.symm.Key = key; 
     this.symm.IV = iv; 
    } 

    #endregion 

    #region Properties 
    public TripleDESCryptoServiceProvider Algorithm 
    { 
     get { return symm; } 
     set { symm = value; } 
    } 
    public byte[] Key 
    { 
     get { return symm.Key; } 
     set { symm.Key = value; } 
    } 
    public byte[] IV 
    { 
     get { return symm.IV; } 
     set { symm.IV = value; } 
    } 

    #endregion 

    #region Crypto 

    public byte[] Encrypt(byte[] data) { return Encrypt(data, data.Length); } 
    public byte[] Encrypt(byte[] data, int length) 
    { 
     try 
     { 
      // Create a MemoryStream. 
      var ms = new MemoryStream(); 

      // Create a CryptoStream using the MemoryStream 
      // and the passed key and initialization vector (IV). 
      var cs = new CryptoStream(ms, 
       symm.CreateEncryptor(symm.Key, symm.IV), 
       CryptoStreamMode.Write); 

      // Write the byte array to the crypto stream and flush it. 
      cs.Write(data, 0, length); 
      cs.FlushFinalBlock(); 

      // Get an array of bytes from the 
      // MemoryStream that holds the 
      // encrypted data. 
      byte[] ret = ms.ToArray(); 

      // Close the streams. 
      cs.Close(); 
      ms.Close(); 

      // Return the encrypted buffer. 
      return ret; 
     } 
     catch (CryptographicException ex) 
     { 
      Console.WriteLine("A cryptographic error occured: {0}", ex.Message); 
     } 
     return null; 
    } 

    public string EncryptString(string text) 
    { 
     return Convert.ToBase64String(Encrypt(Encoding.UTF8.GetBytes(text))); 
    } 

    public byte[] Decrypt(byte[] data) { return Decrypt(data, data.Length); } 
    public byte[] Decrypt(byte[] data, int length) 
    { 
     try 
     { 
      // Create a new MemoryStream using the passed 
      // array of encrypted data. 
      MemoryStream ms = new MemoryStream(data); 

      // Create a CryptoStream using the MemoryStream 
      // and the passed key and initialization vector (IV). 
      CryptoStream cs = new CryptoStream(ms, 
       symm.CreateDecryptor(symm.Key, symm.IV), 
       CryptoStreamMode.Read); 

      // Create buffer to hold the decrypted data. 
      byte[] result = new byte[length]; 

      // Read the decrypted data out of the crypto stream 
      // and place it into the temporary buffer. 
      cs.Read(result, 0, result.Length); 
      return result; 
     } 
     catch (CryptographicException ex) 
     { 
      Console.WriteLine("A cryptographic error occured: {0}", ex.Message); 
     } 
     return null; 
    } 

    public string DecryptString(string data) 
    { 
     return Encoding.UTF8.GetString(Decrypt(Convert.FromBase64String(data))).TrimEnd('\0'); 
    } 

    #endregion 

} 

И он дал использование этого:

string message="A very secret message here."; 
DataEncryptor keys=new DataEncryptor(); 
string encr=keys.EncryptString(message); 

// later 
string actual=keys.DecryptString(encr); 

Я скопировал свой код и работает на шифрование и дешифрование:

//my code 
private void proceedED(string data) 
{ 
    DataEncryptor key = new DataEncryptor(); 
    string encr = key.EncryptString(data); 
    string actual = key.DecryptString(encr); 
    encryptedLabel.Text = encr; 
    decryptedLabel.Text = actual;  
} 

Затем я создал метод, как это:

private void proceedDecrypt(string data) 
{ 
    DataEncryptor key = new DataEncryptor(); 
    string decr = key.DecryptString(data); 
    decryptedData.Text = decr; 
} 

Проблема в том, что он падает, когда я отправляю, и я не знаю почему. Я думаю, что это должна быть настоящая зашифрованная строка, потому что это обычная строка. Как это исправить?

+0

Что Исключение составляет? Во всех сообщениях о «ошибках», «судорогах» и т. Д. Относятся сообщение и stacktrace исключения?Возможно, вы не инициализировали ключ или что-то не так с вашими данными. Мы не можем знать это без сообщения об исключении. –

+0

'Array не может быть пустым Параметр name: bytes' строка ошибка в методе DecryptString (строковые данные) в нижней части класса DataEncryptor – newbieguy

+1

Похоже, вы создали метод' continueDecrypt', но передали ему пустые 'данные'. Смотрит на то место, которое вы называете этим методом. –

ответ

0

Ну, я, наконец, решил ее ...

Я скопировал этот код из https://social.msdn.microsoft.com/Forums/vstudio/en-US/d6a2836a-d587-4068-8630-94f4fb2a2aeb/encrypt-and-decrypt-a-string-in-c?forum=csharpgeneral

static readonly string PasswordHash = "[email protected]@Sw0rd"; 
    static readonly string SaltKey = "[email protected]&KEY"; 
    static readonly string VIKey = "@1B2c3D4e5F6g7H8"; 

    public static string Encrypt(string plainText) 
    { 
     byte[] plainTextBytes = Encoding.UTF8.GetBytes(plainText); 

     byte[] keyBytes = new Rfc2898DeriveBytes(PasswordHash, Encoding.ASCII.GetBytes(SaltKey)).GetBytes(256/8); 
     var symmetricKey = new RijndaelManaged() { Mode = CipherMode.CBC, Padding = PaddingMode.Zeros }; 
     var encryptor = symmetricKey.CreateEncryptor(keyBytes, Encoding.ASCII.GetBytes(VIKey)); 

     byte[] cipherTextBytes; 

     using (var memoryStream = new MemoryStream()) 
     { 
      using (var cryptoStream = new CryptoStream(memoryStream, encryptor, CryptoStreamMode.Write)) 
      { 
       cryptoStream.Write(plainTextBytes, 0, plainTextBytes.Length); 
       cryptoStream.FlushFinalBlock(); 
       cipherTextBytes = memoryStream.ToArray(); 
       cryptoStream.Close(); 
      } 
      memoryStream.Close(); 
     } 
     return Convert.ToBase64String(cipherTextBytes); 
    } 
    public static string Decrypt(string encryptedText) 
    { 
     byte[] cipherTextBytes = Convert.FromBase64String(encryptedText); 
     byte[] keyBytes = new Rfc2898DeriveBytes(PasswordHash, Encoding.ASCII.GetBytes(SaltKey)).GetBytes(256/8); 
     var symmetricKey = new RijndaelManaged() { Mode = CipherMode.CBC, Padding = PaddingMode.None }; 

     var decryptor = symmetricKey.CreateDecryptor(keyBytes, Encoding.ASCII.GetBytes(VIKey)); 
     var memoryStream = new MemoryStream(cipherTextBytes); 
     var cryptoStream = new CryptoStream(memoryStream, decryptor, CryptoStreamMode.Read); 
     byte[] plainTextBytes = new byte[cipherTextBytes.Length]; 

     int decryptedByteCount = cryptoStream.Read(plainTextBytes, 0, plainTextBytes.Length); 
     memoryStream.Close(); 
     cryptoStream.Close(); 
     return Encoding.UTF8.GetString(plainTextBytes, 0, decryptedByteCount).TrimEnd("\0".ToCharArray()); 
    } 

и удалил DataEncryptor класса

0

Вы создаете новый объект в обеих функциях;

DataEncryptor key = new DataEncryptor(); 

Именно по этой причине, для вашей ошибки.

Просто объявите;

DataEncryptor key = new DataEncryptor(); 

С другой стороны, вы продолжаете() и продолжаетеDecrypt(), я имею в виду сделать его общедоступным.

ИЛИ вы можете передать ключ доступа в качестве параметра для продолженияDecrypt() и использовать его в этой функции.

Нравится;

DataEncryptor key = new DataEncryptor(); 

private void proceedED(string data) 
{ 
    string encr = key.EncryptString(data); 
    string actual = key.DecryptString(encr); 
    encryptedLabel.Text = encr; 
    decryptedLabel.Text = actual; 
    proceedDecrypt(encr);  
} 

private void proceedDecrypt(string data) 
{ 

    string decr = key.DecryptString(data); 
    decryptedData.Text = decr; 
} 

Надеюсь, это поможет .. !!!

+0

да это действительно помогает, но это не ошибка – newbieguy

+0

, с какой ошибкой вы столкнулись сейчас .. !!! –

+0

проверить редактирование, и если ошибка, то скажите мне, какую ошибку вы получите .... !!! Также как вы вызываете функцию continueDecrypt()? –

1

Каждый экземпляр DataEncryptor генерирует новые ключи. Вам нужно использовать те же ключи, которые зашифровали строку для расшифровки. Если это делается в том же процессе, сохраните ссылку на DataEncryptor key. В противном случае вам нужно инициализировать с помощью конструктора DataEncryptor(byte[] key, byte[] iv).

Try следующий код:

class Program 
{ 
    static void Main(string[] args) 
    { 
     string key, iv; 

     var plain="A very secret message."; 
     var cipher=EncryptString(plain, out key, out iv); 

     // Later ... 

     var message=DecryptString(cipher, key, iv); 
    } 

    public static string EncryptString(string plain, out string key, out string iv) 
    { 
     var crypto=new DataEncryptor(); 
     iv=Convert.ToBase64String(crypto.IV); 
     key=Convert.ToBase64String(crypto.Key); 
     return crypto.EncryptString(plain); 
    } 

    public static string DecryptString(string cipher, string key, string iv) 
    { 
     var crypto=new DataEncryptor(
      Convert.FromBase64String(key), 
      Convert.FromBase64String(iv)); 

     return crypto.DecryptString(cipher); 
    } 
} 
Смежные вопросы