2013-11-08 2 views
10

В настоящее время я изучаю симметричную криптографию в .NET. Я написал демо-версию следующим образом:Разница между Convert.ToBase64String/Convert.FromBase64String и Encoding.UTF8.GetBytes/Encoding.UTF8.GetString

private byte[] key = Encoding.ASCII.GetBytes("abcdefgh"); 
    private byte[] IV = Encoding.ASCII.GetBytes("hgfedcba"); 
    private byte[] encrypted; 

    public Form1() 
    { 
     InitializeComponent(); 

    } 

    private void btnEncrypt_Click(object sender, EventArgs e) 
    { 
     this.textBox2.Text = this.Encrypt(this.textBox1.Text); 
    } 

    private void btnDecrypt_Click(object sender, EventArgs e) 
    { 
     this.textBox3.Text = this.Decrypt(this.textBox2.Text); 
    } 

    private string Encrypt(string plainText) 
    { 
     try 
     { 
      using (DESCryptoServiceProvider crypto = new DESCryptoServiceProvider()) 
      { 
       crypto.Key = this.key; 
       crypto.IV = this.IV; 

       ICryptoTransform transform = crypto.CreateEncryptor(crypto.Key, crypto.IV); 

       using (MemoryStream stream = new MemoryStream()) 
       { 
        using (CryptoStream cryptoStream = new CryptoStream(stream, transform, CryptoStreamMode.Write)) 
        { 
         using (StreamWriter writer = new StreamWriter(cryptoStream)) 
         { 
          writer.Write(plainText); 
         } 

         encrypted = stream.ToArray(); 
        } 
       } 
      } 

      return Convert.ToBase64String(encrypted); 
     } 
     catch (Exception) 
     { 

      throw; 
     } 
    } 

    private string Decrypt(string cipherText) 
    { 
     try 
     { 
      string plainText = string.Empty; 

      using (DESCryptoServiceProvider crypto = new DESCryptoServiceProvider()) 
      { 
       crypto.Key = this.key; 
       crypto.IV = this.IV; 

       ICryptoTransform transform = crypto.CreateDecryptor(crypto.Key, crypto.IV); 

       using (MemoryStream stream = new MemoryStream(Convert.FromBase64String(cipherText))) 
       { 
        using (CryptoStream cryptoStream = new CryptoStream(stream, transform, CryptoStreamMode.Read)) 
        { 
         using (StreamReader reader = new StreamReader(cryptoStream)) 
         { 
          plainText = reader.ReadToEnd(); 
         } 
        } 
       } 
      } 

      return plainText; 
     } 
     catch (Exception) 
     { 

      throw; 
     } 
    } 

Все работает должным образом. Но если я заменю

return Convert.ToBase64String(encrypted); 

И

using (MemoryStream stream = new MemoryStream(Convert.FromBase64String(cipherText))) 

Для

return Encoding.UTF8.GetString(encrypted); 

И

using (MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(cipherText))) 

я получил ошибку в CryptoStream System.NotSupportedException. После диагностического кода, я обнаружил, что Encoding.UTF8.GetBytes(cipherText) больше байт, чем encrypted

Так что разница между использованием Convert.From/ToBase64String и Encoding.UTF8.GetBytes/GetString)?

+0

Вы имеете в виду, кроме очевидного: это два очень разных механизма кодирования? –

+0

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

+0

Это не тема, которую можно быстро покрыть здесь. Я предлагаю вам начать поиск в Google/Bing для каждой темы, а затем вернуться, когда у вас возникнут конкретные вопросы относительно деталей реализации. Каждое кодирование настолько радикально отличается. –

ответ

14

UTF-8 - кодировка символов. Он кодирует коды Unicode (символы) в байты.

Base64 - это двоично-текстовое кодирование. Он кодирует байты в текст.

В этом случае вам понадобится последний.

Encoding.UTF8.GetStringдекодирует в кодировке UTF-8 кодировке байтовый массив, который является потерей данных, если есть недопустимые последовательности байтов (что весьма вероятно, если вы кормите его случайные байты как в шифртекста).

+0

Большое вам спасибо, это ответ, который я ищу :) –

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