В настоящее время я изучаю симметричную криптографию в .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)
?
Вы имеете в виду, кроме очевидного: это два очень разных механизма кодирования? –
На самом деле, я хочу узнать больше о механизме кодирования, который делает разницу между ними и что мне следует учитывать, чтобы выбрать один над другим. –
Это не тема, которую можно быстро покрыть здесь. Я предлагаю вам начать поиск в Google/Bing для каждой темы, а затем вернуться, когда у вас возникнут конкретные вопросы относительно деталей реализации. Каждое кодирование настолько радикально отличается. –