我正在加密和Base64一个字符串。一切都很好,直到我从QueryString集合中检索加密的字符串。加密文本包含加号。当我检索加密的字符串时,加上一次,现在有一个空格。你可以想象这不会解密。
我已经尝试过Server.HtmlEncode / HtmlDecode和Server.UrlEncode / Server.UrlDecode但无济于事。两种方法都将加号与空格混淆。
有什么想法吗?
以下是类似帖子:QueryString Malformed
修改 我找到了解决方案:Server.UrlEncode确实有效,我正在应用Server.UrlDecode而且也不需要。
答案 0 :(得分:4)
请注意,将“+++”替换为“==”的方法很危险,因为在极少数情况下,加密查询字符串可能有效地包含“+++”。在这种情况下,解密失败。要更好地解决问题,请查看使用“修改后的base64 for url”。它涉及为“+”切换“ - ”而为“/”切换“_”并且没有“==”填充。它似乎对我们有用,即使在另一个失败的情况下也是如此。以下是我用于参考的链接,对我们有用。
答案 1 :(得分:1)
public static String DoDecryption(String Value)
{
Decryptor dec = new Decryptor(EncryptionAlgorithm.TripleDes );
dec.IV = Encoding.ASCII.GetBytes("funky");
byte [] DecValue = Convert.FromBase64String(Value.Replace("+++","=="));
byte [] DecKey = Encoding.ASCII.GetBytes("0123456789012345");
byte [] DecipherValue = dec.Decrypt(DecValue,DecKey);
return Encoding.ASCII.GetString(DecipherValue);
}
这是加密部分
public static String DoEncryption(String Value)
{
Encryptor enc = new Encryptor(EncryptionAlgorithm.TripleDes);
byte [] EncValue = Encoding.ASCII.GetBytes(Value);
byte [] EncKey = Encoding.ASCII.GetBytes("0123456789012345");
enc.IV = Encoding.ASCII.GetBytes("funky");
byte [] CipherValue = enc.Encrypt(EncValue,EncKey);
//InitVector = Encoding.ASCII.GetString(enc.IV);
return Convert.ToBase64String(CipherValue).Replace("==","+++");
}
请注意,DoEncryption中的Value参数是要加密到querystring的字符串,而DoDecryption中的value参数是已经转换为base64字符串的查询字符串。
希望有帮助