2014-09-06 2 views
-2

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

расшифровку был

public string newSample(string s) 
{ 
    byte[] buffer = Convert.FromBase64String(s); 
    Encoding utF8 = Encoding.UTF8; 
    byte[] bytes1 = utF8.GetBytes("key1"); 
    byte[] bytes2 = utF8.GetBytes("key2"); 
    RijndaelManaged rijndaelManaged1 = new RijndaelManaged(); 
    rijndaelManaged1.Mode = CipherMode.CBC; 
    rijndaelManaged1.Padding = PaddingMode.Zeros; 
    rijndaelManaged1.BlockSize = 128; 
    rijndaelManaged1.KeySize = 128; 
    RijndaelManaged rijndaelManaged2 = rijndaelManaged1; 
    ICryptoTransform transform = (ICryptoTransform)null; 

    transform = rijndaelManaged2.CreateDecryptor(bytes2, bytes1); 
    byte[] bytes3 = (byte[])null; 
    using (MemoryStream memoryStream = new MemoryStream()) 
    { 
     using (CryptoStream cryptoStream = new CryptoStream((Stream)memoryStream, transform, CryptoStreamMode.Write)) 
     { 
      cryptoStream.Write(buffer, 0, buffer.GetLength(0)); 
      cryptoStream.FlushFinalBlock(); 
     } 
     rijndaelManaged2.Clear(); 
     bytes3 = memoryStream.ToArray(); 
    } 
    return new string(Encoding.UTF8.GetChars(bytes3)); 
} 

можно ли обратный код и создать ключ шифрования? если так как может быть шифрование должно выглядеть lik для этого метода дешифрования ??

благодаря

+0

Я предлагаю выбросить этот код и заменить его на ответ [jbtule] (http://stackoverflow.com/a/10366194/445517) на соответствующий вопрос. В отличие от вашего кода, он действительно безопасен. – CodesInChaos

+0

CodesInChaos спасибо за ссылку, но я должен пойти с этим кодом по какой-то причине cheerz – Gayan

+0

Пара недостатков: 1) Нет MAC => сломанные активными атаками 2) Нет IV, утечки общих префиксов 3) Нулевая прокладка не обратима 4) Ключ должен быть двоичным, а не текстом. 5) Как отмечалось в jon, вы не можете использовать UTF8 для зашифрованного текста. – CodesInChaos

ответ

1

Это проблема - или, по крайней мере, проблема начальная:

return new string(Encoding.UTF8.GetChars(bytes3)); 

Результат шифрования не в кодировке UTF-8 кодировке массив байт ... это произвольные байты. Предполагая, что это допустимый текст в кодировке UTF-8, вы теряете информацию.

Вместо этого вы должны использовать подход hex или base64, оба из которых предназначены для преобразования произвольных двоичных данных в текст без потерь. Например:

return Convert.ToBase64String(bytes3); 

Теперь код дешифрования должен начинаться с:

byte[] encryptedData = Convert.FromBase64String(base64EncryptedText); 

(. Где base64EncryptedText это значение, возвращаемое из метода шифрования)

Оттуда он должен быть вопрос просто реверсирования каждого шага, и есть множество примеров вокруг. Однако вы можете обнаружить, что у вас есть проблема из-за режима заполнения, однако вам может потребоваться отдельно записать длину исходных данных.

В стороне, непонятно, почему ваш метод принимает строку в первую очередь. Нечетно для метода шифрования взять базу данных с кодировкой base64. Для него чаще встречается либо обычная текстовая строка, которая преобразуется в байты, используя что-то вроде Encoding.UTF8, либо для принятия на себя byte[].

+0

Jon Skeet спасибо вам, что это была первая проблема. теперь код работает именно так, как мне нужно, спасибо вам снова – Gayan