【问题标题】:How to restrict slashes from encrypted text如何限制加密文本中的斜线
【发布时间】:2014-08-14 14:06:27
【问题描述】:

我在 C# 中使用 Rfc2898DeriveBytes 加密文本

以下是我的代码

  private static string Encrypt(string clearText)
    {
        string EncryptionKey = "MAKV2SPBNI99212";
        byte[] clearBytes = Encoding.Unicode.GetBytes(clearText);
        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();
                }
                clearText = Convert.ToBase64String(ms.ToArray());
            }
        }
        return clearText;
    }

我想限制“/”和“\”出现在加密文本中。我怎样才能做到这一点?

【问题讨论】:

    标签: c# .net security cryptography


    【解决方案1】:

    这是未经测试的,但我认为它应该可以工作。

    var encryptedText = Encrypt("MY SECRET MESSAGE");
    var encodedText = Convert.ToBase64String(encryptedText).Replace('/', '*');
    
    var decodedText = Convert.FromBase64String(encodedText.Replace('*', '/'));
    var descriptedText = Decrypt(decodedText);
    

    Convert.ToBase64String 仅将输入字符串转换为 base64 字符:

    base-64位从0升序依次为大写字母“A”到“Z”,小写字母“a”到“z”,数字“0”到“9”,符号“ +”和“/”。无值字符“=”用于尾随填充。

    明显的问题是正斜杠,因此您可以将其替换为您想要的任何字符,该字符也未在 base64 编码中使用。只需记住在需要解密时转换回来。

    正如owlstead 在他的comment 中指出的那样,最好符合某种标准。 RFC 4648 通过将+ 替换为-/ 替换为_ 来定义满足您需求的base64 编码。我没有立即看到 .NET 内置的方法,所以我将提供一些示例方法:

    public static string ToBase64UrlString(string text)
    {
        return Convert.ToBase64String(text)
            .Replace('+', '-').Replace('/', '_');
    }
    
    public static string FromBase64UrlString(string text)
    {
        return Convert.FromBase64String(
            text.Replace('-', '+').Replace('_', '/'))
    }
    

    【讨论】:

    • 改用base64url 编码可能是个好主意。它将+ 替换为-,将/ 替换为_
    • @owlstead 谢谢,在我的回答中添加了更多信息。
    • 非常感谢,我用'-'替换,当原始字符串中确实有'-'符号时问题就开始了。了解 ConvertToBase64 的输出解决了这个问题!
    【解决方案2】:

    如果某些 Java 开发人员(如我)在这里徘徊:在我的情况下,我使用 java.util.Base64.getEncoder().encodeToString("text") 对文本进行编码,只需将其更改为 java.util.Base64.getUrlEncoder().encodeToString("text")(使用 Encoder.RFC4648_URLSAFE),它就会生成 URL 安全编码。

    【讨论】:

      【解决方案3】:

      来自msdn

      base-64位从0升序依次为大写字母“A”到“Z”,小写字母“a”到“z”,数字“0”到“9”,符号“ +”和“/”。无值字符“=”用于尾随填充。

      base64中通常没有反斜杠。

      要处理斜线,您必须使用不同的方式来呈现字节数组(您自己的),或者在之后简单地将 / 解码为一些东西。

      举个例子,

      var text = Encrypt(...);
      var textWithoutSlashes = text.Replace(@"\", "THISISSLASHOMG");
      

      同样,您必须在调用Decrypt() 以恢复clearText 之前恢复斜杠。

      【讨论】:

        猜你喜欢
        • 2017-01-14
        • 1970-01-01
        • 1970-01-01
        • 2010-09-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-28
        相关资源
        最近更新 更多