【问题标题】:Difference between Convert.ToBase64String/Convert.FromBase64String and Encoding.UTF8.GetBytes/Encoding.UTF8.GetStringConvert.ToBase64String/Convert.FromBase64String 和 Encoding.UTF8.GetBytes/Encoding.UTF8.GetString 的区别
【发布时间】: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/ToBase64StringEncoding.UTF8.GetBytes/GetString) 有什么区别呢?

【问题讨论】:

  • 你的意思是除了显而易见的:它们是两种截然不同的编码机制?
  • 实际上,我想了解更多关于它们之间差异的编码机制以及我应该考虑什么才能选择一个而不是另一个。
  • 这不是一个可以在这里快速涵盖的主题。我建议您首先在 Google/Bing 中搜索每个主题,然后在您对实施细节有具体问题时再回来。每种编码都截然不同。

标签: c# cryptography


【解决方案1】:

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

Base64 是二进制到文本的编码。它将字节编码为文本。

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

Encoding.UTF8.GetString解码一个 UTF-8 编码的字节数组,如果存在无效的字节序列,这是有损的(如果你给它提供像密文这样的随机字节,这很有可能)。

【讨论】:

  • 非常感谢,这就是我正在寻找的答案:)
猜你喜欢
  • 2013-06-04
  • 2012-04-02
  • 2018-01-06
  • 2016-09-12
  • 1970-01-01
  • 2018-04-07
  • 2021-06-22
  • 2020-10-26
相关资源
最近更新 更多