Đây là mẫu phù hợp với tôi. Tôi đã đơn giản hóa nó bằng cách sử dụng copy-paste nhưng không quan trọng.
Tôi đang sử dụng mật khẩu văn bản do khả năng tương thích với thư viện JS nhưng SSL tự mở hỗ trợ việc sử dụng trực tiếp byte [] Key và IV do đó tùy thuộc vào bạn nên sử dụng gì.
Để chuyển dữ liệu nhị phân vào chuỗi chỉ cần sử dụng
Encoding.UTF8.GetBytes() and Encoding.UTF8.GetString()
để chuyển đổi qua lại.
public Byte[] Encrypt(Byte[] data, String password)
{
//Just random 8 bytes for salt
var salt = new Byte[] {1, 2, 3, 4, 5, 6, 7, 8};
using (var cc = new CipherContext(Cipher.AES_256_CBC))
{
//Constructing key and init vector from string password
byte[] passwordBytes = Encoding.UTF8.GetBytes(password);
byte[] iv;
byte[] key = cc.BytesToKey(MessageDigest.MD5, salt, passwordBytes, 1, out iv);
var memoryStream = new MemoryStream();
//Performing encryption thru unmanaged wrapper
var aesData = cc.Crypt(data, key, iv, true);
//Append salt so final data will look Salted___SALT|RESTOFTHEDATA
memoryStream.Write(Encoding.UTF8.GetBytes("Salted__"), 0, 8);
memoryStream.Write(salt, 0, 8);
memoryStream.Write(aesData, 0, aesData.Length);
return memoryStream.ToArray();
}
}
public Byte[] Decrypt(String password, Byte[] encryptedData)
{
byte[] salt = null;
//extracting salt if presented
if (encryptedData.Length > 16)
{
if (Encoding.UTF8.GetString(encryptedData).StartsWith("Salted__"))
{
salt = new Byte[8];
Buffer.BlockCopy(encryptedData, 8, salt, 0, 8);
}
}
//Removing salt from the original array
int aesDataLength = encryptedData.Length - 16;
byte[] aesData = new byte[aesDataLength];
Buffer.BlockCopy(encryptedData, 16, aesData, 0, aesDataLength);
using (var cc = new CipherContext(Cipher.AES_256_CBC))
{
//Constructing key and init vector from string password and salt
byte[] passwordBytes = Encoding.UTF8.GetBytes(password);
byte[] iv;
byte[] key = cc.BytesToKey(MessageDigest.MD5, salt, passwordBytes, 1, out iv);
//Decrypting
return cc.Decrypt(aesData, key, iv, 0);
}
}
Đó là một số rất ngẫu nhiên Tám byte cho muối;) – Nate
Vâng, đủ ngẫu nhiên để trả lời câu hỏi như thế này thực sự là không một mã live :) –
thực hiện của tôi là dựa tắt của ví dụ này. Tôi đang sử dụng bối cảnh Cipher.AES_256_CBC nhưng nếu mật khẩu của tôi là <16 byte khi cc.Crypt được gọi là nó ném một ngoại lệ. Bởi vì nó đang cố gắng ghi dữ liệu được mã hóa là 16 byte vào bộ đệm 8 byte mà nó tạo ra. Bạn đã gặp phải điều này? Tôi đang sử dụng OpenSSL.Net 0.4.4 và tôi đang sử dụng thông báo SHA1. – Jeff