需要加密/解密的方法没有'/'在加密的字符串中
本文关键字:加密 字符串 解密 方法 | 更新日期: 2023-09-27 18:01:16
我需要加密和解密字符串值,如电子邮件地址和数字值,但加密的字符串不应该有'/'在它,因为我在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,我建议你生成任何加密字符串(不管它是否有/
),并做:
var sanitized = HttpUtility.UrlEncode(encryptedString);
可以看到,/
变成了%2f
。然后您可以简单地执行:
var encryptedString = HttpUtility.UrlDecode(sanitized)
,你会得到相同的字符串。
编辑: HttpUtility
在System.Web
程序集中
加密本身只是输出字节,而不是字符。所以这个问题与加密/解密无关。您的实际问题是将任意字节转换为可在url中使用的字符串。我建议使用URL安全的Base64而不是普通的Base64。
这些/
字符是由应用于密文的Base64编码产生的。Base64使用ASCII字母和数字(总共62个),加上/
和+
,最后是=
作为填充。
Padding是相当无用的,所以我会去掉它。
将/
替换为_
,将+
替换为-
。这被称为URL安全Base64或base64url。在RFC4648中有描述。
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);
}
Convert.ToBase64String
使用字母,数字,+
和/
,所以你可以简单地将/
切换为其他不是字母,数字或+
的东西:
// ...
string cipherText = Convert.ToBase64String(cipherTextBytes);
string ctWithoutSlashes = cipherText.Replace("/", "-");
解码string cipherText = ctWithoutSlashes.Replace("-", "/");
// ...