需要加密/解密方法在加密字符串中没有’/’
我需要加密和解密字符串值,例如电子邮件地址和数值,但加密的字符串中不应包含’/’,因为我在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
程序HttpUtility
。
加密本身只输出字节,而不是字符。 所以这个问题与加密/解密完全无关。 您的实际问题是将任意字节转换为可在URL中使用的字符串。 我建议使用URL安全Base64而不是普通的Base64。
这些/
字符由您应用于密文的Base64编码生成。 Base64使用ASCII字母和数字(总共62个),加上/
和+
,最后=
作为填充。
填充是没用的,所以我剥离它。
然后使用-
替换/
和_
和+
。 这称为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("-", "/"); // ...