base64编码是否有任何字符串长度限制要编码?

时间:2019-01-24 08:39:48

标签: c# encryption encoding base64

我有一个Tab应用程序,该应用程序使用Base64编码转换密码。它通过Web服务发送到Web应用程序并在其中解码。用于解码的代码是

public static string DecryptStringPassword(string base64StringToDecrypt)
        {
            //Set up the encryption objects
            using (AesCryptoServiceProvider acsp = GetProvider(Encoding.Default.GetBytes(Key)))
            {
                byte[] RawBytes = Convert.FromBase64String(base64StringToDecrypt);
                ICryptoTransform ictD = acsp.CreateDecryptor();

                //RawBytes now contains original byte array, still in Encrypted state

                //Decrypt into stream
                MemoryStream msD = new MemoryStream(RawBytes, 0, RawBytes.Length);
                CryptoStream csD = new CryptoStream(msD, ictD, CryptoStreamMode.Read);
                //csD now contains original byte array, fully decrypted

                //return the content of msD as a regular string
                return (new StreamReader(csD)).ReadToEnd();
            }
        }

        private static AesCryptoServiceProvider GetProvider(byte[] key)
        {
            AesCryptoServiceProvider result = new AesCryptoServiceProvider();
            result.BlockSize = 128;
            result.KeySize = 128;
            result.Mode = CipherMode.CBC;
            result.Padding = PaddingMode.PKCS7;

            result.GenerateIV();
            result.IV = new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };

            byte[] RealKey = GetKey(key, result);
            result.Key = RealKey;
            // result.IV = RealKey;
            return result;
        }

        private static byte[] GetKey(byte[] suggestedKey, SymmetricAlgorithm p)
        {
            byte[] kRaw = suggestedKey;
            List<byte> kList = new List<byte>();

            for (int i = 0; i < p.LegalKeySizes[0].MinSize; i += 8)
            {
                kList.Add(kRaw[(i / 8) % kRaw.Length]);
            }
            byte[] k = kList.ToArray();
            return k;
        }

base64编码有最大字符限制吗?对于密码“ xwYgqg8 + xnynU7MpceOoJw ==“”之一,它是加密的字符串,在使用上述代码进行解码时会给出“填充无效且无法删除”的异常。 在DecryptStringPassword()函数的最后一行, 返回(新的StreamReader(csD))。ReadToEnd();给出例外。

我使用AES加密对相同的密码进行了加密,它给了我 “ xwYgqg8 + xnynU7MpceOoJ70HuRIIw + OkcDPBVa18mLw =”与base64编码相比,加密密码如此之大,在解码时不会产生任何异常。

base64编码是否总是提供24个字符长的加密字符串或对要加密的字符串有任何长度限制?

我们的用户之一在解码密码时面临此问题。让所有用户在解码时都没有问题。

1 个答案:

答案 0 :(得分:2)

对要编码的字符串没有限制(“加密”是一个不同的过程),对结果的限制也取决于输入的字符数(考虑使用base64来编码通过http发送的文件正文) ,所以没有限制。

错误所指的填充是在字符串末尾附加的=。 Base64编码采用原始消息,将其划分为字节,然后将位流分成6位的段,然后将其转换为字母数字表示形式。当消息的位长不能被6整除时,将添加那些=

我的猜测是,该字符串在到达Convert.FromBase64String之前已经发生了某些事情,或者base64编码(示例中缺少)甚至无法正常工作。

我只用base64编码/解码编写一个最小的示例,以验证该部分是否正常工作。