C# base64编码是否有编码的字符串长度限制?

C# base64编码是否有编码的字符串长度限制?,c#,encryption,encoding,base64,C#,Encryption,Encoding,Base64,我有一个tab应用程序,它使用Base64编码转换密码。它通过web服务发送到web应用程序,并在其中解码。解码的代码是 public static string DecryptStringPassword(string base64StringToDecrypt) { //Set up the encryption objects using (AesCryptoServiceProvider acsp = GetProvider

我有一个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;
        }
公共静态字符串解密StringPassword(字符串base64StringToDecrypt)
{
//设置加密对象
使用(AESCryptServiceProvider acsp=GetProvider(Encoding.Default.GetBytes(Key)))
{
byte[]RawBytes=Convert.FromBase64String(base64StringToDecrypt);
ICryptoTransform ictD=acsp.CreateDecryptor();
//RawBytes现在包含原始字节数组,仍然处于加密状态
//解密成流
MemoryStream msD=新的MemoryStream(RawBytes,0,RawBytes.Length);
CryptoStream csD=新加密流(msD、ictD、CryptoStreamMode.Read);
//csD现在包含完全解密的原始字节数组
//以常规字符串形式返回msD的内容
return(newstreamreader(csD)).ReadToEnd();
}
}
私有静态加密服务提供程序GetProvider(字节[]密钥)
{
AESCryptServiceProvider结果=新的AESCryptServiceProvider();
result.BlockSize=128;
result.KeySize=128;
结果.Mode=CipherMode.CBC;
result.Padding=PaddingMode.PKCS7;
result.GenerateIV();
result.IV=新字节[]{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
字节[]RealKey=GetKey(key,result);
result.Key=RealKey;
//result.IV=RealKey;
返回结果;
}
私有静态字节[]GetKey(字节[]suggestedKey,对称算法p)
{
字节[]kRaw=建议的密钥;
List kList=新列表();
对于(int i=0;i

base64编码是否有最大字符限制?对于其中一个密码,“xwYgqg8+xnynU7MpceOoJw==”是加密字符串,在使用上述代码解码时出现异常“填充无效且无法删除”。 在DecryptStringPassword()函数的最后一行, return(newstreamreader(csD)).ReadToEnd();给出了一个例外

和我用AES加密加密的密码一样,它给了我 “xwYgqg8+xnynU7MpceOoJ70HuRIIw+OkcDPBVa18mLw=”与base64编码相比,这是一个非常大的加密密码,在解码时不会出现任何异常

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


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

对要编码的字符串没有限制(“加密”是一个不同的过程),对结果也没有限制,这取决于您输入的字符数(请考虑base64用于对通过http发送的文件体进行编码,因此没有限制)

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

我的猜测是,在到达
Convert.FromBase64String
或base64编码(您的示例中缺少)之前,该字符串发生了一些事情


我将编写一个简单的示例,仅使用base64编码/解码来验证此部分是否正常工作。

“填充无效且无法删除”是一条与加密(此处为AES)相关的消息,与base64编码无关。这显然是一个XY问题,但是我看不出有任何理由因此关闭它。警告方法
GetProvider
GetKey
都显示了可怕的加密实践,不应该使用它们(重复密钥材料、静态IV、名称不正确/不必要的变量、不必要地使用密钥材料列表等)。使用
Encoding.Default.GetBytes
获取密钥字节也是一个糟糕的想法,密钥不是字符串。好的,编码和加密是不同的过程。加密需要一个用于解密的密钥才能再次返回纯文本,而编码不需要任何密钥(这是否正确?)。在这种情况下,我误解了上述过程。在我的例子中,它是base64加密,因为代码使用密钥进行加密和解密。因此,在加密的情况下,这是否与您所说的问题相同(该字符串在到达Convert.FromBase64String之前发生了某些情况,或者base64编码(在您的示例中丢失)甚至不起作用)。我的加密代码(ipad应用程序)如下,+(NSString*)EncryptString:(NSString*)plainSourceStringToEncrypt{StringEncryption*crypto=[[[StringEncryption alloc]init]autorelease];NSData*_secretData=[plainSourceStringToEncrypt dataUsingEncoding:NSASCIIStringEncoding];NSData*encryptData=[crypto encrypt:[U Key dataUsingEncoding:NSUTF8StringEncoding]填充:&填充];返回[encryptedData Base64 Encoding WithlineLength:0];]部分正确,通过编码,您可以使用不同的格式表达某些数据(在这种情况下,从通常的8位字符格式到base64格式,其中每个字符仅为6位,字符包括在a-Z和0-9中,并带有可选的“=”填充),而加密将一条消息转换为一条新消息,应用某种形式的密钥,并使用一种复杂度不同的算法来隐藏其中包含的内容。完全不同。您首先要将Base64解码为字节流a