Проблема с шифрованием .NET
-
12-10-2019 - |
Вопрос
Я сослался на эту статью http://www.codeproject.com/kb/security/dotnetcrypto.aspx И я пытаюсь написать зашифрованную строку вместо простого текста. Ниже приведен код, который я использую:
TextWriter tw = new StreamWriter("c:\\temp\\test.txt");
string plainString = "String to be encrypted";
PasswordDeriveBytes pdb = new PasswordDeriveBytes("Test",new byte[] {0x49, 0x76, 0x61, 0x6e, 0x20, 0x4d,0x65, 0x64, 0x76, 0x65, 0x64, 0x65, 0x76});
Rijndael alg = Rijndael.Create();
alg.Key = pdb.GetBytes(32);
alg.IV = pdb.GetBytes(16);
tw.WriteLine(alg.IV.ToString());
MemoryStream ms = new MemoryStream();
CryptoStream cs = new CryptoStream(ms,alg.CreateEncryptor(), CryptoStreamMode.Write);
byte[] clearBytes = System.Text.Encoding.Unicode.GetBytes(plainString);
cs.Write(clearBytes, 0, clearBytes.Length);
cs.Close();
tw.WriteLine(ms.ToString());
ms.Close();
tw.Flush();
Однако, когда я открываю файл, я получаю System.IO.MemoryStream
вместо некоторых зашифрованных символов. Что я пропустил?
Решение
Я думаю, что .NET очень хорошо поддерживает шифрование строки с использованием алгоритма MD5. Если вы хотите использовать MD5, см. Следующий код.
private void encrypt(ref string password)
{
Int32 counter;
Char[] passwordArr;
String encryptedPassword;
Byte[] hashedPassword;
MD5CryptoServiceProvider obj = new MD5CryptoServiceProvider();
passwordArr = password.ToCharArray();
Byte[] passwordBytes = new byte[passwordArr.Length - 1];
for (counter = 0; counter < passwordBytes.Length; counter++)
{
passwordBytes[counter] = Convert.ToByte(passwordArr[counter]);
}
hashedPassword = obj.ComputeHash(passwordBytes);
encryptedPassword = BitConverter.ToString(hashedPassword);
password = encryptedPassword;
obj = null;
}
Другие советы
Memorystream.tostring () полагается на реализацию по умолчанию object.tostring (), которая выписывает имя класса. Создайте FileStream и передайте его в CTOR CryptoStream.
http://msdn.microsoft.com/en-us/library/system.io.filestream.aspx
Ну, проблема связана с MS.ToString (). Вы, скорее, должны читать байты из MemoryStream, изменить их на соответствующее кодирование, а затем записать в текстовый поток.