C# Can';t解密不';t以“相等”结尾=&引用;
我可以很好地加密。但是,如果加密字符串的结尾不是以相等的字母“=”结尾,那么它将无法正确解密,我得到一个空字符串(或者看起来是这样) 工作原理: +FmU/RQ5jP86j7F6bPjddA== YQXBLJWEXEGYZ8XNF10O9QQO/vj5DI8PpZZCvfhG1RGHAYumtWrAEBfdSSOkF79vzVCSQ+ejO3uMIDSmY43bw== 什么不起作用: xnyfqPsvrEOK8AoQz2p7AGFHoHncZ/wB/R3qr+scts6nLI2xauWnbmYsXsU3iMoT 加密功能:C# Can';t解密不';t以“相等”结尾=&引用;,c#,encryption,base64,C#,Encryption,Base64,我可以很好地加密。但是,如果加密字符串的结尾不是以相等的字母“=”结尾,那么它将无法正确解密,我得到一个空字符串(或者看起来是这样) 工作原理: +FmU/RQ5jP86j7F6bPjddA== YQXBLJWEXEGYZ8XNF10O9QQO/vj5DI8PpZZCvfhG1RGHAYumtWrAEBfdSSOkF79vzVCSQ+ejO3uMIDSmY43bw== 什么不起作用: xnyfqPsvrEOK8AoQz2p7AGFHoHncZ/wB/R3qr+scts6nLI2xauWnbmYs
public string EncryptionKey = "abc123";
public string encrypt(string input)
{
byte[] clearBytes = Encoding.Unicode.GetBytes(input);
using (Aes encryptor = Aes.Create())
{
Rfc2898DeriveBytes pdb = new Rfc2898DeriveBytes(EncryptionKey, new byte[] { 0x49, 0x76, 0x61, 0x6e, 0x20, 0x4d, 0x65, 0x64, 0x76, 0x65, 0x64, 0x65, 0x76 });
encryptor.Key = pdb.GetBytes(32);
encryptor.IV = pdb.GetBytes(16);
using (MemoryStream ms = new MemoryStream())
{
using (CryptoStream cs = new CryptoStream(ms, encryptor.CreateEncryptor(), CryptoStreamMode.Write))
{
cs.Write(clearBytes, 0, clearBytes.Length);
cs.Close();
}
input = Convert.ToBase64String(ms.ToArray());
}
}
return input;
}
下面是解密函数:
public string decrypt(string cipherText)
{
byte[] cipherBytes = Convert.FromBase64String(cipherText);
using (Aes encryptor = Aes.Create())
{
Rfc2898DeriveBytes pdb = new Rfc2898DeriveBytes(EncryptionKey, new byte[] { 0x49, 0x76, 0x61, 0x6e, 0x20, 0x4d, 0x65, 0x64, 0x76, 0x65, 0x64, 0x65, 0x76 });
encryptor.Key = pdb.GetBytes(32);
encryptor.IV = pdb.GetBytes(16);
using (MemoryStream ms = new MemoryStream())
{
using (CryptoStream cs = new CryptoStream(ms, encryptor.CreateDecryptor(), CryptoStreamMode.Write))
{
cs.Write(cipherBytes, 0, cipherBytes.Length);
cs.Close();
}
return Encoding.Unicode.GetString(ms.ToArray());
}
}
}
你知道怎么解决这个问题吗
编辑:添加加密功能
编辑2:
这就是我调用加密函数的方式(在我通过socket.io发送字符串之前)
我不会给你们完整的答案,也不会做任何关于密码学的讲座,因为这是一个巨大的话题。 您的问题的答案很简单-只要您使用
Convert.FromBase64String
函数,如果结尾没有“=”或“=”字符,它将无法工作,因为这些字符是此编码的特征。
“输出填充”部分中此链接下的更多信息:
结论:如果加密字符串附带提到的字符,没有它就无法解密。即使您提到的输出填充部分也显示不需要=或==填充的有效字符串。是的,这是真的,但请仔细阅读提到的文章或Base64 RFC。谢谢,我明白了为什么它没有“=”字符串不起作用。你知道怎么解决这个问题吗?我是新手,不知道如何解决这个问题。@BrootsWaymb我明白了,那么我猜是加密函数(我在上面添加了它)造成了一个无效的base64字符串?请阅读我的答案,但如果你不理解,你的答案很简单-如果加密字符串带有“=”或“=”你就不能这样做最后是chars,你到底犯了什么错误?我很确定“=”这是个骗局——失败的字符串是一个有效的base64编码字符串。它是原始文本吗:鄺ੁ톋螟⢹ⲰⳞ蘮읝赂厚᨟בֿ䔋⊮ ?@马西耶斯。不,不是。我记不起那是什么了。
ASCIIEncoding aEncoding = new ASCIIEncoding();
byte[] sendMsg = new byte[1500];
sendMsg = aEncoding.GetBytes((encrypt(txtMsg.Text)));