【发布时间】:2013-11-08 01:14:38
【问题描述】:
我目前正在学习 .NET 中的对称密码学。我写了一个演示如下:
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 中搜索每个主题,然后在您对实施细节有具体问题时再回来。每种编码都截然不同。
标签: c# cryptography