如何从加密文本中限制斜杠

本文关键字:加密文本 | 更新日期: 2023-09-27 18:18:04

我在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;
    }

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

如何从加密文本中限制斜杠

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

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字符:

从0开始升序的64位数字为大写字符"到"Z",小写字符"对于"z",数字"0";到"9"和符号"+"answers"/"。无值字符"="用于尾部填充。

明显的问题是正斜杠,所以您可以用base64编码中没有使用的任何字符替换它。当你需要解密的时候记得转换回来。

正如owlstead在他的评论中指出的那样,也许最好符合某种标准。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('_', '/'))
}

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

From msdn

从0开始按升序排列的64位数字是大写字母"A"到"Z",小写字母"A"到"Z",数字"0"到"9",以及符号"+"answers"/"。无值字符"="用于尾部填充。

base64中通常没有反斜杠。

为了处理斜杠,你必须使用不同的方式来表示字节数组(你自己的),或者简单地将/解码成之后的东西。

,

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

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