解密期间Base-64 char数组的长度无效

时间:2015-08-03 13:41:24

标签: c# asp.net encryption

我在登录时使用以下代码我收到以下错误

Base-64字符数组或字符串的长度无效。

第24行:byte [] cipherBytes = Convert.FromBase64String(txtpas.Text);

 protected void txtlog_Click(object sender, EventArgs e)
    {
        string EncryptionKey = "MAKV2SPBNI99212";
        byte[] cipherBytes = Convert.FromBase64String(txtpas.Text);
        using (Aes encryptor = Aes.Create())
        {
            Rfc2898DeriveBytes pdb = new Rfc2898DeriveBytes(EncryptionKey, new byte[] { 0x49, 0x76, 0x61, 0x6e, 0x20, 0x4d, 0x65, 0x64, 0x76, 0x65, 0x64, 0x65, 0x76 });
            encryptor.Key = pdb.GetBytes(32);
            encryptor.IV = pdb.GetBytes(16);
            using (MemoryStream ms = new MemoryStream())
            {
                using (CryptoStream cs = new CryptoStream(ms, encryptor.CreateDecryptor(), CryptoStreamMode.Write))
                {
                    cs.Write(cipherBytes, 0, cipherBytes.Length);
                    cs.Close();
                }
                txtpas.Text = Encoding.Unicode.GetString(ms.ToArray());

                if (u.Login(txtuser.Text, txtpas.Text) == true)
                {
                    UtilityClass.CreateCookie("login", new string[] { "username", "usertypeid" }, new string[] { txtuser.Text, u.UserTypeID.ToString().Trim() }, !chkrem.Checked, Response);
                    Response.Redirect("SiteAdmin/index.aspx");
                }
                else
                {

                    Label1.Text = "“Invalid Username or Password”";

                }
            }
        }
        }

1 个答案:

答案 0 :(得分:0)

考虑一下Base64字符串的作用。它在6位边界上断开8位字节并分配与这些位的值对应的文本字符。如果你有1个字节,你将有2个Base64字符(加上Base64字符串末尾总是加上额外的字符)。其中一个Base64字符可以是64个成员中的任何字符"字母表"其中另一个将是4个字符中的一个,具体取决于最后2位的设置。

如果要编码2个字节,这16个字节将成为3个Base64字符,其最后一个字符只能来自Base64字母表的低16位(4位)。

等等。 3个字节是24位,需要4个Base64字符来表示它们。但在什么情况下我们需要5个Base64字符呢?决不。 3个字节适合4个字符,4个字节需要6个字符。任何长度为5个字符的Base64字符串都不是任何整数字节的良好表示。这些无效长度在整个数字范围内经常重复。

现在不是说一个简单的压缩算法不能截断尾随的0位并制造一个5字符的Base64字符串,但它不正常,如果你试图将它转换为字节就会抛出异常从这样的长度。