gpt4 book ai didi

c# - 加密的字符串在结果中有一个斜杠(/),这会导致 URL 出现问题

转载 作者:行者123 更新时间:2023-11-30 13:54:29 29 4
gpt4 key购买 nike

我在网上四处寻找一种简单的小加密方法,可以接受一个字符串,对其进行加密,然后对其进行解密。我的想法是我在不能在计划文本中的 URL 中有我需要的 ID。

我发现的类在大多数情况下都很好用,但有时,我最终会得到一个包含/的加密字符串:

OSprnGR/0os4DQpQsa0gIg==

如您所想,这在 URL 中使用时会导致问题。所以我想,如果我只是对字符串进行 UrlEncode,就可以解决问题。

它没有。

即使 URL 如下所示,我仍然会遇到同样的错误:

http://localhost:54471/BrokerDashboard/BuyingLeads/LeadView/OSprnGR%2f0os4DQpQsa0gIg%3d%3d

取而代之的是:

http://localhost:54471/BrokerDashboard/BuyingLeads/LeadView/OSprnGR/0os4DQpQsa0gIg==

HTTP Error 404.0 - Not Found The resource you are looking for has been removed, had its name changed, or is temporarily unavailable.

这是我正在使用的类:

public static class Encryption
{
public static string keyString { get { return "6C3A231C-57B2-4BA0-AFD6-306098234B11"; } }
private static byte[] salt = Encoding.ASCII.GetBytes("somerandomstuff");

public static string Encrypt(string plainText)
{
Rfc2898DeriveBytes key = new Rfc2898DeriveBytes(keyString, salt);
MemoryStream ms = new MemoryStream();
StreamWriter sw = new StreamWriter(new CryptoStream(ms, new RijndaelManaged().CreateEncryptor(key.GetBytes(32), key.GetBytes(16)), CryptoStreamMode.Write));
sw.Write(plainText);
sw.Close();
ms.Close();
string beforeUrlEncoded = Convert.ToBase64String(ms.ToArray());
string afterUrlEndcoded = HttpUtility.UrlEncode(beforeUrlEncoded);
return afterUrlEndcoded;
}

public static string Decrypt(string encrypted)
{
//string urlDecoded = HttpUtility.UrlDecode(encrypted); // <--- Turns out you don't need this
Rfc2898DeriveBytes key = new Rfc2898DeriveBytes(keyString, salt);
ICryptoTransform d = new RijndaelManaged().CreateDecryptor(key.GetBytes(32), key.GetBytes(16));
byte[] bytes = Convert.FromBase64String(encrypted);
return new StreamReader(new CryptoStream(new MemoryStream(bytes), d, CryptoStreamMode.Read)).ReadToEnd();
}
}

编辑:

路线如下:

routes.MapRoute(
name: "BrokerLead",
url: "BrokerDashboard/BuyingLeads/LeadView/{id}"
);

最佳答案

/ 字符是保留字符,不能在路径部分使用。如果这是您 url 的最后一段,您可以使用以下路由使其工作(注意 {*id} 段):

routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{*id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);

另一种方法是在加密/解密时用其他字符替换此字符,但一般来说,您应该避免在 url 的路径部分中使用特殊字符,而只需将它们作为查询字符串,以便您可以正确地对所有内容进行 url 编码。

关于c# - 加密的字符串在结果中有一个斜杠(/),这会导致 URL 出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42317889/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com