II. MÔ TẢ CHỨC NĂNG
4 Thuật toán mã hóa AES
Ứng dụng của nhóm có sử dụng thuật toán mã hóa AES( Advanced Encryption Standard hay Tiêu chuẩn mã hóa tiên tiến).
AES là một thuật toán mã hóa khối được chính phủ Hoa kỳ áp dụng làm tiêu chuẩn mã hóa. Giống như tiêu chuẩn tiền nhiệm DES, AES được kỳ vọng áp dụng trên phạm vi thế giới và đã được nghiên cứu rất kỹ lưỡng. AES được chấp thuận làm tiêu chuẩn liên bang bởi Viện tiêu chuẩn và công nghệ quốc gia Hoa kỳ (NIST) sau một quá trình tiêu chuẩn hóa kéo dài 5 năm.
Các hàm của thuật toán:
Hàm mã hóa một mảng kiểu byte thành một mảng kiểu byte sử dụng Key và IV.
private byte[] Encrypt(byte[] clearData, byte[] Key, byte[] IV) {
// Create a MemoryStream that is going to accept the encrypted bytes
MemoryStream ms = new MemoryStream(); Rijndael alg = Rijndael.Create(); alg.Key = Key;
alg.IV = IV;
CryptoStream cs = new CryptoStream(ms, alg.CreateEncryptor(), CryptoStreamMode.Write);
cs.Write(clearData, 0, clearData.Length); cs.Close();
byte[] encryptedData = ms.ToArray();
return encryptedData; }
Hàm trả về một chuỗi mã hóa sử dụng Rijndael (128,192,256 Bit).
public string Encrypt(string Data, string Password, int Bits) {
byte[] clearBytes = System.Text.Encoding.Unicode.GetBytes(Data);
PasswordDeriveBytes pdb = new
PasswordDeriveBytes(Password,
new byte[] { 0x00, 0x01, 0x02, 0x1C, 0x1D, 0x1E, 0x03, 0x04, 0x05, 0x0F, 0x20, 0x21, 0xAD, 0xAF, 0xA4 });
if (Bits == 128) {
byte[] encryptedData = Encrypt(clearBytes, pdb.GetBytes(16), pdb.GetBytes(16));
return Convert.ToBase64String(encryptedData); }
else if (Bits == 192) {
byte[] encryptedData = Encrypt(clearBytes, pdb.GetBytes(24), pdb.GetBytes(16));
return Convert.ToBase64String(encryptedData); }
else if (Bits == 256) {
byte[] encryptedData = Encrypt(clearBytes, pdb.GetBytes(32), pdb.GetBytes(16));
return Convert.ToBase64String(encryptedData); }
else
{
return string.Concat(Bits); }
}
Hàm giải mã một mảng kiểu byte thành một mảng kiểu byte sử dụng Key và IV
private byte[] Decrypt(byte[] cipherData, byte[] Key, byte[] IV) {
MemoryStream ms = new MemoryStream(); Rijndael alg = Rijndael.Create(); alg.Key = Key;
alg.IV = IV;
CryptoStream cs = new CryptoStream(ms, alg.CreateDecryptor(), CryptoStreamMode.Write);
cs.Write(cipherData, 0, cipherData.Length); cs.Close();
byte[] decryptedData = ms.ToArray();
return decryptedData; }
Hàm giải mã một chuỗi thành chuỗi password
public string Decrypt(string Data, string Password, int Bits) {
//string Password = aeskey192;
byte[] cipherBytes = Convert.FromBase64String(Data); PasswordDeriveBytes pdb = new
PasswordDeriveBytes(Password,
new byte[] { 0x00, 0x01, 0x02, 0x1C, 0x1D, 0x1E, 0x03, 0x04, 0x05, 0x0F, 0x20, 0x21, 0xAD, 0xAF, 0xA4 });
if (Bits == 128) {
byte[] decryptedData = Decrypt(cipherBytes, pdb.GetBytes(16), pdb.GetBytes(16)); return System.Text.Encoding.Unicode.GetString(decryptedData); } else if (Bits == 192) {
byte[] decryptedData = Decrypt(cipherBytes, pdb.GetBytes(24), pdb.GetBytes(16)); return System.Text.Encoding.Unicode.GetString(decryptedData); } else if (Bits == 256) {
byte[] decryptedData = Decrypt(cipherBytes, pdb.GetBytes(32), pdb.GetBytes(16)); return System.Text.Encoding.Unicode.GetString(decryptedData); } else {
return string.Concat(Bits); }