这是我写的一些代码来加密/解密一个字符串。加密的字符串是Base64编码,便于序列化为XML等。您可以轻松地将此代码转换为直接与字节数组而不是字符串一起工作。
/// <summary>
/// Create and initialize a crypto algorithm.
/// </summary>
/// <param name="password">The password.</param>
private static SymmetricAlgorithm GetAlgorithm(string password)
{
var algorithm = Rijndael.Create();
var rdb = new Rfc2898DeriveBytes(password, new byte[] {
0x53,0x6f,0x64,0x69,0x75,0x6d,0x20, // salty goodness
0x43,0x68,0x6c,0x6f,0x72,0x69,0x64,0x65
});
algorithm.Padding = PaddingMode.ISO10126;
algorithm.Key = rdb.GetBytes(32);
algorithm.IV = rdb.GetBytes(16);
return algorithm;
}
/// <summary>
/// Encrypts a string with a given password.
/// </summary>
/// <param name="clearText">The clear text.</param>
/// <param name="password">The password.</param>
public static string EncryptString(string clearText, string password)
{
var algorithm = GetAlgorithm(password);
var encryptor = algorithm.CreateEncryptor();
var clearBytes = Encoding.Unicode.GetBytes(clearText);
using (var ms = new MemoryStream())
using (var cs = new CryptoStream(ms, encryptor, CryptoStreamMode.Write))
{
cs.Write(clearBytes, 0, clearBytes.Length);
cs.Close();
return Convert.ToBase64String(ms.ToArray());
}
}
/// <summary>
/// Decrypts a string using a given password.
/// </summary>
/// <param name="cipherText">The cipher text.</param>
/// <param name="password">The password.</param>
public static string DecryptString(string cipherText, string password)
{
var algorithm = GetAlgorithm(password);
var decryptor = algorithm.CreateDecryptor();
var cipherBytes = Convert.FromBase64String(cipherText);
using (var ms = new MemoryStream())
using (var cs = new CryptoStream(ms, decryptor, CryptoStreamMode.Write))
{
cs.Write(cipherBytes, 0, cipherBytes.Length);
cs.Close();
return Encoding.Unicode.GetString(ms.ToArray());
}
}
我发现
最简单的方法是在[这里我的问题(http://stackoverflow.com/questions/11762/c-cryptographicexception-padding-is-invalid-and-cannot-be-removed) – Blorgbeard 2011-03-09 20:34:17
那么基础转换是不可能的?比方说转换为Base64甚至Base2?我认为这比ROT13更好! – Ali 2011-03-09 22:11:38
@Blorgbeard:为什么不作出答案,我会给你信用!这正是我一直在嘲笑的! – Krumelur 2011-03-09 22:41:43