Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Difference between Convert.ToBase64String/Convert.FromBase64String and Encoding.UTF8.GetBytes/Encoding.UTF8.GetString

I currently am learning Symmetric Cryptography in .NET. I wrote a demo as following:

    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;
        }
    }

Everything work as expected. But if I replace

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)))

I got an error at CryptoStream System.NotSupportedException. After diagnostic the code, I found that Encoding.UTF8.GetBytes(cipherText) have more bytes than encrypted

So what is the difference between using Convert.From/ToBase64String and Encoding.UTF8.GetBytes/GetString) ?

like image 605
Doan Cuong Avatar asked Nov 08 '13 01:11

Doan Cuong


People also ask

What is Convert FromBase64String?

The Convert. FromBase64String(String) method in C# converts the specified string, which encodes binary data as base-64 digits, to an equivalent 8-bit unsigned integer array.

How do I convert ToBase64String?

ToBase64String(Byte[], Int32, Int32) Converts a subset of an array of 8-bit unsigned integers to its equivalent string representation that is encoded with base-64 digits. Parameters specify the subset as an offset in the input array, and the number of elements in the array to convert.


1 Answers

UTF-8 is a character encoding. It encodes Unicode codepoints (characters) into bytes.

Base64 is a binary-to-text encoding. It encodes bytes to text.

You need the latter in this case.

Encoding.UTF8.GetString decodes a UTF-8-encoded byte array, which is lossy if there are invalid byte sequences (which is highly likely if you feed it random bytes like a ciphertext).

like image 122
ntoskrnl Avatar answered Sep 16 '22 13:09

ntoskrnl