我可以加密。但是,如果加密的字符串末尾没有以等号“ =”结尾,那么它将无法正确解密,并且我得到一个空字符串(或看起来是这样)。
有效方法:
+ FmU / RQ5jP86j7F6bPjddA ==
YQXBLjwEXEGgYz8xnF10O9QqO / vj5DI8PpZZCvfhG1RGHAYumtWrAEBfdSSOkF79vzVCSQ + ejO3uMIDSmY43bw ==
什么是行不通的:
xnyfqPsvrEOK8AoQz2p7AGFHoHncZ / wB / R3qr + scts6nLI2xauWnbmYsXsU3iMoT
加密功能:
return Redirect(Url.RouteUrl(new { controller = "Home", action = "Index" }) + "#" + fragment);
这是解密功能:
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;
}
有什么办法解决这个问题吗?
编辑:添加了加密功能
编辑2:
这就是我调用加密函数的方式(在我通过socket.io发送字符串之前)
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());
}
}
}
答案 0 :(得分:2)
我不会给您完整的答案,也不会讲任何加密技术,因为这是一个很大的话题。
您的问题的答案很简单-只要使用Convert.FromBase64String
函数,末尾没有“ =”或“ ==”字符就无法使用,因为这些字符是此编码的特征。
“输出填充”部分中位于此链接下的更多信息:Base64 on Wikipedia
结论:如果加密的字符串附带提到的字符,那么没有它就无法解密。