c# - 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 个字符长的加密字符串或对要加密的字符串有任何长度限制。
我们的一位用户在解码密码时遇到了这个问题。让所有用户在解码时都没有问题。
解决方案
对要编码的字符串没有限制(“加密”是一个不同的过程)并且对结果没有限制,这取决于您输入的字符数(考虑到 base64 用于编码通过 http 发送的文件的主体,所以,无限)。
错误所指的填充是=
附加到字符串末尾的填充。Base64 编码获取您的原始消息,将其划分为字节,然后将位流分组为 6 位段,然后将其转换为字母数字表示。=
当您的消息的位长不能被 6 整除时,会添加这些。
我的猜测是该字符串在到达之前发生了某些事情,Convert.FromBase64String
或者 base64 编码(您的示例中缺少)甚至不起作用。
我将编写一个仅使用 base64 编码/解码的最小示例,以验证这部分是否正常工作。
推荐阅读
- javascript - 角度未将数据发布到 xampp
- android - 简单的 SSH 连接开源代码与 JSch
- android - 许多处理程序,不是每个都会被执行
- linux - GDB 符号来自哪里?
- java - 如何使用枚举中字符串的值作为输入以输出 Java 中该枚举项的其余数据?
- ios - 将具有单独时区的日期对象转换为 NSDate 的正确方法是什么
- google-play - Ubuntu:为谷歌播放音乐启用媒体键
- python - 运行时使用 dynamic_rnn 的 Tensorflow GPU 内存不足
- python - 每个套接字地址(协议/网络地址/端口)通常只允许使用一次,
- node.js - 错误:连接 ECONNREFUSED 127.0.0.1:5432 docker migrate