如何限制加密文本的斜杠

fc1*_*123 0 .net c# security cryptography

我正在使用Rfc2898DeriveBytesC#加密文本

以下是我的代码

  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;
    }
Run Code Online (Sandbox Code Playgroud)

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

Ant*_*ony 7

这是未经测试的,但我认为它应该有效.

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

var decodedText = Convert.FromBase64String(encodedText.Replace('*', '/'));
var descriptedText = Decrypt(decodedText);
Run Code Online (Sandbox Code Playgroud)

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

从零开始的基数为64的数字是大写字母"A"到"Z",小写字母"a"到"z",数字"0"到"9",符号"+"和"/".无值字符"="用于尾随填充.

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

正如owlstead在他的评论中指出的那样,最好遵循某种类型的标准.RFC 4648定义了一个base64编码,通过替换+with -/by 来满足您的需求_.我没有立即看到一种方法来构建.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('_', '/'))
}
Run Code Online (Sandbox Code Playgroud)

  • 改为使用[base64url](http://tools.ietf.org/html/rfc4648#page-7)编码可能是个好主意.它将`-`替换为`-`,将`/`替换为`_`. (2认同)