Convert.ToBase64String/Convert.FromBase64String和Encoding.UTF8.GetBytes/Encoding.UTF8.GetString的区别

16

我目前正在学习.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);

And

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

To

return Encoding.UTF8.GetString(encrypted);

And

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

在 CryptoStream 中我遇到了一个错误 System.NotSupportedException。经过诊断,我发现 Encoding.UTF8.GetBytes(cipherText)encrypted 有更多的字节。

那么使用 Convert.From/ToBase64StringEncoding.UTF8.GetBytes/GetString 的区别是什么?


除了显而易见的:它们是两种非常不同的编码机制,你还有什么意思? - Sam Axe
1
其实,我想了解更多关于编码机制的知识,这些机制造成了它们之间的差异。为了选择其中一种编码方式,我需要考虑哪些因素? - Doan Cuong
这不是一个可以在这里快速涵盖的话题。我建议您先通过Google/Bing搜索每个主题,然后在涉及实现细节的具体问题时再回来。每种编码方式都有如此根本的不同之处。 - Sam Axe
1个回答

27

UTF-8是一种字符编码方式,它将Unicode码点(字符)编码为字节。

Base64是一种二进制到文本的编码方式,它将字节编码为文本。

在这种情况下,你需要使用后者。

Encoding.UTF8.GetString 解码 一个UTF-8编码的字节数组,如果输入包含无效的字节序列(例如密文),则会有信息丢失的风险。


非常感谢,这就是我在寻找的答案 :) - Doan Cuong

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接