1 mã hóa cổ điển - comp1049.weebly.com · Để mã hóa, ta dùng một hình vuông...

12
Ver 1.1 2015, FIT, HCMUP Bo mt và An ninh mng : 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. Gii 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í dsau: Cho bn rõ : TOIYEUVIETNAM vi khóa k = 4 Vy bn 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()

Upload: others

Post on 03-Nov-2019

7 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: 1 Mã hóa cổ điển - comp1049.weebly.com · Để 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

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()

Page 2: 1 Mã hóa cổ điển - comp1049.weebly.com · Để 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

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;

Page 3: 1 Mã hóa cổ điển - comp1049.weebly.com · Để 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

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

Page 4: 1 Mã hóa cổ điển - comp1049.weebly.com · Để 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

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(); }

Page 5: 1 Mã hóa cổ điển - comp1049.weebly.com · Để 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

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; }

Page 6: 1 Mã hóa cổ điển - comp1049.weebly.com · Để 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

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>

Page 7: 1 Mã hóa cổ điển - comp1049.weebly.com · Để 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

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>

Page 8: 1 Mã hóa cổ điển - comp1049.weebly.com · Để 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

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); }

Page 9: 1 Mã hóa cổ điển - comp1049.weebly.com · Để 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

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 }

Page 10: 1 Mã hóa cổ điển - comp1049.weebly.com · Để 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

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) {

Page 11: 1 Mã hóa cổ điển - comp1049.weebly.com · Để 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

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();

Page 12: 1 Mã hóa cổ điển - comp1049.weebly.com · Để 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

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();