我正在使用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;
}
我想限制'/'和'\'出现在加密文本中。我怎样才能做到这一点?
答案 0 :(得分:7)
这是未经测试的,但我认为它应该有用。
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字符:
从零开始按升序排列的base-64数字是大写字母“A”到“Z”,小写字母“a”到“z”,数字“0”到“9”,以及符号“ +“和”/“。无值字符“=”用于尾随填充。
显而易见的问题是正斜杠,因此您可以将其替换为您想要的任何字符,而不是在base64编码中也使用。只需记住在需要解密时转换回来。
正如owlstead在他的comment中指出的那样,最好符合某种类型的标准。 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('_', '/'))
}
答案 1 :(得分:0)
如果某些Java开发人员(例如我)在这里徘徊:就我而言,我使用java.util.Base64.getEncoder().encodeToString("text")
对文本进行编码,只需将其更改为java.util.Base64.getUrlEncoder().encodeToString("text")
(使用Encoder.RFC4648_URLSAFE
)即可生成的网址安全编码。
答案 2 :(得分:-1)
来自msdn
从零开始按升序排列的base-64数字是大写字符" A"到" Z",小写字符" a"到" z",数字" 0"到" 9"和符号" +"和" /"。无值字符" ="用于尾随填充。
base64 中通常没有反斜杠。
要处理斜杠,你必须使用不同的呈现字节数组的方式(你自己的)或者之后简单地将/
解码成一些东西。
例如,
var text = Encrypt(...);
var textWithoutSlashes = text.Replace(@"\", "THISISSLASHOMG");
同样,在调用Decrypt()
恢复clearText
之前,您必须恢复斜杠。