我有一个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个字符长的加密字符串或对要加密的字符串有任何长度限制?
我们的用户之一在解码密码时面临此问题。让所有用户在解码时都没有问题。
答案 0 :(得分:2)
对要编码的字符串没有限制(“加密”是一个不同的过程),对结果的限制也取决于输入的字符数(考虑使用base64来编码通过http发送的文件正文) ,所以没有限制。
错误所指的填充是在字符串末尾附加的=
。 Base64编码采用原始消息,将其划分为字节,然后将位流分成6位的段,然后将其转换为字母数字表示形式。当消息的位长不能被6整除时,将添加那些=
。
我的猜测是,该字符串在到达Convert.FromBase64String
之前已经发生了某些事情,或者base64编码(示例中缺少)甚至无法正常工作。
我只用base64编码/解码编写一个最小的示例,以验证该部分是否正常工作。