2

我有一系列加密字符串,我在 C#/ASP.Net Web 应用程序中用作 id。我需要在id属性中使用这些,但是,字符串包含非法字符(有效字符只有“[A-Za-z0-9-_:.]”)。我需要一个双向转换,将我的加密字符串映射到这个小集合。类似 Base64 的东西,但更小。

我的替代方案是什么?是否有为此的标准算法,或者我必须自己发明它是否很奇怪?

解决方案: 如果有人需要这个,这就是我最终要做的。替换无效字符,并去掉 padding = char。然后撤消此操作以恢复。

    private static string MakeReferenceJavascriptCompatible(string reference)
    {
        return reference.Replace("+", "_")
                        .Replace("/", "-")
                        .Replace("=", "");
    }
    private static string UndoMakeReferenceJavascriptCompatible(string reference)
    {
        int padding = 4 - (reference.Length % 4);
        return reference.Replace("-", "/")
                        .Replace("_", "+")
                        .PadRight(reference.Length + padding, '=');
    }
4

4 回答 4

4

如果你有 AZ (26)、az (26)、0-9 (10) 和 '_'、':' 和 '.' (3) 那么你有 65 个字符可用,就像 Base64 一样。(由于在末尾使用 = 作为填充,它需要 65 而不是 64。)我不清楚你是否包括-,这会给你 66... 积极丰富的可用字符:)

听起来您只需要将“正常”形式转换为稍微不同的字母表。您可以通过找到一个灵活的 base64 实现来指定要使用的值,或者只需调用string.Replace

var base64 = Convert.ToBase64String(input)
                    .Replace('+', '_')
                    .Replace('/', ':')
                    .Replace('=', '.');

反转替换以从您的“修改”base64 恢复为“正常”base64,它将对Convert.FromBase64String.

于 2012-04-28T19:36:03.973 回答
2

“更小”?在您所说的问题中,有 66 个有效字符:

  • [AZ] : 26
  • [az] : 26
  • [0-9] : 10
  • [-_:.]:4

给 Base64 一个机会,也许用其他一些字符替换“非法字符”(+、/、=)。

于 2012-04-28T19:37:52.473 回答
1

您已经有 65 个有效字符可供使用。因此,您可以将 base64 编码与String.Replace. 但是,如果您想使用不区分大小写的编码(例如用于 Windows 中的文件名),您可以使用base36编码

于 2012-04-28T19:48:33.053 回答
0

您可以使用内置的 System.Web.HttpServerUtility 来执行此操作。

要将值转换为编码值(对 Url 和 JavaScript 使用安全):

string result = value;
if (!string.IsNullOrEmpty(value))
{
  var bytes = System.Text.Encoding.UTF8.GetBytes(value);
  result = HttpServerUtility.UrlTokenEncode(bytes);
}
return result;

要将编码值转换回原始值:

// If a non-base64 string is passed as value, the result will
// be same as the passed value
string result = value;
if (!string.IsNullOrEmpty(value))
{
  var bytes = HttpServerUtility.UrlTokenDecode(value);
  if (bytes != null) {
    result = System.Text.Encoding.UTF8.GetString(bytes);
  }
}
return result;
于 2015-07-08T13:07:02.060 回答