C# 需要的加密/解密方法没有'/';在加密字符串中

C# 需要的加密/解密方法没有'/';在加密字符串中,c#,asp.net,C#,Asp.net,我需要加密和解密字符串值,如电子邮件地址和数字值,但加密字符串中不应包含“/”,因为我在URL中使用“/”,并使用“/”作为分隔符来获取一些值 我目前正在使用以下方法: string passPhrase = "Pas5pr@se"; // can be any string string saltValue = "s@1tValue"; // can be any string string hashAlgorithm = "SHA1";

我需要加密和解密字符串值,如电子邮件地址和数字值,但加密字符串中不应包含“/”,因为我在URL中使用“/”,并使用“/”作为分隔符来获取一些值

我目前正在使用以下方法:

    string passPhrase = "Pas5pr@se";        // can be any string
    string saltValue = "s@1tValue";        // can be any string
    string hashAlgorithm = "SHA1";             // can be "MD5"
    int passwordIterations = 2;                  // can be any number
    string initVector = "@1B2c3D4e5F6g7H8"; // must be 16 bytes
    int keySize = 256;                // can be 192 or 128

    public string Encrypt(string plainText)
    {            
        byte[] initVectorBytes = Encoding.ASCII.GetBytes(initVector);
        byte[] saltValueBytes = Encoding.ASCII.GetBytes(saltValue);         
        byte[] plainTextBytes = Encoding.UTF8.GetBytes(plainText);
        PasswordDeriveBytes password = new PasswordDeriveBytes(passPhrase,saltValueBytes,hashAlgorithm,passwordIterations);
        byte[] keyBytes = password.GetBytes(keySize / 8);
        RijndaelManaged symmetricKey = new RijndaelManaged();
        symmetricKey.Mode = CipherMode.CBC;            
        ICryptoTransform encryptor = symmetricKey.CreateEncryptor(keyBytes,initVectorBytes);
        MemoryStream memoryStream = new MemoryStream();
        CryptoStream cryptoStream = new CryptoStream(memoryStream,encryptor,CryptoStreamMode.Write);           
        cryptoStream.Write(plainTextBytes, 0, plainTextBytes.Length);            
        cryptoStream.FlushFinalBlock();
        byte[] cipherTextBytes = memoryStream.ToArray();
        memoryStream.Close();
        cryptoStream.Close();
        string cipherText = Convert.ToBase64String(cipherTextBytes);
        return cipherText;
    }

如果您只是为了传递URL而这样做,我建议您生成任何加密字符串(无论它是否有
/
),并执行以下操作:

如您所见,
/
变为
%2f
。然后你可以简单地做:

var encryptedString = HttpUtility.UrlDecode(sanitized)
您将再次获得相同的字符串


编辑:
HttpUtility
位于
系统.Web
程序集中。

转换。ToBase64String
使用字母、数字、
+
/
,因此您可以简单地将
//code>切换为非字母、数字或
+
的其他内容:

编码:

// ...
string cipherText = Convert.ToBase64String(cipherTextBytes);
string ctWithoutSlashes = cipherText.Replace("/", "-");
解码

string cipherText = ctWithoutSlashes.Replace("-", "/");
// ...

加密本身只是输出字节,而不是字符。所以这个问题与加密/解密无关。您的实际问题是将任意字节转换为可以在url中使用的字符串。为此,我建议使用URL安全的Base64而不是普通的Base64

这些
/
字符由应用于密文的Base64编码产生。Base64使用ASCII字母和数字(总共62个),加上
/
+
以及最后
=
作为填充

填充物很没用,所以我要剥掉它

然后将
/
替换为
\
,将
+
替换为
-
。这称为URL安全的Base64或base64url。这在中有描述


用其他字符替换
/
怎么样?如果您在URL中使用它,那么
UrlEncode
urdecode
不起作用吗?请尝试以下链接1。2.谢谢Abiruban@AbiRuban本例中的问题不是“如何加密/解密”——它更多地涉及在url中表示加密数据——这两篇文章都没有解决这个问题。
string cipherText = ctWithoutSlashes.Replace("-", "/");
// ...
public static string Base64UrlEncode(byte[] bytes)
{
    return Convert.ToBase64String(bytes).Replace("=", "").Replace('+', '-').Replace('/', '_');
}

public static byte[] Base64UrlDecode(string s)
{
    s = s.Replace('-', '+').Replace('_', '/');
    string padding = new String('=', 3 - (s.Length + 3) % 4);
    s += padding;
    return Convert.FromBase64String(s);
}