Giáo trình Mã hóa thông tin
Mục Lục
Mở đầu
Chương i Cơ sở toán học
1.Lý thuyết thông tin .6
1.1 Entropy .6
1.2 Tốc độ của ngôn ngữ. (Rate of Language).7
1.3 An toàn của hệ thống mã hoá .8
2.Lý thuyết độ phức tạp. . 10
3.Lý thuyết toán học. . 11
3.1 Modular số học. . 11
3.2 Số nguyên tố. . 12
3.3 Ước số chung lớn nhất. 12
3.4 Số nghịch đảo Modulo. . 14
3.5 Ký hiệu La grăng (Legendre Symboy). 15
3.6 Ký hiệu Jacobi (Jacobi Symboy). 16
3.7 Định lý phần dư trung hoa. . 18
3.8 Định lý Fermat. . 19
4. Các phép kiểm tra số nguyên tố. 19
4.1 Soloway-Strassen . 19
4.2 Rabin-Miller. 20
4.3 Lehmann. 21
4.4 Strong Primes. . 21
Chương II Mật mã
1. Khái niệm cơ bản. . 23
2. Protocol. 24
2.1 Giới thiệu Protocol. 24
2.2 Protocol mật mã. 25Upload by Share-Book.com
Trang 3
2.3 Mục đích của Protocol. 26
2.4 Truyền thông sử dụng hệ mật mã đối xứng. 27
2.5 Truyền thông sử dụng hệ mật mã công khai. . 28
3. Khoá . 31
3.1 Độ dài khoá. . 31
3.2 Quản lý khoá công khai. . 32
4. Mã dòng, mã khối (CFB, CBC). 34
4.1 Mô hình mã hoá khối. . 34
4.1.1 Mô hình dây truyền khối mã hoá. . 34
4.1.2 Mô hình mã hoá với thông tin phản hồi. . 36
4.2 Mô hình mã hoá dòng. 36
5. Các hệ mật mã đối xứng và công khai . 38
5.1 Hệ mật mã đối xứng . 38
5.2 Hệ mật mã công khai . 39
6. Các cách thám mã. 41
Chương III Hệ mã hoá RSA
1. Khái niệm hệ mật mã RSA. 46
2. Độ an toàn của hệ RSA . 48
3. Một số tính chất của hệ RSA. 49
Chương IV Mô hình Client/Server
1.Mô hình Client/Server. 52
2. Mã hoá trong mô hình Client/Server. . 53
Chương V Xây dựng hàm thư viện
1.Xây dựng thư viện liên kết động CRYPTO.DLL. 55
2.Chương trình Demo thư viện CRYPTO.DLL . 70
depth++; Upload by Share-Book.com Trang 62 mr_mip->trace[mr_mip->depth]=14; if (mr_mip->TRACER) mr_track(); mr_mip->infile=filep; mr_mip->fin=TRUE; n=cinstr(x,NULL); mr_mip->fin=FALSE; mr_mip->depth--; return n; } //============================= void power(flash x,int n,flash w) { copy(x,mr_mip->w8); zero(w); if (mr_mip->ERNUM || size(mr_mip->w8)==0) return; convert(1,w); if (n==0) return; mr_mip->depth++; mr_mip->trace[mr_mip->depth]=51; if (mr_mip->TRACER) mr_track(); if (n<0) { n=(-n); frecip(mr_mip->w8,mr_mip->w8); } if (n==1) { copy(mr_mip->w8,w); mr_mip->depth--; return; } forever { Upload by Share-Book.com Trang 63 if (n%2!=0) fmul(w,mr_mip->w8,w); n/=2; if (mr_mip->ERNUM || n==0) break; fmul(mr_mip->w8,mr_mip->w8,mr_mip->w8); } mr_mip->depth--; } //============================= void mad(big x,big y,big z,big w,big q,big r) { if (mr_mip->ERNUM) return; mr_mip->depth++; mr_mip->trace[mr_mip->depth]=24; if (mr_mip->TRACER) mr_track(); mr_mip->check=OFF; if (w==r) { mr_berror(MR_ERR_BAD_PARAMETERS); mr_mip->depth--; return; } multiply(x,y,mr_mip->w0); if (x!=z && y!=z)add(mr_mip->w0,z,mr_mip->w0); divide(mr_mip->w0,w,q); if (q!=r) copy(mr_mip->w0,r); mr_mip->check=ON; mr_mip->depth--; } //============================= Hàm Deciph.c Upload by Share-Book.com Trang 64 Hàm sử dụng để thực hiện các thao tác giải mã hoá với xâu kí tự đã được mã hoá bằng hàm enciph.c ở trên, bằng cách đa vào một xâu ký tự đã mã hoá (bản mã) ở đầu ra bạn sẽ nhận lại một xâu ký tự ban đầu (bản rõ gốc). Hàm thực hiện có sử dụng khoá bí mật lấy vào từ File PRIVATE.KEY. Hai File PUBLIC.KEY và PRIVATE.KEY chúng cùng được sinh ra do chương trình genkey, chúng có quan hệ mật th iết với nhau và không thể tách rời, nếu có khoá công khai mà không có khoá bí mật thì cũng không thể giải mã được, còn nếu có khoá bí mật mà không có khoá công khai thì cũng chẳng ích lợi gì. //============================= //Deciph.c #include #include #include #include int deciph(char *strinputde, char *stroutputde) { /* decipher using private key */ big x,y,ke,p,q,n,a,b,alpha,beta,t; FILE *ifile; int ch,i,leng; long ipt; miracl *mip=mirsys(100,0); x=mirvar(0); ke=mirvar(0); p=mirvar(0); q=mirvar(0); n=mirvar(0); y=mirvar(0); Upload by Share-Book.com Trang 65 alpha=mirvar(0); beta=mirvar(0); a=mirvar(0); b=mirvar(0); t=mirvar(0); mip->IOBASE=60; if ((ifile=fopen("private.key","r"))==NULL) { return 1; } cinnum(p,ifile); cinnum(q,ifile); fclose(ifile); multiply(p,q,ke); leng=strlen(strinputde); cinstr(x,strinputde); xgcd(p,q,a,b,t); lgconv(leng,n); /* first recover "one-time pad" */ #ifdef RSA decr(p,1,alpha); premult(alpha,2,alpha); incr(alpha,1,alpha); subdiv(alpha,3,alpha); #else incr(p,1,alpha); subdiv(alpha,4,alpha); #endif decr(p,1,y); powmod(alpha,n,y,alpha); #ifdef RSA decr(q,1,beta); premult(beta,2,beta); Upload by Share-Book.com Trang 66 incr(beta,1,beta); subdiv(beta,3,beta); #else incr(q,1,beta); subdiv(beta,4,beta); #endif decr(q,1,y); powmod(beta,n,y,beta); copy(x,y); divide(x,p,p); divide(y,q,q); powmod(x,alpha,p,x); powmod(y,beta,q,y); mad(x,q,q,ke,ke,t); mad(t,b,b,ke,ke,t); mad(y,p,p,ke,ke,x); mad(x,a,a,ke,ke,x); add(x,t,x); divide(x,ke,ke); if (size(x)<0) add(x,ke,x); for (i=0;i<leng;i++) { /* decipher character by character */ ch=*(strinputde+i); ch^=x[1]; /* XOR with last byte of x */ stroutputde[i]=ch; #ifdef RSA power(x,3,ke,x); #else mad(x,x,x,ke,ke,x); #endif } return 0; Upload by Share-Book.com Trang 67 } //============================= void multiply(big x,big y,big z) { /* multiply two big numbers: z=x.y */ int i,xl,yl,j,ti; mr_small carry,sz; big w0; #ifdef MR_NOASM mr_large dble; #endif if (mr_mip->ERNUM) return; if (y[0]==0 || x[0]==0) { zero(z); return; } w0=mr_mip->w0; /* local pointer */ mr_mip->depth++; mr_mip->trace[mr_mip->depth]=5; if (mr_mip->TRACER) mr_track(); #ifdef MR_FLASH if (mr_notint(x) || mr_notint(y)) { mr_berror(MR_ERR_INT_OP); mr_mip->depth--; return; } #endif sz=((x[0]&mr_mip->MSBIT)^(y[0]&mr_mip->MSBIT)); xl=(int)(x[0]&mr_mip->OBITS); yl=(int)(y[0]&mr_mip->OBITS); zero(w0); if (mr_mip->check && xl+yl>mr_mip->nib) Upload by Share-Book.com Trang 68 { mr_berror(MR_ERR_OVERFLOW); mr_mip->depth--; return; } //============================= void mad(big x,big y,big z,big w,big q,big r) { if (mr_mip->ERNUM) return; mr_mip->depth++; mr_mip->trace[mr_mip->depth]=24; if (mr_mip->TRACER) mr_track(); mr_mip->check=OFF; if (w==r) { mr_berror(MR_ERR_BAD_PARAMETERS); mr_mip->depth--; return; } multiply(x,y,mr_mip->w0); if (x!=z && y!=z)add(mr_mip->w0,z,mr_mip->w0); divide(mr_mip->w0,w,q); if (q!=r) copy(mr_mip->w0,r); mr_mip->check=ON; mr_mip->depth--; } //============================= int cinstr(flash x,unsigned char *string) { /* input big number in base IOBASE */ mr_small newb,oldb,b,lx; int ipt; Upload by Share-Book.com Trang 69 if (mr_mip->ERNUM) return 0; mr_mip->depth++; mr_mip->trace[mr_mip->depth]=78; if (mr_mip->TRACER) mr_track(); newb=mr_mip->IOBASE; oldb=mr_mip->apbase; mr_setbase(newb); /* temporarily change base ... */ b=mr_mip->base; mr_mip->check=OFF; ipt=instr(mr_mip->w5,string); /* ... and get number */ mr_mip->check=ON; lx=(mr_mip->w5[0]&mr_mip->OBITS); #ifdef MR_FLASH if ((int)(lx&mr_mip->MSK)>mr_mip->nib || (int)((lx>>mr_mip->BTS)&mr_mip->MSK)>mr_mip->nib) #else if ((int)lx>mr_mip->nib) #endif { /* numerator or denominator too big */ mr_berror(MR_ERR_OVERFLOW); mr_mip->depth--; return 0; } mr_setbase(oldb); /* restore original base */ cbase(mr_mip->w5,b,x); mr_mip->depth--; return ipt; } //============================= void incr(big x,int n,big z) { /* add int to big number: z=x+n */ if (mr_mip->ERNUM) return; mr_mip->depth++; Upload by Share-Book.com Trang 70 mr_mip->trace[mr_mip->depth]=7; if (mr_mip->TRACER) mr_track(); convert(n,mr_mip->w0); select(x,PLUS,mr_mip->w0,z); mr_mip->depth--; } //============================= void decr(big x,int n,big z) { /* subtract int from big number: z=x-n */ if (mr_mip->ERNUM) return; mr_mip->depth++; mr_mip->trace[mr_mip->depth]=8; if (mr_mip->TRACER) mr_track(); convert(n,mr_mip->w0); select(x,MINUS,mr_mip->w0,z); mr_mip->depth--; } 2.Chương trình Demo thư viện CRYPTO.DLL Phần này xây dựng một ứng dụng đơn giản để Demo thư viện CRYPTO.DLL, chương trình xây dựng nhập vào một xâu rồi mã hoá, giải mã và trả lại kết quả ban đầu. Upload by Share-Book.com Trang 71 Upload by Share-Book.com Trang 72 kết luận. Qua quá trình làm luận văn, em đã hiểu biết thêm kiến thức về sự an toàn của thông tin trên mạng, một số thuật toán và phương pháp mã hoá. Để so sánh, đánh giá một thuật toán mã hoá cần dựa vào một số yếu tố cơ bản như độ phức tạp thuật toán, thời gian mã hoá và vấn đề phân phối khoá trong môi trường nhiều người sử dụng. Dễ nhận thấy rằng các phương pháp mã hoá cổ điển như phương pháp đổi chỗ và thay thế là đơn giản và dễ thực hiện, tuy nhiên độ an toàn không cao do không đạt được độ phức tạp cần thiết, đồng thời khoá cũng rất dễ bị lộ do khoá của người gửi và người nhận là giống nhau. Đối với các thuật toán mã khoá công khai đã khắc phục được vấn đề phân phối khoá, khoá mã hoá có thể công khai và bất kỳ người nào có khoá công khai đều có thể mã hoá bản tin của mình, nhưng chỉ duy nhất người có khoá bí mật mới có thể giải mã được. Phương pháp mã hoá công khai sử dụng thuật toán RSA khá chậm chạp do yêu cầu những số nguyên tố lớn để sinh ra khoá công khai và khoá bí mật nhưng mặt khác n ó rất hữu ích vì cho tới nay chưa có thuật toán nào phân tích nhanh một số lớn thành các thừa số là các số nguyên tố. Với đề tài "Xây dựng thư viện các hàm mã hoá phục vụ bảo mật thông tin trong mô hình Client/Server" em đã hoàn thành xây dựng thư viện đ ộng CRYPTO.DLL với hai hàm mã hoá và hàm giải mã sử dụng thuật toán RSA, bên cạnh đó chưa hoàn thành phần việc xây dựng một ứng dụng để Demo thư viện trên mô hình Client/Server. Tuy nhiên do quĩ thời gian hạn hẹp, trình độ còn hạn chế nên không tránh khỏi thiếu xót, rất mong được sự chỉ bảo, góp ý nhiệt tình của các thầy. Upload by Share-Book.com Trang 73 Trong tương lai nếu điều kiện thời gian và kỹ thuật không bị hạn chế em sẽ xây dựng thư viện với các hàm đầy đủ hơn như, hàm kiểm tra một số có phải nguyên tố không, hàm sinh khoá, hàm tính giai thừa . . . Em xin chân thành cảm ơn ! Hà Nội, Ngày 06 tháng 06 năm 1999. Người thực hiện. Đặng Văn Hanh Upload by Share-Book.com Trang 74 Tài liệu tham khảo : BRASSARD, Modern Cryptology. Lecture Notes in Computer Science, Vol. 325. Springer- Verlag 1988. BRUCE SCHNEIER, APPLIED CRYPTOGRAPHY, Protocol, Algorithms, and Source Code in C, John Wiley & Sons 1994 COMBA, Exponentiation Cryptosystems on the IBM PC. IBM Phạm Văn ất, Kỹ thuật lập trình C, cơ sở và nâng cao Nhà xuất bản giáo dục 1997. Xuân Nguyệt và Phùng Kim Hoàng, học Visual C++ 5 trong 21 ngày. Nhà xuất bản Mũi cà mau 1998.
File đính kèm:
- giao_trinh_ma_hoa_thong_tin.pdf