Tìm hiểu và cài đặt một số hệ mật mã

83 406 0
Tìm hiểu và cài đặt một số hệ mật mã

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

MỤC LỤC Chương I MỘT SỐ HỆ MÃ CỔ ĐIỂN 1.1 Một số khái niệm 1.1.1 Khái niệm hệ mật mã 1.1.2 Mã hoá giải mã .7 1.1.3 Quy trình mã hoá giải mã liệu 1.1.4 Khái niệm hệ mã cổ điển .8 1.1.5 Hệ mã công khai 1.2 Mã dịch vòng 1.2.1 Mô tả 1.2.2 Đánh giá độ an toàn 10 1.3 Mã thay 10 1.3.1 Mô tả 10 1.3.2 Đánh giá độ an toàn 11 1.4 Mã Affine 11 1.4.1 Mô tả 11 1.4.2 Đánh giá độ an toàn 13 1.5 Mã Vigenere 13 1.5.1 Mô tả 13 1.5.2 Đánh giá độ an toàn 14 1.6 Hệ mã Hill 15 1.6.1 Mô tả 15 1.6.2 Đánh giá độ an toàn 17 1.7 Hệ mã Hoán vị 17 1.7.1 Mô tả 17 1.7.2 Đánh giá độ an toàn 18 1.8 Các hệ mã dòng 18 Mô tả 18 1.9 Sơ lược thám mã hệ mã cổ điển 19 1.10 Nhận xét chung hệ mật mã cổ điển 20 Chương II 21 HỆ MÃ DES 21 2.1 Mô tả DES 21 2.2 Ví dụ 30 2.3 Sơ lược thám mã hệ mã DES 34 Chương III 37 MỘT SỐ HỆ MẬT MÃ CÔNG KHAI 37 3.1 Tổng quan 37 3.2 Hệ mã RSA 37 3.2.1 Mô tả sơ lược 38 3.2.2 Tạo khóa 38 3.2.3 Mã hóa 40 3.2.4 Giải mã .40 3.2.5 Ví dụ 41 3.2.6 Một số vấn đề .42 3.2.7 Đánh giá độ an toàn 43 3.2.8 Sơ lược thám mã RSA 45 Tấn công dựa thời gian 45 Tấn công lựa chọn thích nghi mã 46 3.3 Hệ mã Ba Lô (MHK) 46 3.3.1 Tạo khoá 46 3.3.2 Mã hoá 46 3.3.3 Giải mã .47 3.3.4 Ví dụ 47 Chương IV 49 CÀI ĐẶT 49 4.1 Mã dịch vòng 49 4.2 Mã Affine 50 4.3 Mã Hill 51 4.4 Mã Vigenere 52 4.5 Mã DES 53 4.6 Mã RSA 54 4.7 Mã Balô (MHK) 55 4.8 Truyền file qua mạng 56 KẾT LUẬN 58 Những điều làm 58 Những điều chưa làm 58 Hướng phát triển đề tài 59 PHỤ LỤC 60 SƠ LƯỢC VỀ TCP/IP 60 TCP/IP gì? .60 TCP gì? 60 IP ? .63 Sử dụng TCP/IP Net để truyền file 64 MỘT SỐ MÃ NGUỒN CHÍNH 65 Mã Dịch Vòng: 65 Mã Affine: 67 Mã DES .69 Mã RSA: .75 Mã Ba Lô: 77 Truyền file qua mạng 82 TÀI LIỆU THAM KHẢO 85 NHẬN XÉT CỦA GIÁO VIÊN HƯỚNG DẪN 86 -5- LỜI NÓI ĐẦU Từ xưa đến thông tin yếu tố quan trọng hoạt động đời sống người Trong thời đại ngày nay, phương thức truyền đạt thông tin ngày đa dạng phát triển Với đời máy tính mạng máy tính, việc trao đổi thông tin trở lên dễ dàng hơn, nhanh chóng hơn, đa dạng Nhưng kèm theo nguy xâm phậm thông tin ngày tăng Nắm bắt thông tin nhiều mang ý nghĩa định, sống đặc biệt lĩnh vực: kinh tế, trị, an ninh, quốc phòng…Vì việc bảo mật thông tin đã, vấn đề đặt cấp bách Để giải vấn đề hệ mật mã đời Từ hệ mật mã sơ khải cổ điển như: Hệ mã Dịch Vòng, hệ mã Hill, hệ mã Affine,…, hệ mật mã đại, phúc tạp hệ mã DES Các hệ mật mã công khai hệ mã RSA, hệ mã Ba Lô Nhưng kèm với đời phát triển hệ mật mã phương pháp phá khoá hệ mật mã Cuộc chiến bảo mật thông tin xâm phạm thông tin diễn cách thầm lặng vô gay gắt Với mong muốn tìm hiểu phương pháp bảo mật thông tin em chọn đề tài TÌM HIỂU VÀ CÀI ĐẶT MỘT SỐ HỆ MẬT MÃ làm đồ án tốt nghiệp Tuy có nhiều cố gắng việc xây dựng đề tài hạn chế mặt thời gian kiến thức kinh nghiệm thực tế nên đề tài không tránh khỏi thiếu sót Vì em mong bảo, đóng góp ý kiến thầy cô giáo để đề tài em ngày hoàn thiện -6- Chương I MỘT SỐ HỆ MÃ CỔ ĐIỂN 1.1 Một số khái niệm 1.1.1 Khái niệm hệ mật mã Một hệ mật mã (P,C,K,E,D) thoả mãn điều kiện sau: P: Là tập hợp hữu hạn rõ, gọi không gian rõ C: Là tập hữu hạn mã, gọi không gian mã Mỗi phần tử C nhận cách áp dụng phép mã hoá Ek lên phần tử P, với k  K K: Là tập hữu hạn khoá hay gọi không gian khoá Đối với phần tử k K gọi khoá Số lượng không gian khoá phải đủ lớn để “kẻ địch” đủ thời gian để thử khoá ( phương pháp vét cạn) Đối với k  K có quy tắc mã ek: PC quy tắc giải mã tương ứng dk D Mỗi ek : P C dk: CP hàm mà: Dk (ek(x))=x với rõ x P 1.1.2 Mã hoá giải mã Mã hoá(encryption) Là trình biến đổi thông tin từ dạng nhận thức sang dạng không nhận thức Giải mã: (decryption) Là trình ngược lại với mã hoá, tức biến đổi thông tin từ dạng không nhận thức (dữ liệu mã hoá) dạng nhận thức (dạng gốc) 1.1.3 Quy trình mã hoá giải mã liệu -7- Qu¶n lý kho¸ KhoáKe DL gốc Mã hoá DL mã hoá KhoáKd Giải mã DL gốc Quy trình mã hoá liệu Quy trình thực sau: Bộ phận quản lý khoá thực lập khoá mã hoá (Ke) khoá giải mã (Kd) Dữ liệu gốc mã hoá nhờ khoá mã hoá Vấn đề quản lý khóa việc mã hoá giải mã tương đối đơn giản đảm bảo tuyệt đối bí mật cho khoá giải mã 1.1.4 Khái niệm hệ mã cổ điển Trong hệ mã cổ điển, người ta sử dụng khoá hai phía dĩ nhiên hạn chế an toàn phổ biến phương pháp đối xứng, đồng thời điểm yếu, cần bên để lộ khoá bí mật bị Hệ mã cổ điển loại mã thực thông qua hàm f có tính thuận nghịch, sử dụng f để mã hoá, biết f suy hàm giải mã f-1 Một số hệ mã cổ điển - Mã dịch vòng - Mã thay - Mã hoán vị - Mã Affine - Mã Vigenere - Mã Hill - Mã dòng -8- 1.1.5 Hệ mã công khai Mật mã hóa khóa công khai dạng mật mã hóa cho phép người sử dụng trao đổi thông tin mật mà không cần phải trao đổi khóa chung bí mật trước Điều thực cách sử dụng cặp khóa có quan hệ toán học với khóa công khai khóa cá nhân (hay khóa bí mật)  Một số hệ mã công khai - Hệ mã RSA - Hệ mã Ba Lô 1.2 Mã dịch vòng 1.2.1 Mô tả Khái niệm : mã dịch vòng mã tạo cách kí tự rõ dịch k vị trí theo chiều kim đồng hồ Mã dịch vòng xác định Z26 (do có 26 chữ bảng chữ bảng chữ tiếng Anh) Giả sử P = C = K = Z26 với  k  25 , Định nghĩa: eK(x) = x +K mod 26 dK(x) = y -K mod 26 (x,y  Z26) Nhận xét: Trong trường hợp k=3, hệ mật thường gọi hệ mật Caesar thường Julius Caesar sử dụng Ví dụ: Mã hoá: Giả sử khoá cho MDV K = 11 rõ :wewillmeetatmidnight Đổi chuỗi số theo tứ tự bảng chữ ta có: 22 22 11 11 12 4 19 19 12 13 19 Cộng với khoá moduloo 26: -9- 15 19 22 22 23 15 15 11 23 19 14 24 19 17 18 Ta thu mã: HPHTWWXPPELEXTOYTRSE Giải mã: 15 19 22 22 23 15 15 11 23 19 14 24 19 17 18 Trừ số cho 11 rút gòn theo mod 26 ta dãy số 22 22 11 11 12 4 19 19 12 13 19 Đổi dãy số chữ ta thu rõ: Bản rõ: wewillmeetatmidnight 1.2.2 Đánh giá độ an toàn Điều kiện để hệ mật an toàn phép tìm khoá vét cạn thực được, không gian khoá nhỏ nên dễ dàng thử khoá dk nhận rõ có nghĩa Vì hệ mã dịch vòng hệ mã không an toàn 1.3 Mã thay 1.3.1 Mô tả Để có mã người ta thay đổi ký hiệu rõ ký hiệu Trên thực tế, mã thay lấy P C chữ tiếng Anh ( 26 chữ ) Ta dùng Z26 mã dịch vòng phép mã hoá giải mã phép toán đại số mã thay thế, xem mã hoá giải mã hoán vị ký tự Ta định nghĩa mã thay dạng toán học sau Giả sử P = C = K = Z26 K chứa hoán vị 26 kí hiệu 0,1…,25 Với phép hoán vị K ta định nghĩa: e (x) = (x) d (y) = -1 (y) Trong -1 hoán vị ngược  -10- Sau ví dụ phép hoán vị ngẫu nhiên  tạo nên hàm mã hoá ( trước ký hiệu rõ kí hiệu chữ in thường ký hiệu mã kí hiệu chữ in hoa) a b c d e f g h i ị k l m X N Y A H P O G Z Q W B t n o p q r s t u v w x y z S F L R C V M U E K J D I Như e(a)=X, e(b)= N,… Hàm giải mã phép hoán vị ngược Điều thực cách viết hàng thứ hai lên trước xếp theo thứ tự chữ Ta nhận được: A B C D E F G H I J K L M d l r y v o h e z x v p t N O P Q R S T U V W X Y Z b g f j q n m u s k a c i Bởi d(A)= d, d(B)= l,… 1.3.2 Đánh giá độ an toàn Mỗi khoá mã thay phép hoán vị 26 kí tự Số hoán vị 26!, lớn 4x1026 số lớn Bởi vậy, phép tìm khoá vét cạn thực được, chí máy tính Tuy nhiên mã hoán vị lại dễ dàng bị thám phương pháp khác 1.4 Mã Affine 1.4.1 Mô tả Mã Affine trường hợp đặc biệt mã thay gồm có 26 số 26! hoán vị 26 phần tử Mã Affine định nghĩa sau: -11- Giả sử P = C = K = Z26 giả sử P={(a,b)  Z26 x Z26: USCLN(a,26)=1} Với k=(a,b)K, ta định nghĩa: ek (x) = ax+b mod 26 dk(y) = a-1(y-b) mod 26 x,y  Z26 Để việc giải mã thực được, yêu cầu thiết hàm Affine phải đơn ánh Nói cách khác, với y  Z26, ta muốn có đồng thức sau: ax + b  y (mod 26) phải có nghiệm x Đồng dư thức tương đương với: ax  y – b (mod 26) Vì y thay đổi Z26 nên y-b thay đổi Z26 Bởi vậy, ta cần nghiên cứu phương trình đồng dư: ax  y (mod 26) (y Z26) Ta biết rằng, phương trình có nghiệm y UCLN (a,26) =1 (ở hàm UCLN ước chung lớn biến nó) Trước tiên ta giả sử UCLN(a,26) = d > Khi đó, đồng dư thức ax  (mod 26) có hai nghiệm phân biệt Z26 x = x = 26/d Trong trường hợp này, e(x) = ax + b mod 26 hàm đơn ánh hàm mã hoá hợp lệ Ví dụ: Giả sử k = (7,3) Ta tính 7-1mod 26 =15 Hàm mã hoá ek(x) = 7x+3 Và hàm giải mã tương ứng Dk(x) = 15(y-3) = 15y- 19 tất phép toán thực Z26 -12- Để minh hoạ ta mã hoá rõ “hot” Trước tiên ta biến đổi chữ h, o, t thành thặng dư theo modulo 26 Ta số tương ứng 7,14,19 mã hoá: x 7+3 mod 26 = 52 mod 26 = x 14 + mod 26 = 101 mod 26 = 23 x 19 + mod 26 = 136 mod 26 = Bởi kí hiệu mã 0, 23, tương ứng với xâu kí tự AXG Thực giải mã theo hàm giả mã ta thu mã “hot” 1.4.2 Đánh giá độ an toàn Do đặc trưng hệ mã cổ điển: Hàm mã hoá phải khả nghịch, có f tính f-1, hàm f phải hàm đơn ánh định lý nghiệm đồng dư đa thức ax = b mod m Bởi vậy, hàm mã hoá hệ mã Affine hàm ek(x) có nghiệm (a,26) = Từ nhận xét ta thấy, có 12 cách chọn a, 26 cách chọn b có: 12*26 = 312 cách chọn khoá Như độ an toàn nhỏ 1.5 Mã Vigenere 1.5.1 Mô tả Trong hai hệ mã dịch vòng mã thay ( khoá chọn ) ký tự ánh xạ vào ký tự Vì lý đó, hệ mật gọi hệ thay đơn biểu Còn hệ mật chữ đơn, mật mã lấy tên Blaise de Vigenere sống vào kỷ XVI Hệ mã Vigenere định nghĩa sau: Cho m số nguyên dương cố định Giả sử P = C = K = (Z26)m Với khoá K = ( k1, k1,…,km) ta xác định: ek(x1, x2, …, xm) = (x1+k1, x2+k2,…, xm+km) d k(y1, y2,…, ym) = (y1-k1, y2-k2, …, ym-km) Trong tất phép toán thực Z26 -13- for (int i = 0; i < 48; i++) { khoaphu[i] = t.elementKey[buoc - 1,i]; } CreateF F = new CreateF(/* R thay la Li*/R, khoaphu); for (int i = 0; i < 32; i++) { Ri[buoc - 1,i] = Li[buoc,i]; } for (int i = 0; i < 32; i++) { Li[buoc - 1,i] = xor(Ri[buoc,i], F.getF()[i]); } if (buoc == 1) { byte[] w = new byte[64]; for (int i = 0; i < 32; i++) { w[i] = Li[buoc - 1,i]; w[i + 32] = Ri[buoc - 1,i]; } cipherText=quaIP_1(cipherText); } } byte[] result = new byte[8]; return DoiSangByte(cipherText); } //qua hoan vi IP private byte[] quaIP(byte[] a) { byte[] b = new byte[64]; -72- for (int i = 0; i < 64; i++) { b[i] = a[Constant.IP[i]-1]; } return b; } //qua hoan vi IP-1 private byte[] quaIP_1(byte[] a) { byte[] b = new byte[64]; for (int i = 0; i < 64; i++) { b[i] = a[Constant.IP_1[i]-1]; } return b; } //chuyen mot byte sang Nhi Phan private byte[] NhiPhan(byte b) { byte[] push = new byte[8]; byte[] push1 = new byte[8]; int i = 0; while (b != 0) { int r = b % 2; push[i] = (byte)r; b = (byte)(b/ 2); i++; } i = 0; for (int j = 7; j >= 0; j ) { push1[i] = push[j]; ///Console.WriteLine(a.ToString()+" : "+push1[i]); //Console.ReadLine(); i++; } -73- return push1; } //ham tinh xor cua hai so public byte xor(int a, int b) { if (a == && b == || a == & b == 0) return 0; return 1; } //lay Lo,Ro tu ban da qua IP hoac IP-1 void create(int buoc) { if (buoc == 0) { for (int i = 0; i < 32; i++) { Li[buoc, i] = plainText[i]; Ri[buoc, i] = plainText[i + 32]; } } Else { if (buoc == 15) { for (int i = 0; i < 32; i++) { Ri[buoc, i] = plainText[i]; Li[buoc, i] = plainText[i + 32]; } } } } private byte[]DoiSangByte(byte[] x) { byte[] convertToArrayByte = new byte[8]; byte dem = 0; byte temp = 0; while (dem < 8) { -74- for (int i = 0; i < 8; i++) { temp = (byte)(temp + (byte)(Math.Pow(2, (int)(7 - i)))); } convertToArrayByte[dem] = temp; temp = 0; dem++; } return convertToArrayByte ; } }} Mã RSA: using System; using System.Collections.Generic; using System.Text; namespace ATTT { class RSA { CreateKeyRSA keyRSA = new CreateKeyRSA(); private ulong[] index = new ulong[1000]; public ulong EncryptFile(byte x) { ulong y; y = Pow(x, keyRSA.e,keyRSA.m); return y; } public byte DecryptFile(ulong y) { ulong x = Pow(y, keyRSA.d,keyRSA.m); return (byte)x; -75- x[dem * + i] * } public string Encrypt(string stX) { string stY=""; //lay chi so sau dau vao for (int i = 0; i < stX.Length; i++) index[i] = Convert.ToUInt64(stX[i]); //ma hoa for (int i = 0; i < stX.Length; i++) { stY=stY+ Pow(index[i], keyRSA.e, keyRSA.m).ToString()+" "; } return stY.ToString(); } public string Decrypt(string stY) { stY = stY.Trim(); stY = stY + " "; string stX=""; string tu = ""; for (int i = 0; i < stY.Length; i++) { tu = tu + stY[i]; if (stY[i] == ' ') { try { tu = tu.Trim(); ulong a = Convert.ToUInt64(tu); ulong b = Pow(a, keyRSA.d, keyRSA.m); //System.Windows.Forms.MessageBox.Show(b.ToString()); stX = stX + Convert.ToChar(b).ToString(); //System.Windows.Forms.MessageBox.Show(stX); -76- tu = ""; } catch(Exception e) { string stloi = "loi khong giai ma duoc: "; System.Windows.Forms.MessageBox.Show(stloi + e.ToString()); return ""; }} } return stX.ToString(); } private ulong Pow(ulong a, ulong x,ulong n) { ulong d = 1; a = a % n; while (x != 0) { if (x % != 0) d = (d * a) % n; x=x/2; a = (a * a) % n; } return d; } }} Mã Ba Lô: using System; using System.Collections.Generic; using System.Text; using System.Collections; using System.Windows.Forms; using System.IO; namespace ATTT { class BaLo -77- { private int[] x = new int[8]; private int[] index = new int[1000]; private int[] x1 = new int[16]; public string stXl = ""; CreateKey_BaLo keyBalo = new CreateKey_BaLo(); PublicArray p = new PublicArray(); public int EncryptFile(byte byteEncrypt) { int y = 0; x = keyBalo.binaryNumber(byteEncrypt); for (int i = 0; i < keyBalo.s.Length; i++) y = y + x[i] * keyBalo.t[i]; return y; } public byte DecryptFile(int numberEncrypt) { int inum; int inverse = p.inverseElement(keyBalo.a, keyBalo.p); int c = inverse * numberEncrypt % keyBalo.p; inum = toNumberDecrypt(c); return (byte)inum; } public string Encrypt(string stX) { string stY = ""; //lay chi so sau dau vao for (int i = 0; i < stX.Length; i++) index[i] = Convert.ToInt16(stX[i]); //ma hoa for(int i=0;i= keyBalo.s[keyBalo.s.Length - - i]) { st = st - keyBalo.s[keyBalo.s.Length - - i]; arrayListFrom[i] = 1; } else { arrayListFrom[i] = 0; } if (keyBalo.s.Length - - i == && st != 0) { System.Windows.Forms.MessageBox.Show("khong the giai ma duoc"); return 0; } i++; } -80- // chuyen so nhi phan ve bye b = toINT(arrayListFrom); return (b); } //this method is a part of Decryption process private int toNumberDecrypt1(int st) { //chuyen so giai ma duoc ve dang nhi phan theo thuat toan da co int[] arrayListFrom = new int[keyBalo.s1.Length]; for (int l = 0; l < arrayListFrom.Length; l++) arrayListFrom[l] = 0; int b; int i = 0; while (st != 0) { if (st >= keyBalo.s1[keyBalo.s1.Length - - i]) { st = st - keyBalo.s1[keyBalo.s1.Length - - i]; arrayListFrom[i] = 1; } else { arrayListFrom[i] = 0; } if (keyBalo.s1.Length - - i == && st != 0) { System.Windows.Forms.MessageBox.Show("Giải mã không thành công, bạn xem lại khoá mã"); return 0; } i++; } // chuyen so nhi phan ve bye b = toINT1(arrayListFrom); return (b); } private int toINT(int[] k) -81- { int inum = 0; for (int i = 7; i >= 0; i ) inum = inum + k[i] * pow(2, i); return inum; } private int toINT1(int[] k) { int inum = 0; for (int i = 15; i >= 0; i ) inum = inum + k[i] * pow(2, i); return inum; } private int pow(int a, int b) { int c = 1; if (a == 0) return 0; if (b == 0) return 1; for (int i = 1; i

Ngày đăng: 04/08/2016, 09:01

Từ khóa liên quan

Tài liệu cùng người dùng

Tài liệu liên quan