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

pdf74 trang | Chuyên mục: Mật Mã Học | Chia sẻ: tuando | Lượt xem: 408 | Lượt tải: 0download
Tóm tắt nội dung Giáo trình Mã hóa thông tin, để xem tài liệu hoàn chỉnh bạn click vào nút "TẢI VỀ" ở trên
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:

  • pdfgiao_trinh_ma_hoa_thong_tin.pdf
Tài liệu liên quan