Upload
others
View
8
Download
0
Embed Size (px)
Citation preview
Ver 1.1 – 2015, FIT, HCMUP Bảo mật và An ninh mạng : LAB 04 - CRYTOGRAPHY]
Ths. Lương Trần Hy Hiến, KHOA CNTT – TRƯỜNG ĐH SƯ PHẠM TP. HCM 1
1 Mã hóa cổ điển
1.1 Mã hóa Ceasar
1.1.1 Thuật toán
a. Mã hóa : EK(i) = (i+k) mod N
b. Giải mã : DK(i) = (i-k) mod N
Thực hiện Ceasar trên bảng chữ cái tiếng Anh thì N = 26.
Xét ví dụ sau: Cho bản rõ : TOIYEUVIETNAM với khóa k = 4
Vậy bản mã là : YSMBYZWMIYREQ
1.1.2 Cài đặt
/// <summary> /// Summary description for Ceasar (English Alphabet) /// </summary> public class Ceasar { #region property public int k { get; set; } public string plainText { get; set; } public string cipherText { get; set; } #endregion public Ceasar(int dodoi) { k = dodoi; } public string mahoa() { plainText = plainText.ToUpper(); for (int i = 0; i < plainText.Length; i++) cipherText += (char)('A' + ((plainText[i] - 'A' + k) % 26)); return cipherText; } public string giaima()
Ver 1.1 – 2015, FIT, HCMUP Bảo mật và An ninh mạng : LAB 04 - CRYTOGRAPHY]
Ths. Lương Trần Hy Hiến, KHOA CNTT – TRƯỜNG ĐH SƯ PHẠM TP. HCM 2
{ string kq = string.Empty; for (int i = 0; i < cipherText.Length; i++) kq += (char)('A' + (cipherText[i] - 'A' + (26 - k)) % 26); plainText = kq; return kq; } }
1.1.3 Mở rộng cho mã hóa Tiếng Việt
//Khai báo chuỗi các từ tiếng Việt sẽ sử dụng để mã hóa.
string chuoi = "AĂÂBCDĐEÊGHIKLMNOÔƠPQRSTUƯVXY ?!ÁÀẢÚ";//bổ sung thêm
//Thực hiện chuyển đổi chuỗi sang mảng các chỉ số tương ứng.
public int[] chuoi_mangchiso(string s)
{
int[] mang = new int[s.Length];
for (int i = 0; i < s.Length; i++)
mang[i] = chuoi.IndexOf(s[i]);
return mang;
}
//Thực hiện chuyển đổi mảng các chỉ số sang chuỗi tương ứng.
public string chiso_chuoi(int[] a)
{
string s = "";
for (int i = 0; i < a.Length; i++)
s += chuoi[a[i]];
return s;
}
//Thực hiện mã hóa.
public string mahoatiengviet()
{
plainText = plainText.ToUpper();
int[] pre_index = chuoi_mangchiso(plainText);
int[] pos_index = new int[plainText.Length];
//mã hóa
for (int i = 0; i < plainText.Length; i++)
pos_index[i] = (pre_index[i] + k) % chuoi.Length;
Ver 1.1 – 2015, FIT, HCMUP Bảo mật và An ninh mạng : LAB 04 - CRYTOGRAPHY]
Ths. Lương Trần Hy Hiến, KHOA CNTT – TRƯỜNG ĐH SƯ PHẠM TP. HCM 3
//đổi sang mảng
cipherText = chiso_chuoi(pos_index);
return cipherText;
}
//Thực hiện giải mã.
public string giaimatiengviet()
{
int[] pre_index = chuoi_mangchiso(cipherText);
int[] pos_index = new int[cipherText.Length];
//mã hóa
for (int i = 0; i < cipherText.Length; i++)
pos_index[i] = (pre_index[i] + chuoi.Length - k) % chuoi.Length;
//đổi sang mảng
plainText = chiso_chuoi(pos_index);
return plainText;
}
1.2 Mã hóa Vigenere
1.2.1 Thuận toán
Mật mã Vigenère là một phương pháp mã hóa văn bản bằng cách sử dụng xen kẽ một
số phép mã hóa Caesar khác nhau dựa trên các chữ cái của một từ khóa. Nó là một dạng
đơn giản của mật mã thay thế dùng nhiều bảng chữ cái.
Trong phép mã hóa Caesar, mỗi ký tự của bảng chữ cái được dịch đi một khoảng nhất
định, ví dụ với bước dịch là 3, A trở thành D, B trở thành E ... Mật mã Vigenère là sự kết
hợp xen kẽ vài phép mã hóa Caesar với các bước dịch khác nhau.
Để mã hóa, ta dùng một hình vuông Vigenère (hình bên). Nó gồm 26 hàng, mỗi hàng
dịch về bên trái một bước so với hàng phía trên, tạo thành 26 bảng mã Caesar. Trong
quá trình mã hóa, tùy theo từ khóa mà mỗi thời điểm ta dùng một dòng khác nhau để mã
hóa văn bản.
Ví dụ, ta có văn bản cần mã hóa như sau:
ATTACKATDAWN
Người gửi lựa chọn một từ khóa và viết nó lặp lại nhiều lần trên một dòng đến khi số chữ cái trên dòng bằng số chữ cái trong thông điệp, với từ khóa "LEMON" thì:
LEMONLEMONLE
Chữ cái đầu tiên của văn bản, A, được mã hóa bằng bảng bắt đầu
với L (chữ cái đầu tiên của từ khóa). Nó sẽ được mã hóa thành chữ cái trên
Ver 1.1 – 2015, FIT, HCMUP Bảo mật và An ninh mạng : LAB 04 - CRYTOGRAPHY]
Ths. Lương Trần Hy Hiến, KHOA CNTT – TRƯỜNG ĐH SƯ PHẠM TP. HCM 4
dòng L và cột A của hình vuông Vigenère, đó là chữ L. Tương tự như vậy,
chữ cái thư hai của văn bản sẽ được mã hóa bằng chữ cái thứ hai của từ
khóa: chữ trên dòng E và cột T là X. Sau đây là bản mã:
Văn bản: ATTACKATDAWN
Từ khóa: LEMONLEMONLE
Bản mã: LXFOPVEFRNHR
1.2.2 Hướng dẫn Cài đặt
public class Vigernere { #region property public string key { get; set; } public string plainText { get; set; } public string cipherText { get; set; } #endregion public Vigernere(string s) { key = s.ToUpper(); }
Ver 1.1 – 2015, FIT, HCMUP Bảo mật và An ninh mạng : LAB 04 - CRYTOGRAPHY]
Ths. Lương Trần Hy Hiến, KHOA CNTT – TRƯỜNG ĐH SƯ PHẠM TP. HCM 5
string chuoi = "ABCDEFGHIKLMNOPQRSTUVWXYZ"; public int[] chuoi_mangchiso(string s) { int[] mang = new int[s.Length]; for (int i = 0; i < s.Length; i++) mang[i] = chuoi.IndexOf(s[i]); return mang; } public string chiso_chuoi(int[] a) { string s = ""; for (int i = 0; i < a.Length; i++) s += chuoi[a[i]]; return s; } public String MaHoa(){ plainText = plainText.ToUpper(); int []p = chuoi_mangchiso(plainText); int []k = chuoi_mangchiso(key); int []kq = new int[plainText.Length]; for(int i = 0, j = 0; i < plainText.Length; i++) { kq[i] = (p[i] + k[j]) % chuoi.Length; j = ++j % k.Length; } cipherText = chiso_chuoi(kq); return cipherText; } public String GiaiMa() { int[] c = chuoi_mangchiso(cipherText); int[] k = chuoi_mangchiso(key); int[] kq = new int[cipherText.Length]; for (int i = 0, j = 0; i < cipherText.Length; i++) { kq[i] = (c[i] - k[j]) % chuoi.Length; if (kq[i] < 0) kq[i] = (c[i] + (chuoi.Length - k[j])) % chuoi.Length; j = ++j % k.Length; }
Ver 1.1 – 2015, FIT, HCMUP Bảo mật và An ninh mạng : LAB 04 - CRYTOGRAPHY]
Ths. Lương Trần Hy Hiến, KHOA CNTT – TRƯỜNG ĐH SƯ PHẠM TP. HCM 6
plainText = chiso_chuoi(kq); return plainText; } }
2 Mã hóa khóa bí mật
Tham khảo thư viện được cài đặt sẵn trong .NET Framework C#:
https://msdn.microsoft.com/en-us/library/system.security.cryptography(v=vs.110).aspx
2.1 DES
2.2 3DES
2.2.1 Minh họa màn hình
2.2.2 Lớp/Hàm xử lý
public class _3DESEncryption { /// <summary> /// Encrypt a string using dual encryption method. Return a encrypted cipher Text /// </summary>
Ver 1.1 – 2015, FIT, HCMUP Bảo mật và An ninh mạng : LAB 04 - CRYTOGRAPHY]
Ths. Lương Trần Hy Hiến, KHOA CNTT – TRƯỜNG ĐH SƯ PHẠM TP. HCM 7
/// <param name="toEncrypt">string to be encrypted</param> /// <param name="useHashing">use hashing? send to for extra secirity</param> /// <returns></returns> public static string Encrypt(string toEncrypt, string key, bool useHashing) { byte[] keyArray; byte[] toEncryptArray = UTF8Encoding.UTF8.GetBytes(toEncrypt); if (useHashing) { MD5CryptoServiceProvider hashmd5 = new MD5CryptoServiceProvider(); keyArray = hashmd5.ComputeHash(UTF8Encoding.UTF8.GetBytes(key)); hashmd5.Clear(); } else keyArray = UTF8Encoding.UTF8.GetBytes(key); TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider(); tdes.Key = keyArray; tdes.Mode = CipherMode.ECB; tdes.Padding = PaddingMode.PKCS7; ICryptoTransform cTransform = tdes.CreateEncryptor(); byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length); tdes.Clear(); return Convert.ToBase64String(resultArray, 0, resultArray.Length); } /// <summary> /// DeCrypt a string using dual encryption method. Return a DeCrypted clear string /// </summary> /// <param name="cipherString">encrypted string</param> /// <param name="useHashing">Did you use hashing to encrypt this data? pass true is yes</param> /// <returns></returns>
Ver 1.1 – 2015, FIT, HCMUP Bảo mật và An ninh mạng : LAB 04 - CRYTOGRAPHY]
Ths. Lương Trần Hy Hiến, KHOA CNTT – TRƯỜNG ĐH SƯ PHẠM TP. HCM 8
public static string Decrypt(string cipherString, string key, bool useHashing) { byte[] keyArray; byte[] toEncryptArray = Convert.FromBase64String(cipherString); if (useHashing) { MD5CryptoServiceProvider hashmd5 = new MD5CryptoServiceProvider(); keyArray = hashmd5.ComputeHash(UTF8Encoding.UTF8.GetBytes(key)); hashmd5.Clear(); } else keyArray = UTF8Encoding.UTF8.GetBytes(key); TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider(); tdes.Key = keyArray; tdes.Mode = CipherMode.ECB; tdes.Padding = PaddingMode.PKCS7; ICryptoTransform cTransform = tdes.CreateDecryptor(); byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length); tdes.Clear(); return UTF8Encoding.UTF8.GetString(resultArray); } }
2.2.3 Gọi hàm xử lý
private void btnDESEncrypt_Click(object sender, EventArgs e) { txtDESCipher.Text = _3DESEncryption.Encrypt(txtDESPlaintText.Text, txtKey.Text, true); } private void btnDESDecrypt_Click(object sender, EventArgs e) { txtDESDecrypt.Text = _3DESEncryption.Decrypt(txtDESCipher.Text, txtKey.Text, true); }
Ver 1.1 – 2015, FIT, HCMUP Bảo mật và An ninh mạng : LAB 04 - CRYTOGRAPHY]
Ths. Lương Trần Hy Hiến, KHOA CNTT – TRƯỜNG ĐH SƯ PHẠM TP. HCM 9
2.3 AES
Ví dụ tham khảo tại: https://msdn.microsoft.com/en-
us/library/system.security.cryptography.aescryptoserviceprovider(v=vs.110).aspx
3 Mã hóa công khai RSA
3.1 Hàm cơ bản
public class RSAEncryption { #region Ham_MaHoa_GiaiMa public static byte[] MaHoa(byte[] dulieu, RSAParameters RSAKey, bool doOAEF) { try { RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(); rsa.ImportParameters(RSAKey); return rsa.Encrypt(dulieu, doOAEF); } catch (CryptographicException ex) { MessageBox.Show(ex.Message); return null; } } public static byte[] GiaiMa(byte[] dulieu, RSAParameters RSAKey, bool doOAEF) { try { RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(); rsa.ImportParameters(RSAKey); return rsa.Decrypt(dulieu, doOAEF); } catch (CryptographicException ex) { MessageBox.Show(ex.Message); return null; } } #endregion }
Ver 1.1 – 2015, FIT, HCMUP Bảo mật và An ninh mạng : LAB 04 - CRYTOGRAPHY]
Ths. Lương Trần Hy Hiến, KHOA CNTT – TRƯỜNG ĐH SƯ PHẠM TP. HCM 10
3.2 Demo
#region BienTrungGian RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(); byte[] plaintText; byte[] cipherText; #endregion private void btnEncrypt_Click(object sender, EventArgs e) { plaintText = Encoding.UTF8.GetBytes(txtPlaintText.Text); cipherText = RSAEncryption.MaHoa(plaintText, rsa.ExportParameters(false), false); //txtCipherText.Text = Encoding.UTF8.GetString(cipherText); StringBuilder sbHash = new StringBuilder(); foreach (byte b in cipherText) sbHash.Append(String.Format("{0:x2}", b)); txtCipherText.Text = sbHash.ToString(); } private void btnDecrypt_Click(object sender, EventArgs e) {
Ver 1.1 – 2015, FIT, HCMUP Bảo mật và An ninh mạng : LAB 04 - CRYTOGRAPHY]
Ths. Lương Trần Hy Hiến, KHOA CNTT – TRƯỜNG ĐH SƯ PHẠM TP. HCM 11
byte[] decryptText = RSAEncryption.GiaiMa(cipherText, rsa.ExportParameters(true), false); txtDecryptText.Text = Encoding.UTF8.GetString(decryptText); }
4 Hàm băm
Sinh viên tự thử khả năng Encrypt và Decrypt tại trang: http://md5decrypt.net/
Tất cả code demo các thuật toán dưới đây sử dụng thư viện:
using System.Security.Cryptography;
Màn hình demo:
4.1 MD5
MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider(); //chuyển từ chuỗi sang mảng byte byte[] input = Encoding.UTF8.GetBytes(txtNoiDung.Text); byte[] result = md5.ComputeHash(input); StringBuilder sbHash = new StringBuilder(); foreach (byte b in result) sbHash.Append(String.Format("{0:x2}", b)); txtBanMa.Text = sbHash.ToString();
Ver 1.1 – 2015, FIT, HCMUP Bảo mật và An ninh mạng : LAB 04 - CRYTOGRAPHY]
Ths. Lương Trần Hy Hiến, KHOA CNTT – TRƯỜNG ĐH SƯ PHẠM TP. HCM 12
4.2 SHA2 – 512 bit
//SHA2: 256, 384, 512 //512 bits = 64 bytes. SHA512Managed sha512 = new SHA512Managed(); //chuyển từ chuỗi sang mảng byte byte[] input = Encoding.UTF8.GetBytes(txtNoiDung.Text); byte[] result = sha512.ComputeHash(input); StringBuilder sbHash = new StringBuilder(); foreach (byte b in result) sbHash.Append(String.Format("{0:x2}", b)); txtBanMa.Text = sbHash.ToString();