我正在寻找一种使用.NET 3.5加密/混淆(当然还有解密/反混淆)字节数组的方法。
基本上:
byte[] aMixedUp = Encrypt(aMyByteData, "THIS IS THE SECRET KEY USED TO ENCRYPT");
另一方面:
byte[] aDecrypted = Decrypt(aMixedUp, "THIS IS THE SECRET KEY USED TO ENCRYPT");
它不一定是防弹。这个想法只是为了防止用户直接看到字节中的内容,以防它们映射到ASCII,但它应该比ROT13更好。
我可以轻松使用.NET库中的某些内容吗?
答案 0 :(得分:7)
这是我编写的用于加密/解密字符串的一些代码。加密的字符串是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());
}
}
答案 1 :(得分:4)
以下是使用.NET框架中的Rijndael类来加密和解密字节数组的代码示例;很明显,这个班级可以替代最适合你的班级。
您只需要定义KEY和IV属性并从某处获取它们(例如,应用程序配置文件的加密部分)。
private static byte[] EncryptBytes(IEnumerable<byte> bytes)
{
//The ICryptoTransform is created for each call to this method as the MSDN documentation indicates that the public methods may not be thread-safe and so we cannot hold a static reference to an instance
using (var r = Rijndael.Create())
{
using (var encryptor = r.CreateEncryptor(KEY, IV))
{
return Transform(bytes, encryptor);
}
}
}
private static byte[] DecryptBytes(IEnumerable<byte> bytes)
{
//The ICryptoTransform is created for each call to this method as the MSDN documentation indicates that the public methods may not be thread-safe and so we cannot hold a static reference to an instance
using (var r = Rijndael.Create())
{
using (var decryptor = r.CreateDecryptor(KEY, IV))
{
return Transform(bytes, decryptor);
}
}
}
private static byte[] Transform(IEnumerable<byte> bytes, ICryptoTransform transform)
{
using (var stream = new MemoryStream())
{
using (var cryptoStream = new CryptoStream(stream, transform, CryptoStreamMode.Write))
{
foreach (var b in bytes)
cryptoStream.WriteByte(b);
}
return stream.ToArray();
}
}
答案 2 :(得分:3)
Symmetric-key algorithm是最简单的方法,您可以在.NET框架中找到它们。
但请注意,黑客可以“轻松”反编译您的应用并找到加密密钥。根据您的senario,您可以使用public/private密钥系统。你至少可以控制谁可以加密字节数组。
答案 3 :(得分:1)
cryptography namespace中有各种有趣的东西。
答案 4 :(得分:0)
如果您不需要加密,您可以将所有内容转换为HEX或Base 64或类似的内容,实际上除非有人专注,否则无法阅读。 Here is a link that shows how in .NET