首页 > 解决方案 > base64 编码是否对编码有任何字符串长度限制?

问题描述

我有标签应用程序,它使用 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() 函数中,最后一行,return (new StreamReader(csD)).ReadToEnd(); 给出了例外。

我使用 AES 加密加密的相同密码,它给了我 "xwYgqg8+xnynU7MpceOoJ70HuRIIw+OkcDPBVa18mLw=" 与 base64 编码相比如此大的加密密码,解码时不会出现任何异常。

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

我们的一位用户在解码密码时遇到了这个问题。让所有用户在解码时都没有问题。

标签: c#encryptionencodingbase64

解决方案


对要编码的字符串没有限制(“加密”是一个不同的过程)并且对结果没有限制,这取决于您输入的字符数(考虑到 base64 用于编码通过 http 发送的文件的主体,所以,无限)。

错误所指的填充是=附加到字符串末尾的填充。Base64 编码获取您的原始消息,将其划分为字节,然后将位流分组为 6 位段,然后将其转换为字母数字表示。=当您的消息的位长不能被 6 整除时,会添加这些。

我的猜测是该字符串在到达之前发生了某些事情,Convert.FromBase64String或者 base64 编码(您的示例中缺少)甚至不起作用。

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


推荐阅读