Đề tài Mô phỏng chương trình chữ kí số elgamal trên văn bản điện tử

Tài liệu Đề tài Mô phỏng chương trình chữ kí số elgamal trên văn bản điện tử: CHƯƠNG III MÔ PHỎNG CHƯƠNG TRÌNH CHỮ KÍ SỐ ELGAMAL TRÊN VĂN BẢN ĐIỆN TỬ Như ta đã biết một sơ đồ chữ kí số thường chứa 2 thành phần đó là thuật toán ký và thuật toán xác minh . Trong chương này em xin trình bày về hàm Hash đơn giản là hàm tóm lược văn bản và ký số lên file văn bản , nhằm bảo toàn tính nguyên vẹn của văn bản . I. Hàm HASH và việc tóm lược thông báo. Một vấn đề đặt ra là ta không nên áp sơ đồ ký số vào một thông báo dài . Nhưng thông báo thì phải được kí , mâu thuẫn này có thể giải quyết được bằng cách sử dụng hàm Hash , vì hàm Hash là một công cụ tóm lược đặc trưng của thông báo rất an toàn và hữu hiệu . Với một thông báo có độ dài M bất kỳ . Hàm Hash cho ra giá trị tóm lược thông báo có độ dài không đổi, nói chung giá trị tóm lược thông báo có độ dài nhỏ hơn thông báo M rất nhiều . Chẳng hạn | H(M) | = 128 bít hoặc | H(M) | =160 bít trong khi đó thông báo có độ dài cỡ Mega byte hay lớn hơn. Do vậy đặc tính cơ bản của hàm Hash là đưa ra một giá trị đại diện của thô...

doc45 trang | Chia sẻ: hunglv | Lượt xem: 1445 | Lượt tải: 0download
Bạn đang xem trước 20 trang mẫu tài liệu Đề tài Mô phỏng chương trình chữ kí số elgamal trên văn bản điện tử, để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên
CHƯƠNG III MÔ PHỎNG CHƯƠNG TRÌNH CHỮ KÍ SỐ ELGAMAL TRÊN VĂN BẢN ĐIỆN TỬ Như ta đã biết một sơ đồ chữ kí số thường chứa 2 thành phần đó là thuật toán ký và thuật toán xác minh . Trong chương này em xin trình bày về hàm Hash đơn giản là hàm tóm lược văn bản và ký số lên file văn bản , nhằm bảo toàn tính nguyên vẹn của văn bản . I. Hàm HASH và việc tóm lược thông báo. Một vấn đề đặt ra là ta không nên áp sơ đồ ký số vào một thông báo dài . Nhưng thông báo thì phải được kí , mâu thuẫn này có thể giải quyết được bằng cách sử dụng hàm Hash , vì hàm Hash là một công cụ tóm lược đặc trưng của thông báo rất an toàn và hữu hiệu . Với một thông báo có độ dài M bất kỳ . Hàm Hash cho ra giá trị tóm lược thông báo có độ dài không đổi, nói chung giá trị tóm lược thông báo có độ dài nhỏ hơn thông báo M rất nhiều . Chẳng hạn | H(M) | = 128 bít hoặc | H(M) | =160 bít trong khi đó thông báo có độ dài cỡ Mega byte hay lớn hơn. Do vậy đặc tính cơ bản của hàm Hash là đưa ra một giá trị đại diện của thông báo M rất ngắn so với thông báo . Sau khi đã tóm lược thông báo M được một tóm lược H(M) người ta dùng chữ ký số áp vào H(M) . Thông báo M cùng với tóm H(M) đã được ký sẽ được gói trọn trong một thông báo và được mã hoá theo cách thông thường để truyền đi. Người nhận được thông báo có thể chứng thực chữ ký tóm lược H(M) sau đó dùng hàm Hash tính lại tóm lược với thông báo vừa nhận được và so sánh kết quả. Khi đó cùng một lúc có thể xác thực được người gửi và cả sự nguyên vẹn của thông báo M . II. Mô tả chương trình chữ kí số Elgamal trên một file văn bản bất kỳ M. -Đầu tiên ta mở file văn bản (M) cần kí , sau đó dùng hàm Hash để tóm lược lại văn bản ta được H(M). Hàm Hash sau đây sẽ sử dụng là ta sẽ chia văn bản M ra làm nhiều khối , mỗi khối là 40 byte . Sau đó ta sẽ đọc từng 40 byte văn bản của từng khối gán bằng 1 byte mã. Nếu khối văn bản cuối cùng không đủ 40 byte thì ta sẽ cho đọc riêng số lượng byte đó thành 1 byte mã. Đoạn chương trình sau được viết bằng Pascal mô tả một trong những cách tóm lược văn bản qua hàm Hash. procedure tom_luoc(st:ten_file); var l,m,n,i,j:longint; kq:word; dem:sl; begin fillchar(hash,max_sl,0); assign(f,st); reset(f,1); l:=filesize(f); m:=l div 40; n:=l mod 40; for i:=1 to m do begin blockread(f,dem,40,kq); for j:=0 to 39 do hash[j]:=hash[j] xor dem[j]; end; if (n>0) then begin blockread(f,dem,n,kq); for j:=0 to n-1 do hash[j]:=hash[j] xor dem[j]; end; close(f); end; -Sau khi tóm lược được, ta dùng chương trình ký cùng với phần tóm lược để ký lên văn bản đã nhập . Cuối cùng sẽ ghi toàn bộ văn bản và chữ kí số lên file ký . -Đầu tiên ta mở file văn bản cần kiểm tra chữ ký số , sau đó ta lại dùng hàm Hash để tóm lược lại văn bản, sau đó đưa kết quả vào để kiểm tra chữ kí trên văn bản -Quá trình kí và kiểm tra chữ kí thể hiện qua 2 sơ đồ sau: Sơ đồ quá trình kí lên văn bản M: M M Công Khai Chữ ký 1 Chữ ký 2 Chương Trình ký số Tóm lược M Sơ đồ quá trình kiểm tra chữ ký trên văn bản M: M Công Khai Chữ Ký 1 Chữ Ký 2 Chương trình Kiểm Tra Tóm lược M Sau đây là chương trình mô phỏng Sơ đồ chữ kí Elgamal: Khi chạy chương trình ta cần chú ý những điểm sau: -Khi hiển thị lựa chọn thì ta nhập “ky” để chọn ký lên văn bản, chương trình sẽ bắt ta nhập tên file cần ký và file ký vào. Sau khi ký xong chương trình sẽ trở lại ngay menu chính. ta nhập “ kiem tra“ để chọn kiểm tra văn bản có chữ ký, ta sẽ phải nhập vào tên file cần kiểm tra, và chon “thoat” để thoát khỏi chương trình. { Chuong trinh chu ky so Elgama } uses crt,dos,graph; var det,ycolet,gra:integer; hd,td,cao,rto,rbe,ro,culy,day:word; kichthuoc,tyle,heso,doday,mauchu:byte; procedure cochu; begin ro:=kichthuoc; rbe:=2*ro; rto:=2*rbe; cao:=2*rto; culy:=11*kichthuoc; end; procedure cach; begin hd:=hd+4*(kichthuoc+1); end; procedure xuongdong; begin hd:=8*kichthuoc; day:=day+25*kichthuoc; end; procedure batdau; begin hd:=8*kichthuoc; day:=20*kichthuoc; end; procedure phay; var xi,yi,si,ji:word; begin td:=day-rto; xi:=hd;yi:=td; si:=1; if doday=3 then si:=2; for ji:=0 to doday do begin hd:=xi-ji*tyle; ellipse(hd-rto,td+rto,270,360,ro,rbe); end; hd:=xi;td:=yi; hd:=hd+4*ro; end; procedure sac; var xi,yi,si,ji:word; begin td:=day-rto; hd:=hd-culy; xi:=hd;yi:=td; si:=1; if doday=3 then si:=2; for ji:=0 to doday do begin hd:=xi-ji*tyle; ellipse(hd,td-cao-ro,270,360,ro,rbe); end; hd:=xi;td:=yi; hd:=hd+culy; end; procedure huyen; var xi,yi,si,ji:word; begin td:=day-rto; hd:=hd-culy; xi:=hd;yi:=td; si:=1; if doday=3 then si:=2; for ji:=0 to doday do begin hd:=xi-ji*tyle; ellipse(hd,td-cao-ro,180,270,ro,rbe); end; hd:=xi;td:=yi; hd:=hd+culy; end; procedure hoi; var xi,yi,si,ji:word; begin td:=day-rto; hd:=hd-culy; xi:=hd;yi:=td; si:=1; if doday=3 then si:=2; for ji:=0 to doday do begin hd:=xi-ji*tyle; arc(hd,td-cao-ro,270,360,rbe); arc(hd+ro,td-cao-ro,0,270,ro); end; hd:=xi;td:=yi; hd:=hd+culy; end; procedure nga; var xi,yi,si,ji:word; begin td:=day-rto; hd:=hd-culy; xi:=hd;yi:=td; si:=1; if doday=3 then si:=2; for ji:=0 to doday do begin hd:=xi-ji*tyle; arc(hd+ro,td-cao,180,360,ro); arc(hd-ro,td-cao,0,180,ro); end; hd:=xi;td:=yi; hd:=hd+culy; end; procedure nang; begin td:=day-rto; hd:=hd-culy; if doday=1 then circle(hd-ro div 2,td+rto+rbe,ro) else circle(hd-ro,td+cao-ro,ro+ro div 2); setfillstyle(1,mauchu); floodfill(hd-ro+1,td+cao-ro-1,mauchu); hd:=hd+culy; end; procedure mu; var xi,yi,si,ji:word; begin td:=day-rto; hd:=hd-culy; xi:=hd;yi:=td; si:=1; if doday=3 then si:=2; for ji:=0 to doday do begin hd:=xi-ji*tyle; ellipse(hd,td-cao+rbe+ro,0,180,rbe,ro); end; hd:=xi;td:=yi; hd:=hd+culy; end; procedure chu_aw; var xi,yi,si,ji:word; begin td:=day-rto; xi:=hd;yi:=td; si:=1; if doday=3 then si:=2; for ji:=0 to doday do begin hd:=xi-ji*tyle; circle(hd,td,rto); line(hd+rto,td-rto,hd+rto,td+rto); ellipse(hd,td-cao+rbe,180,360,rbe,ro); end; hd:=xi;td:=yi; hd:=hd+culy; end; procedure chu_a; var xi,yi,si,ji:word; begin td:=day-rto; xi:=hd;yi:=td; si:=1; if doday=3 then si:=2; for ji:=0 to doday do begin hd:=xi-ji*tyle; circle(hd,td,rto); line(hd+rto,td-rto,hd+rto,td+rto); end; hd:=xi;td:=yi; hd:=hd+culy; end; procedure chu_b; var xi,yi,si,ji:word; begin td:=day-rto; xi:=hd;yi:=td; si:=1; if doday=3 then si:=2; for ji:=0 to doday do begin hd:=xi-ji*tyle; circle(hd,td,rto); line(hd-rto,td-cao,hd-rto,td+rto); end; hd:=xi;td:=yi; hd:=hd+culy; end; procedure chu_c; var xi,yi,si,ji:word; begin td:=day-rto; xi:=hd;yi:=td; si:=1; if doday=3 then si:=2; for ji:=0 to doday do begin hd:=xi-ji*tyle; arc(hd,td,30,330,rto); end; hd:=xi;td:=yi; hd:=hd+culy; end; procedure chu_d; var xi,yi,si,ji:word; begin td:=day-rto; xi:=hd;yi:=td; si:=1; if doday=3 then si:=2; for ji:=0 to doday do begin hd:=xi-ji*tyle; circle(hd,td,rto); line(hd+rto,td-cao,hd+rto,td+rto); end; hd:=xi;td:=yi; hd:=hd+culy; end; procedure chu_de; var xi,yi,si,ji:word; begin td:=day-rto; xi:=hd;yi:=td; si:=1; if doday=3 then si:=2; for ji:=0 to doday do begin hd:=xi-ji*tyle; circle(hd,td,rto); line(hd+rto,td-cao,hd+rto,td+rto); end; hd:=xi; for ji:=0 to doday div 2 do begin td:=yi-ji*tyle; if doday=1 then line(hd+rto+ro,td-cao+rbe,hd+rbe,td-cao+rbe) else line(hd+rto+ro,td-cao+rbe,hd+ro,td-cao+rbe); end; td:=yi; hd:=hd+culy; end; procedure chu_e; var xi,yi,si,ji:word; begin td:=day-rto; xi:=hd;yi:=td; si:=1; if doday=3 then si:=2; for ji:=0 to doday do begin hd:=xi-ji*tyle; arc(hd,td,30,330,rto); line(hd-rto,td,hd+rbe+ro,td-rbe); end; hd:=xi;td:=yi; hd:=hd+culy; end; procedure chu_f; var xi,yi,si,ji:word; begin td:=day-rto; xi:=hd;yi:=td; si:=1; if doday=3 then si:=2; for ji:=0 to doday do begin hd:=xi-ji*tyle; circle(hd+ro,td-ro,ro); line(hd-rto,td-ro,hd-rto,td+cao+rbe); arc(hd-ro,td-ro,0,180,rbe+ro); line(hd-rto-rbe,td+cao-rbe,hd-rto+rbe,td+rto); end; hd:=xi;td:=yi; hd:=hd+9*kichthuoc; end; procedure chu_g; var xi,yi,si,ji:word; begin td:=day-rto; xi:=hd;yi:=td; si:=1; if doday=3 then si:=2; for ji:=0 to doday do begin hd:=xi-ji*tyle; circle(hd,td,rto); line(hd+rto,td-rto,hd+rto,td+cao-rbe); arc(hd,td+rto+rbe,180,360,rto); end; hd:=xi;td:=yi; hd:=hd+culy; end; procedure chu_h; var xi,yi,si,ji:word; begin td:=day-rto; xi:=hd;yi:=td; si:=1; if doday=3 then si:=2; for ji:=0 to doday do begin hd:=xi-ji*tyle; line(hd-rto,td-cao,hd-rto,td+rto); line(hd+rto,td,hd+rto,td+rto); arc(hd,td,0,180,rto); end; hd:=xi;td:=yi; hd:=hd+culy; end; procedure chu_i; var xi,yi,si,ji:word; begin td:=day-rto; xi:=hd;yi:=td; si:=1; if doday=3 then si:=2; for ji:=0 to doday do begin hd:=xi-ji*tyle; line(hd-rto,td-rto,hd-rto,td+rto); circle(hd-rto,td-rto-rbe,(doday+kichthuoc) div 4); end; hd:=xi;td:=yi; hd:=hd+culy div 3; end; procedure chu_isac; var xi,yi,si,ji:word; begin td:=day-rto; xi:=hd;yi:=td; si:=1; if doday=3 then si:=2; for ji:=0 to doday do begin hd:=xi-ji*tyle; line(hd-rto,td-rto,hd-rto,td+rto); ellipse(hd-rbe,td-cao-ro,270,360,ro,rbe); circle(hd-rto,td-rto-rbe,(doday+kichthuoc) div 4); end; hd:=xi;td:=yi; hd:=hd+culy div 3; end; procedure chu_ihuyen; var xi,yi,si,ji:word; begin td:=day-rto; xi:=hd;yi:=td; si:=1; if doday=3 then si:=2; for ji:=0 to doday do begin hd:=xi-ji*tyle; line(hd-rto,td-rto,hd-rto,td+rto); ellipse(hd-rbe,td-cao-ro,180,270,ro,rbe); circle(hd-rto,td-rto-rbe,(doday+kichthuoc) div 4); end; hd:=xi;td:=yi; hd:=hd+culy div 3; end; procedure chu_ihoi; var xi,yi,si,ji:word; begin td:=day-rto;xi:=hd;yi:=td; si:=1; if doday=3 then si:=2; for ji:=0 to doday do begin hd:=xi-ji*tyle; line(hd-rto,td-rto,hd-rto,td+rto); arc(hd-rbe-ro,td-cao-ro,270,360,rbe); arc(hd-rbe,td-cao-ro,0,270,ro); circle(hd-rto,td-rto-rbe,(doday+kichthuoc) div 4); end; hd:=xi;td:=yi; hd:=hd+culy div 3; end; procedure chu_inga; var xi,yi,si,ji:word; begin td:=day-rto; xi:=hd;yi:=td; si:=1; if doday=3 then si:=2; for ji:=0 to doday do begin hd:=xi-ji*tyle; line(hd-rto,td-rto,hd-rto,td+rto); arc(hd-rbe,td-cao,180,360,ro); arc(hd-rto,td-cao,0,180,ro); circle(hd-rto,td-rto-rbe,(doday+kichthuoc) div 4); end; hd:=xi;td:=yi; hd:=hd+culy div 3; end; procedure chu_inang; var xi,yi,si,ji:word; begin td:=day-rto; xi:=hd;yi:=td; si:=1; if doday=3 then si:=2; for ji:=0 to doday do begin hd:=xi-ji*tyle; line(hd-rto,td-rto,hd-rto,td+rto); circle(hd-rto,td+rto+rbe,(doday+kichthuoc) div 4); circle(hd-rto,td-rto-rbe,(doday+kichthuoc) div 4); end; hd:=xi;td:=yi; hd:=hd+culy div 3; end; procedure chu_j; var xi,yi,si,ji:word; begin td:=day-rto; xi:=hd;yi:=td; si:=1; if doday=3 then si:=2; for ji:=0 to doday do begin hd:=xi-ji*tyle; line(hd-rbe,td-rto,hd-rbe,td+cao); arc(hd-rto,td+cao,180,360,rbe); circle(hd-rbe,td-rto-rbe,(doday+kichthuoc) div 4); end; hd:=xi;td:=yi; hd:=hd+culy div 3; end; procedure chu_k; var xi,yi,si,ji:word; begin td:=day-rto; xi:=hd;yi:=td; si:=1; if doday=3 then si:=2; for ji:=0 to doday do begin hd:=xi-ji*tyle; ellipse(hd-rto,td-rto,270,360,cao,rto); ellipse(hd+rto,td,90,180,cao,rto); ellipse(hd+rto+ro,td-rbe,197,270,cao-ro,rto+rbe); line(hd-rto,td-cao,hd-rto,td+rto); end; hd:=xi;td:=yi; hd:=hd+culy; end; procedure chu_l; var xi,yi,si,ji:word; begin td:=day-rto; xi:=hd;yi:=td; si:=1; if doday=3 then si:=2; for ji:=0 to doday do begin hd:=xi-ji*tyle; line(hd-rto,td-cao,hd-rto,td+rbe); arc(hd-rbe,td+rbe,180,360,rbe); end; hd:=xi;td:=yi; hd:=hd+7*kichthuoc; end; procedure chu_m; var xi,yi,si,ji:word; begin td:=day-rto;xi:=hd;yi:=td; si:=1; if doday=3 then si:=2; for ji:=0 to doday do begin hd:=xi-ji*tyle; line(hd-rto,td-rto,hd-rto,td+rto); line(hd+rbe,td-ro,hd+rbe,td+rto); line(hd+cao,td-ro,hd+cao,td+rto); arc(hd-ro,td-ro,0,180,rto-ro); arc(hd+rto+ro,td-ro,0,180,rto-ro); end; hd:=xi;td:=yi; hd:=hd+15*kichthuoc; end; procedure chu_n; var xi,yi,si,ji:word; begin td:=day-rto; xi:=hd;yi:=td; si:=1; if doday=3 then si:=2; for ji:=0 to doday do begin hd:=xi-ji*tyle; line(hd-rto,td-rto,hd-rto,td+rto); line(hd+rto,td,hd+rto,td+rto); arc(hd,td,0,180,rto); end; hd:=xi;td:=yi; hd:=hd+culy; end; procedure chu_o; var xi,yi,si,ji:word; begin td:=day-rto; xi:=hd;yi:=td; si:=1; if doday=3 then si:=2; for ji:=0 to doday do begin hd:=xi-ji*tyle; circle(hd,td,rto); end; hd:=xi;td:=yi; hd:=hd+culy; end; procedure chu_ow; var xi,yi,si,ji:word; begin td:=day-rto; xi:=hd;yi:=td; si:=1; if doday=3 then si:=2; for ji:=0 to doday do begin hd:=xi-ji*tyle; circle(hd,td,rto); arc(hd+rto-ro,td-rto-rbe,270,360,rbe); arc(hd+rto,td-rto-rbe,0,270,ro); end; hd:=xi;td:=yi; hd:=hd+culy; end; procedure chu_p; var xi,yi,si,ji:word; begin td:=day-rto; xi:=hd;yi:=td; si:=1; if doday=3 then si:=2; for ji:=0 to doday do begin hd:=xi-ji*tyle; line(hd-rto,td-rto,hd-rto,td+cao); circle(hd,td,rto); end; hd:=xi;td:=yi; hd:=hd+culy; end; procedure chu_q; var xi,yi,si,ji:word; begin td:=day-rto; xi:=hd;yi:=td; si:=1; if doday=3 then si:=2; for ji:=0 to doday do begin hd:=xi-ji*tyle; line(hd+rto,td-rto,hd+rto,td+cao); circle(hd,td,rto); end; hd:=xi;td:=yi; hd:=hd+culy; end; procedure chu_s; var xi,yi,si,ji:word; begin td:=day-rto; xi:=hd;yi:=td; si:=1; if doday=3 then si:=2; for ji:=0 to doday do begin hd:=xi-ji*tyle; ellipse(hd-ro,td-rbe,0,90,ro+rto,rbe); ellipse(hd+ro,td+rbe,180,270,ro+rto,rbe); arc(hd-rbe,td-rbe,90,207,rbe); arc(hd+rbe,td+rbe,270,390,rbe); line(hd-rbe-ro-ro div 2,td-ro,hd+rbe+ro+ro div 2,td+ro); end; hd:=xi;td:=yi; hd:=hd+culy; end; procedure chu_r; var xi,yi,si,ji:word; begin td:=day-rto; xi:=hd;yi:=td; si:=1; if doday=3 then si:=2; for ji:=0 to doday do begin hd:=xi-ji*tyle; line(hd-rto,td-rto,hd-rto,td+rto); arc(hd,td,30,180,rto); end; hd:=xi;td:=yi; hd:=hd+culy-kichthuoc; end; procedure chu_t; var xi,yi,si,ji:word; begin td:=day-rto; xi:=hd;yi:=td; si:=1; if doday=3 then si:=2; for ji:=0 to doday do begin hd:=xi-ji*tyle; line(hd-rto,td+rbe,hd-rto,td-cao); arc(hd-rbe,td+rbe,180,360,rbe); end; hd:=xi; for ji:=0 to doday div 2 do begin td:=yi-ji*tyle; if doday=1 then line(hd-rto-rbe,td-cao+rbe,hd-rbe-ro,td-cao+rbe) else line(hd-cao+ro,td-cao+rbe,hd-rbe-ro,td-cao+rbe); end; td:=yi; hd:=hd+7*kichthuoc; end; procedure chu_uw; var xi,yi,si,ji:word; begin td:=day-rto; xi:=hd;yi:=td; si:=1; if doday=3 then si:=2; for ji:=0 to doday do begin hd:=xi-ji*tyle; line(hd-rto,td-rto,hd-rto,td); line(hd+rto,td-rto,hd+rto,td+rto); arc(hd,td,180,360,rto); arc(hd+rto+ro,td-rto-rbe,270,360,rbe); arc(hd+rto+rbe,td-rto-rbe,0,270,ro); end; hd:=xi;td:=yi; hd:=hd+culy; end; procedure chu_u; var xi,yi,si,ji:word; begin td:=day-rto; xi:=hd;yi:=td; si:=1; if doday=3 then si:=2; for ji:=0 to doday do begin hd:=xi-ji*tyle; line(hd-rto,td-rto,hd-rto,td); line(hd+rto,td-rto,hd+rto,td+rto); arc(hd,td,180,360,rto); end; hd:=xi;td:=yi; hd:=hd+culy; end; procedure chu_v; var xi,yi,si,ji:word; begin td:=day-rto; xi:=hd;yi:=td; si:=1; if doday=3 then si:=2; for ji:=0 to doday do begin hd:=xi-ji*tyle; line(hd-rto,td-rto,hd-rbe,td+rto); ellipse(hd-rbe,td-rto,270,360,rto+rbe,cao); end; hd:=xi;td:=yi; hd:=hd+culy; end; procedure chu_x; var xi,yi,si,ji:word; begin td:=day-rto; xi:=hd;yi:=td; si:=1; if doday=3 then si:=2; for ji:=0 to doday do begin hd:=xi-ji*tyle; arc(hd-rto,td,270,450,rto); arc(hd+rto,td,90,270,rto); end; hd:=xi;td:=yi; hd:=hd+culy; end; procedure chu_y; var xi,yi,si,ji:word; begin td:=day-rto; xi:=hd;yi:=td; si:=1; if doday=3 then si:=2; for ji:=0 to doday do begin hd:=xi-ji*tyle; line(hd-rto,td-rto,hd-rto,td); line(hd+rto,td-rto,hd+rto,td+cao); arc(hd,td,180,360,rto); arc(hd,td+cao,180,360,rto); end; hd:=xi;td:=yi; hd:=hd+culy; end; procedure khong; var xi,yi,si,ji:word; begin td:=day-rto; xi:=hd;yi:=td; td:=td-rto-rbe; si:=1; if doday=3 then si:=2; for ji:=0 to doday do begin hd:=xi-ji*tyle; ellipse(hd,td+rto,0,360,rto,rto+rbe); end; hd:=xi;td:=yi; hd:=hd+culy; end; procedure chamthan; var xi,yi,si,ji:word; begin td:=day-rto; xi:=hd;yi:=td; td:=td-rto-rbe; si:=1; if doday=3 then si:=2; for ji:=0 to doday do begin hd:=xi-ji*tyle; circle(hd-rto,td+cao+ro,ro); line(hd-rto,td-rbe,hd-rto,td+cao-rbe); end; hd:=xi;td:=yi; hd:=hd+culy; end; procedure haicham; var xi,yi,si,ji:word; begin td:=day-rto; xi:=hd;yi:=td; td:=td-rto-rbe; si:=1; if doday=3 then si:=2; for ji:=0 to doday do begin hd:=xi-ji*tyle; circle(hd-rto,td+cao+ro,ro); circle(hd-rto,td+rbe,ro); end; hd:=xi;td:=yi; hd:=hd+culy; end; procedure tam; var xi,yi,si,ji:word; begin td:=day-rto; xi:=hd;yi:=td; td:=td-rto-rbe; si:=1; if doday=3 then si:=2; for ji:=0 to doday do begin hd:=xi-ji*tyle; ellipse(hd,td,0,360,rbe+ro,rbe); ellipse(hd,td+cao-rbe,0,360,rto,rto); end; hd:=xi;td:=yi; hd:=hd+culy; end; procedure ba; var xi,yi,si,ji:word; begin td:=day-rto; xi:=hd;yi:=td; td:=td-rto-rbe; si:=1; if doday=3 then si:=2; for ji:=0 to doday do begin hd:=xi-ji*tyle; ellipse(hd,td,270,540,rbe+ro,rbe); ellipse(hd,td+cao-rbe,200,450,rto,rto); end; hd:=xi;td:=yi; hd:=hd+culy; end; procedure chin; var xi,yi,si,ji:word; begin td:=day-rto; xi:=hd;yi:=td; td:=td-rto-rbe; si:=1; if doday=3 then si:=2; for ji:=0 to doday do begin hd:=xi-ji*tyle; ellipse(hd,td+rbe,0,360,rto,rto); ellipse(hd,td+cao-rbe,200,360,rto,rto); line(hd+rto,td+rbe,hd+rto,td+cao-rbe); end; hd:=xi;td:=yi; hd:=hd+culy; end; procedure hai; var xi,yi,si,ji:word; begin td:=day-rto; xi:=hd;yi:=td; td:=td-rto-rbe; si:=1; if doday=3 then si:=2; for ji:=0 to doday do begin hd:=xi-ji*tyle; ellipse(hd,td+rbe,0,160,rto,rto); line(hd-rbe-ro div 6,td+cao+ro div 2,hd-rbe+ro div 2,td+cao+ro+ro div 6); ellipse(hd-rbe-ro,td+rbe,270,360,cao-ro,cao); arc(hd-rto+ro,td+cao+ro,35,270,ro); ellipse(hd+ro,td+cao,210,350,rto-ro,rbe); end; hd:=xi;td:=yi; hd:=hd+culy; end; procedure nam; var xi,yi,si,ji:word; begin td:=day-rto; xi:=hd;yi:=td; td:=td-rto-rbe; si:=1; if doday=3 then si:=2; for ji:=0 to doday do begin hd:=xi-ji*tyle; ellipse(hd,td+cao-rbe,200,450,rto,rto); line(hd-rto+ro,td-rbe,hd-rto,td+rbe); line(hd-rto+ro,td-rbe+1,hd+rto-ro,td-rbe+1); line(hd-rto+ro,td-rbe,hd+rto-ro,td-rbe); line(hd-rto,td+rbe+1,hd,td+rbe+1); line(hd-rto,td+rbe,hd,td+rbe); end; hd:=xi;td:=yi; hd:=hd+culy; end; procedure sau; var xi,yi,si,ji:word; begin td:=day-rto; xi:=hd;yi:=td; td:=td-rto-rbe; si:=1; if doday=3 then si:=2; for ji:=0 to doday do begin hd:=xi-ji*tyle; ellipse(hd,td+cao-rbe,0,360,rto,rto); ellipse(hd,td+rbe,20,180,rto,rto); line(hd-rto,td+rbe,hd-rto,td+cao-rbe); end; hd:=xi;td:=yi; hd:=hd+culy; end; procedure mot; var xi,yi,si,ji:word; begin td:=day-rto; xi:=hd;yi:=td; td:=td-rto-rbe; si:=1; if doday=3 then si:=2; for ji:=0 to doday do begin hd:=xi-ji*tyle; ellipse(hd-rto-ro,td-rbe,270,360,rbe,rbe); line(hd-rto+ro,td-rbe,hd-rto+ro,td+cao+rbe); end; hd:=xi;td:=yi; hd:=hd+culy div 2; end; procedure bay; var xi,yi,si,ji:word; begin td:=day-rto; xi:=hd;yi:=td; td:=td-rto-rbe; si:=1; if doday=3 then si:=2; for ji:=0 to doday do begin hd:=xi-ji*tyle; line(hd+ro,td-rbe,hd-rto,td+cao+rbe); line(hd+ro,td-rbe,hd-rto,td-rbe); line(hd+ro,td-rbe+1,hd-rto,td-rbe+1); line(hd+ro,td-rbe+2,hd-rto,td-rbe+2); end; hd:=xi;td:=yi; hd:=hd+8*kichthuoc; end; procedure bon; var xi,yi,si,ji:word; begin td:=day-rto; xi:=hd;yi:=td; td:=td-rto-rbe; si:=1; if doday=3 then si:=2; for ji:=0 to doday do begin hd:=xi-ji*tyle; line(hd+ro,td-rbe,hd+ro,td+cao+rbe); line(hd+rbe,td+cao-rbe,hd-rto,td+cao-rbe); line(hd+rbe,td+cao-rbe+1,hd-rto,td+cao-rbe+1); line(hd+rbe,td+cao-rbe+2,hd-rto,td+cao-rbe+2); line(hd-rto,td+cao-rbe,hd+ro,td-rbe); end; hd:=xi;td:=yi; hd:=hd+culy; end; procedure a_hoa; var xi,yi,si,ji:word; begin xi:=hd;yi:=day-3*rbe; si:=1; if doday=3 then si:=2; for ji:=0 to doday do begin hd:=xi-ji*tyle; line(hd,day-3*rto,hd+rto,day); line(hd,day-3*rto,hd-rto,day); end; for ji:=0 to (doday*tyle) div 2 do begin td:=yi+ji*tyle; line(hd-rbe+ji,td,hd+rbe+ji*tyle,td); end; hd:=xi; hd:=hd+culy+kichthuoc; end; procedure b_hoa; var xi,yi,si,ji,zi:word; begin xi:=hd;yi:=day-3*rbe; si:=1; if doday=3 then si:=2; for ji:=0 to doday do begin hd:=xi-ji*tyle; line(hd-rto,day-3*rto,hd-rto,day); ellipse(hd-rto,day-9*ro,270,450,cao,rto-ro-ji*tyle div 2); ellipse(hd-rto,day-3*ro,270,450,cao,rto-ro-ji*tyle div 2); end; hd:=xi; hd:=hd+culy+kichthuoc; end; procedure c_hoa; var xi,yi,si,ji,zi:word; begin xi:=hd;yi:=day-3*rbe; si:=1; if doday=3 then si:=2; for ji:=0 to doday do begin ellipse(hd-(doday*tyle) div 2,day-3*rbe,30,330, rto+ro div 2-ji*tyle,rto+rbe-ji*tyle div 2); end; hd:=xi; hd:=hd+culy+kichthuoc; end; procedure d_hoa; var xi,yi,si,ji,zi:word; begin xi:=hd;yi:=day-3*rbe; si:=1; if doday=3 then si:=2; for ji:=0 to doday do begin hd:=xi-ji*tyle; line(hd-rto,day-3*rto,hd-rto,day); ellipse(hd-rto,day-3*rbe,270,450,cao,rto+rbe-ji*tyle div 2); end; hd:=xi; hd:=hd+culy+kichthuoc; end; procedure de_hoa; var xi,yi,si,ji,zi:word; begin xi:=hd;yi:=day-3*rbe; si:=1; if doday=3 then si:=2; for ji:=0 to doday do begin hd:=xi-ji*tyle; zi:=tyle*doday; line(hd-rto,day-3*rto,hd-rto,day); line(hd-rto-rbe-ro+ji*tyle,day-3*rbe-ji*tyle+(tyle*doday) div 2, hd-rbe-ro+ji*tyle,day-3*rbe-ji*tyle+(tyle*doday) div 2); ellipse(hd-rto,day-3*rbe,270,450,cao,rto+rbe-ji*tyle div 2); end; hd:=xi; hd:=hd+culy+kichthuoc; end; procedure e_hoa; var xi,si,ji:word; begin xi:=hd; si:=1; if doday=3 then si:=2; for ji:=0 to doday do begin hd:=xi-ji*tyle; line(hd-rto,day-3*rto,hd-rto,day); line(hd-rto+ji*tyle,day-3*rbe-ji*tyle+(doday*tyle) div 2, hd+ji*tyle,day-3*rbe-ji*tyle+(doday*tyle) div 2); line(hd-rto+ji*tyle,day-ji*tyle,hd+rto+ji*tyle,day-ji*tyle); line(hd-rto+ji*tyle,day-3*rto+ji*tyle,hd+rto+ji*tyle,day-3*rto+ji*tyle); end; hd:=xi; hd:=hd+culy+kichthuoc; end; procedure g_hoa; var xi,yi,si,ji,zi:word; begin xi:=hd;yi:=day-3*rbe; si:=1; if doday=3 then si:=2; for ji:=0 to doday do begin ellipse(hd-(doday*tyle) div 2,day-3*rbe,30,360, rto+ro div 2-ji*tyle,rto+rbe-ji*tyle div 2); line(hd,day-3*rbe-ji*tyle+(doday*tyle) div 2, hd+rto,day-3*rbe-ji*tyle+(doday*tyle) div 2); end; hd:=xi; hd:=hd+culy+kichthuoc; end; procedure h_hoa; var xi,si,ji:word; begin xi:=hd; si:=1; if doday=3 then si:=2; for ji:=0 to doday do begin hd:=xi-ji*tyle; line(hd+rto,day-3*rto,hd+rto,day); line(hd-rto,day-3*rto,hd-rto,day); line(hd-rto,day-3*rbe-ji*tyle+(doday*tyle) div 2, hd+rto,day-3*rbe-ji*tyle+(doday*tyle) div 2); end; hd:=xi; hd:=hd+culy+kichthuoc; end; procedure i_hoa; var xi,si,ji:word; begin xi:=hd; si:=1; if doday=3 then si:=2; for ji:=0 to doday do begin hd:=xi-ji*tyle; line(hd-rto,day-3*rto,hd-rto,day); end; hd:=xi; hd:=hd+4*kichthuoc; end; procedure k_hoa; var xi,yi,si,ji,zi:word; begin xi:=hd;yi:=day-3*rbe; si:=1; if doday=3 then si:=2; for ji:=0 to doday do begin hd:=xi-ji*tyle; line(hd-rto,day-3*rto,hd-rto,day); line(hd-rto,day-3*rbe,hd+rto,day); line(hd-rto,day-3*rbe,hd+rto,day-3*rto); end; hd:=xi; hd:=hd+culy+kichthuoc; end; procedure l_hoa; var xi,si,ji:word; begin xi:=hd; si:=1; if doday=3 then si:=2; for ji:=0 to doday do begin hd:=xi-ji*tyle; line(hd-rto,day-ji*tyle,hd+rto+ji*tyle,day-ji*tyle); line(hd-rto,day-3*rto,hd-rto,day); end; hd:=xi; hd:=hd+culy+kichthuoc; end; procedure m_hoa; var xi,si,ji:word; begin xi:=hd; si:=1; if doday=3 then si:=2; for ji:=0 to doday do begin hd:=xi-ji*tyle; line(hd+rto,day-3*rto,hd+rto,day); line(hd-rto,day-3*rto,hd-rto,day); line(hd,day,hd-rto,day-3*rto); line(hd,day,hd+rto,day-3*rto); end; hd:=xi; hd:=hd+culy+kichthuoc; end; procedure n_hoa; var xi,si,ji:word; begin xi:=hd; si:=1; if doday=3 then si:=2; for ji:=0 to doday do begin hd:=xi-ji*tyle; line(hd+rto,day-3*rto,hd+rto,day); line(hd-rto,day-3*rto,hd-rto,day); line(hd+rto,day,hd-rto,day-3*rto); end; hd:=xi; hd:=hd+culy+kichthuoc; end; procedure o_hoa; var xi,yi,si,ji,zi:word; begin xi:=hd;yi:=day-3*rbe; si:=1; if doday=3 then si:=2; for ji:=0 to doday do begin ellipse(hd-(doday*tyle) div 2,day-3*rbe,0,360, rto+ro div 2-ji*tyle,rto+rbe-ji*tyle div 2); end; hd:=xi; hd:=hd+culy+kichthuoc; end; procedure p_hoa; var xi,yi,si,ji,zi:word; begin xi:=hd;yi:=day-3*rbe; si:=1; if doday=3 then si:=2; for ji:=0 to doday do begin hd:=xi-ji*tyle; line(hd-rto,day-3*rto, hd-rto,day); ellipse(hd-rto,day-9*ro,270,450,cao,rto-ro-ji*tyle div 2); end; hd:=xi; hd:=hd+culy+kichthuoc; end; procedure q_hoa; var xi,yi,si,ji,zi:word; begin xi:=hd;yi:=day-3*rbe; si:=1; if doday=3 then si:=2; for ji:=0 to doday do begin ellipse(hd-(doday*tyle) div 2,day-3*rbe,0,360, rto+ro div 2-ji*tyle,rto+rbe-ji*tyle div 2); zi:=xi-ji*tyle; ellipse(zi+rto+ro div 2,day-ro,180,270,rbe,ro); ellipse(zi+ro div 2,day-ro,0,90,rbe,ro); end; hd:=xi; hd:=hd+culy+kichthuoc; end; procedure r_hoa; var xi,yi,si,ji,zi:word; begin xi:=hd;yi:=day-3*rbe; si:=1; if doday=3 then si:=2; for ji:=0 to doday do begin hd:=xi-ji*tyle; line(hd-rto,day-3*rto,hd-rto,day); line(hd-rto,day-3*rbe,hd+rto,day); ellipse(hd-rto,day-9*ro,270,450,cao,rto-ro-ji*tyle div 2); end; hd:=xi; hd:=hd+culy+kichthuoc; end; procedure s_hoa; var xi,yi,si,ji,zi:word; begin xi:=hd;yi:=day-3*rbe; si:=1; if doday=3 then si:=2; for ji:=0 to doday do begin ellipse(hd-(doday*tyle) div 2,day-3*ro,180,435, rto+(doday*tyle) div 2-ji*tyle,rbe+ro-(ji*tyle) div 2); ellipse(hd-(doday*tyle) div 2,day-9*ro,0,255, rto+(doday*tyle) div 2-ji*tyle,rbe+ro-(ji*tyle) div 2); line(hd-(doday*tyle) div 2-ro,day-3*rbe-ro div 2+(ji*tyle) div 2, hd-(doday*tyle) div 2+ro,day-3*rbe+ro div 2-(doday*tyle) div 2+(ji*tyle) div 2); end; hd:=xi; hd:=hd+culy+kichthuoc; end; procedure t_hoa; var xi,si,ji:word; begin xi:=hd; si:=1; if doday=3 then si:=2; for ji:=0 to doday do begin hd:=xi-ji*tyle; line(xi-rto-doday*tyle,day-3*rto+ji*tyle, xi+rto,day-3*rto+ji*tyle); line(hd,day-3*rto,hd,day); end; hd:=xi; hd:=hd+culy+kichthuoc; end; procedure u_hoa; var xi,yi,si,ji,zi:word; begin xi:=hd;yi:=day-3*rbe; si:=1; if doday=3 then si:=2; for ji:=0 to doday do begin zi:=hd-ji*tyle; ellipse(hd-(doday*tyle) div 2,day-3*ro-ro div 2,180,360, rto+(doday*tyle) div 2-ji*tyle,rbe+ro+ro div 2-(ji*tyle) div 2); line(zi-rto,day-3*rto,zi-rto,day-rto+ro); line(zi+rto,day-3*rto,zi+rto,day-rto+ro); end; hd:=xi; hd:=hd+culy+kichthuoc; end; procedure v_hoa; var xi,si,ji:word; begin xi:=hd; si:=1; if doday=3 then si:=2; for ji:=0 to doday do begin hd:=xi-ji*tyle; line(hd+rto,day-3*rto,hd,day); line(hd-rto,day-3*rto,hd,day); end; hd:=xi; hd:=hd+culy+kichthuoc; end; procedure x_hoa; var xi,si,ji:word; begin xi:=hd; si:=1; if doday=3 then si:=2; for ji:=0 to doday do begin hd:=xi-ji*tyle; line(hd+rto,day-3*rto,hd-rto,day); line(hd-rto,day-3*rto,hd+rto,day); end; hd:=xi; hd:=hd+culy+kichthuoc; end; procedure y_hoa; var xi,si,ji:word; begin xi:=hd; si:=1; if doday=3 then si:=2; for ji:=0 to doday do begin hd:=xi-ji*tyle; line(hd+rto,day-3*rto,hd,day-3*rbe); line(hd-rto,day-3*rto,hd,day-3*rbe); line(hd,day,hd,day-3*rbe); end; hd:=xi; hd:=hd+culy+kichthuoc; end; procedure gioi_thieu; var y1,y2,xi,ss:word; begin det:=detect; initgraph(det,ycolet,''); gra:=graphresult; if gra=grok then begin mauchu:=14; setfillstyle(9,4); bar(0,0,getmaxx,getmaxy); setcolor(0); for y1:=0 to 64 do for y2:=0 to 32 do ellipse(y1*10,y2*15,0,360,10,15); ellipse(y1*15,y2*10,0,360,15,10); circle(y1*15,y2*15,15); setcolor(mauchu); kichthuoc:=2;tyle:=1;doday:=3;cochu;batdau; xuongdong; for ss:=0 to 9 do cach; c_hoa;chu_h;chu_uw;chu_ow;chu_n;chu_g;cach; chu_t;chu_r;chu_ihuyen;chu_n;chu_h;cach; chu_c;chu_h;chu_uw;nga;cach;chu_k;chu_y;sac;cach; chu_s;chu_o;mu;sac;xuongdong; mauchu:=15;setcolor(mauchu); kichthuoc:=6;tyle:=3;doday:=3;cochu; xuongdong; cach;cach;cach;cach;e_hoa;l_hoa;g_hoa;a_hoa;m_hoa;a_hoa; mauchu:=10;setcolor(mauchu); kichthuoc:=1;tyle:=1;doday:=1;cochu; for ss:=0 to 4 do xuongdong; for ss:=0 to 25 do cach; n_hoa;chu_g;chu_uw;chu_ow;huyen;chu_i;cach; chu_t;chu_h;chu_uw;nang;chu_c;cach; chu_h;chu_i;chu_e;mu;nang;chu_n;haicham;cach; b_hoa;chu_u;huyen;chu_i;cach;l_hoa;chu_e;mu;cach; t_hoa;chu_r;chu_u;chu_n;chu_g;xuongdong; for ss:=0 to 25 do cach; l_hoa;chu_ow;sac;chu_p;cach;b_hoa;hai;phay;cach; k_hoa;chu_h;chu_o;sac;chu_a;cach;i_hoa;i_hoa;phay;cach; k_hoa;chu_h;chu_o;chu_a;cach;c_hoa;n_hoa;t_hoa;t_hoa;phay;cach; de_hoa;chu_a;nang;chu_i;cach;h_hoa;chu_o;nang;chu_c; cach;de_hoa;chu_o;mu;chu_n;chu_g;cach;de_hoa;chu_o;mu; readln; closegraph; end else begin textbackground(1);textcolor(15); writeln('graphics error:',grapherrormsg(gra)); end; end; procedure ket_thuc; var y1,y2,xi,ss:word; begin det:=detect; initgraph(det,ycolet,''); gra:=graphresult; if gra=grok then begin mauchu:=14; setfillstyle(9,9); bar(0,0,getmaxx,getmaxy); setcolor(1); for y1:=0 to 64 do for y2:=0 to 32 do ellipse(y1*10,y2*15,0,360,10,15); ellipse(y1*15,y2*10,0,360,15,10); circle(y1*15,y2*15,15); setcolor(14); kichthuoc:=3;tyle:=1;doday:=4;cochu;batdau; for ss:=0 to 1 do xuongdong; k_hoa;chu_isac;chu_n;chu_h;cach;chu_c;chu_h;chu_u;sac;chu_c;cach;xuongdong; chu_c;chu_a;sac;chu_c; cach;chu_t;chu_h;chu_a;mu;huyen;chu_y;cach;chu_c;chu_o;mu;cach; chu_m;chu_a;nang;chu_n;chu_h;cach; chu_k;chu_h;chu_o;chu_e;hoi;xuongdong; xuongdong; kichthuoc:=1;tyle:=1;doday:=1;cochu; for ss:=0 to 22 do cach; h_hoa;chu_a;huyen;cach;chu_n;chu_o;mu;nang;chu_i;cach; chu_t;chu_h;chu_a;sac;chu_n;chu_g;cach;sau;cach; chu_n;chu_aw;chu_m;cach;hai;khong;khong;khong;xuongdong; readln; closegraph; end else begin textbackground(1);textcolor(15); writeln('graphics error:',grapherrormsg(gra)); end; end; const max_sl=100; {p330 la so nguyen to manh viet theo he Hexa} p330:array[0..41] of byte=( $1f,$14,$5f,$08,$c4,$58,$f8,$2f,$b5,$e4,$3a,$eb,$e6,$1c, $ae,$5d,$51,$ce,$f2,$c7,$9b,$8c,$5b,$ca,$dc,$24,$67,$72, $09,$97,$7f,$25,$37,$5f,$50,$57,$96,$ec,$f3,$9f,$7a,$03); type sl=array[0..max_sl-1] of byte; const ng_to:sl= ( $1f,$14,$5f,$08,$c4,$58,$f8,$2f,$b5,$e4,$3a,$eb,$e6,$1c,$ae, $5d,$51,$ce,$f2,$c7,$9b,$8c,$5b,$ca,$dc,$24,$67,$72,$09,$97, $7f,$25,$37,$5f,$50,$57,$96,$ec,$f3,$9f,$7a,$03,$00,$00,$00, $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00, $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00, $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00, $00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ); ng_thuy:sl= ( $05,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00, $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00, $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00, $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00, $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00, $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00, $00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ); { Ham tinh byte khac 0 cao nhat cua x } function lon_hon_sl(x,y:sl):boolean; var i:word; begin i:=max_sl-1; while ((i>0) and (x[i]=y[i])) do i:=i-1; lon_hon_sl:=(x[i]>y[i]); end; function bang_nhau_sl(x,y:sl):boolean; var i:word; begin i:=max_sl-1; while ((i>0) and (x[i]=y[i])) do i:=i-1; bang_nhau_sl:=(x[i]=y[i]); end; function do_dai_sl(x:sl):word; var i:word; begin i:=max_sl-1; while ((i>0) and (x[i]=0)) do i:=i-1; do_dai_sl:=i; end; procedure tru_sl(x,y: sl;var hieu:sl); var w:integer; i,nho:word; begin fillchar(hieu,max_sl,0); nho:=0; for i:=0 to do_dai_sl(x) do begin w:=x[i]; w:=w-y[i]; w:=w-nho; if (w<0) then begin w:=w+256; nho:=1; end else nho:=0; hieu[i]:=w; end; end; { Thu tuc tinh y:=x+1 } {procedure cong_1_sl(x:sl; var y:sl); var i:byte; begin y:=x; i:=0; while (y[i]=255) do begin y[i]:=0; i:=i+1; end; y[i]:=y[i]+1; end;} procedure cong_sl(x,y:sl;var tong:sl); var i,n,j: integer; nho:integer; begin fillchar(tong,max_sl,0); n:=do_dai_sl(x); j:=do_dai_sl(y); if (n<j) then n:=j; nho:=0; for i:=0 to n do begin nho:=nho+x[i]+y[i]; tong[i]:=nho; nho:=nho shr 8; end; tong[n+1]:=nho; end; procedure nhan_word_sl(b:word;x:sl; var tich:sl); var w,nho:longint; i,j:word; begin fillchar(tich,max_sl,0); nho:=0; j:=do_dai_sl(x); for i:=0 to j do begin w:=b; w:=w*x[i]; w:=w+nho; tich[i]:=w; nho:=w shr 8; end; while (nho>0) do begin j:=j+1; tich[j]:=nho; nho:=nho shr 8; end; end; procedure dich_trai_sl(x:sl;l:byte;var y:sl); var j,i:word; begin fillchar(y,max_sl,0); for i:=l to do_dai_sl(x)+l do y[i]:=x[i-l]; end; procedure nhan_sl(x,y:sl; var tich:sl); var i:word; u,v:sl; begin fillchar(tich,max_sl,0); for i:=0 to do_dai_sl(y) do begin dich_trai_sl(x,i,u); nhan_word_sl(y[i],u,v); cong_sl(tich,v,u); tich:=u; end; end; procedure dich_phai_sl(x:sl;l:byte;var y:sl); var i:word; begin fillchar(y,max_sl,0); for i:=l to do_dai_sl(x) do y[i-l]:=x[i]; end; function chia_word_sl(x:sl; a:word;var y:sl; var du:word):boolean; var l,m:longint; i:byte; begin if (a0) then begin fillchar(y,max_sl,0); l:=0; for i:=do_dai_sl(x) downto 0 do begin l:=l shl 8; l:=l+x[i]; y[i]:=l div a; l:=l mod a; end; du:=l; chia_word_sl:=(du=0); end else chia_word_sl:=false; end; procedure chia0_sl(x,y:sl;var thuong:byte;var du:sl); var l:longint; w:word; n:byte; u,v:sl; begin if (lon_hon_sl(y,x)) then begin thuong:=0;du:=x; end else begin n:=do_dai_sl(y); w:=y[n];w:=w shl 8;w:=w+y[n-1]; l:=x[n+1];l:=l shl 8;l:=l+x[n];l:=l shl 8;l:=l+x[n-1]; l:=l div w; if (l>255) then thuong:=255 else thuong:=l; nhan_word_sl(thuong,y,u); if (lon_hon_sl(u,x)) then begin thuong:=thuong-1; tru_sl(u,y,v); u:=v; end; tru_sl(x,u,du); end; end; procedure xem_sl(kq:sl); var i,j:byte; begin for j:=0 to do_dai_sl(kq) do write(kq[j]:4);writeln; end; function chia_sl(x,y:sl;var thuong,du:sl):boolean; var i,p,l:integer; tg:word; k:sl; ok:boolean; begin fillchar(thuong,max_sl,0); fillchar(du,max_sl,0); if (lon_hon_sl(y,x)) then begin du:=x; end else begin l:=do_dai_sl(x)-do_dai_sl(y); dich_phai_sl(x,l,du); for i:=l downto 1 do begin chia0_sl(du,y,thuong[i],k); dich_trai_sl(k,1,du); du[0]:=x[i-1]; end; chia0_sl(du,y,thuong[0],k); du:=k; end; chia_sl:=((do_dai_sl(du)=0) and (du[0]=0)); end; procedure nhan_modulo_sl(x,y,n:sl; var tich_mod:sl); var tich,thuong:sl; begin nhan_sl(x,y,tich); chia_sl(tich,n,thuong,tich_mod); end; procedure luy_thua_sl(x,e,n:sl;var luy_thua:sl); var i,j:byte; trung_gian:sl; begin fillchar(luy_thua,max_sl,0); luy_thua[0]:=1; for i:=do_dai_sl(e) downto 0 do begin for j:=7 downto 0 do begin nhan_modulo_sl(luy_thua,luy_thua,n,trung_gian); luy_thua:=trung_gian; if odd(e[i] shr j) then begin nhan_modulo_sl(luy_thua,x,n,trung_gian); luy_thua:=trung_gian; end; end; end; end; { Thu tuc tao ngau nhien so y < x} procedure tao_ngau_nhien_sl(x:sl;var y:sl); var i,k:byte; begin fillchar(y,max_sl,0); k:=do_dai_sl(x); for i:=0 to k-1 do begin y[i]:=random(256); end; y[k]:=random(x[k]); end; procedure uoc_chung_lon_nhat_sl(x,y:sl;var ucln:sl); var u,v,q,r:sl; begin u:=x;v:=y; chia_sl(u,v,q,r); while ((do_dai_sl(r)>0) or (r[0]>0)) do begin u:=v; v:=r; chia_sl(u,v,q,r); end; ucln:=v; end; function nguyen_to_cung_nhau_sl(x,y:sl):boolean; var z:sl; begin uoc_chung_lon_nhat_sl(x,y,z); nguyen_to_cung_nhau_sl:=((do_dai_sl(z)=0) and (z[0]=1)); end; { Cho x va y thoa man gcd(x,y)=1, tinh z thoa man xz=1 mod y } procedure nghich_dao_sl(x,y:sl;var nghich_dao:sl); var u,u1,u2,q,r,v,u3,v3:sl; dau:boolean; begin dau:=false; fillchar(u1,max_sl,0); u2:=u1; u2[0]:=1; u3:=x; v3:=y; while ((do_dai_sl(v3)>0) or (v3[0]>0)) do begin chia_sl(u3,v3,q,r); nhan_sl(u1,q,u); cong_sl(u,u2,v); u3:=v3; v3:=r; u2:=u1; u1:=v; dau:=not dau; end; if dau then tru_sl(y,u2,nghich_dao) else nghich_dao:=u2; end; type ten_file=string[50]; var f,g:file; hash:sl; file_goc,file_ky:ten_file; procedure tom_luoc(st:ten_file;b:byte); var l,m,n,i,j:longint; kq:word; dem:sl; begin fillchar(hash,max_sl,0); assign(f,st); reset(f,1); l:=filesize(f); if (b=1) then l:=l-3*42; m:=l div 40; n:=l mod 40; for i:=1 to m do begin blockread(f,dem,40,kq); for j:=0 to 39 do hash[j]:=hash[j] xor dem[j]; end; if (n>0) then begin blockread(f,dem,n,kq); for j:=0 to n-1 do hash[j]:=hash[j] xor dem[j]; end; close(f); end; procedure ky(file_goc,file_ky:ten_file); var a,p,p_1,x,y,z,k,u:sl; bm,ck,ky1,ky2:sl; ok:boolean; l,m,n,i,j:longint; kq:word; buffer:array[0..1023] of byte; b:byte; st,st1:string[50]; begin st:=file_goc; b:=0; tom_luoc(st,b); st1:=file_ky; assign(f,st); reset(f,1); assign(g,st1); rewrite(g,1); seek(f,0); l:=filesize(f); m:=l div 1024; n:=l mod 1024; for i:=1 to m do begin blockread(f,buffer,1024,kq); blockwrite(g,buffer,1024,kq); end; if (n>0) then begin blockread(f,buffer,n,kq); blockwrite(g,buffer,n,kq); end; close(f); p_1:=ng_to; p_1[0]:=p_1[0]-1; { Tao so mu bi mat } tao_ngau_nhien_sl(ng_to,bm); { Tinh so cong khai } luy_thua_sl(ng_thuy,bm,ng_to,ck); blockwrite(g,ck,42,kq); ok:=false; while not ok do begin tao_ngau_nhien_sl(p_1,k); ok:=nguyen_to_cung_nhau_sl(p_1,k); end; luy_thua_sl(ng_thuy,k,ng_to,ky1); nghich_dao_sl(k,p_1,y); nhan_modulo_sl(bm,ky1,p_1,z); blockwrite(g,ky1,42,kq); if not lon_hon_sl(z,hash) then tru_sl(hash,z,x) else begin cong_sl(p_1,hash,u); tru_sl(u,z,x); end; nhan_modulo_sl(y,x,p_1,ky2); blockwrite(g,ky2,42,kq); close(g); end; function kiem_tra(file_ky:ten_file):boolean; var p_1,x,y,v1,v2:sl; bm,ck,ky1,ky2:sl; ok:boolean; l:longint; kq:word; b:byte; st:string[50]; begin fillchar(ck,max_sl,0); fillchar(ky1,max_sl,0); fillchar(ky2,max_sl,0); b:=1; st:=file_ky; tom_luoc(st,b); assign(f,st); reset(f,1); l:=filesize(f); seek(f,l-3*42); blockread(f,ck,42,kq); blockread(f,ky1,42,kq); blockread(f,ky2,42,kq); close(f); p_1:=ng_to; p_1[0]:=p_1[0]-1; ok:=not ((do_dai_sl(ky1)=0) and (ky1[0]=1)) or (lon_hon_sl(ky1,p_1)); if ok then begin luy_thua_sl(ck,ky1,ng_to,x); luy_thua_sl(ky1,ky2,ng_to,y); nhan_modulo_sl(x,y,ng_to,v1); luy_thua_sl(ng_thuy,hash,ng_to,v2); ok:=bang_nhau_sl(v1,v2); end; kiem_tra:=ok; end; function giao_dien:byte; var y1,y2,xi,ss:word; b:byte; st:string[50]; ok:boolean; begin det:=detect; initgraph(det,ycolet,''); gra:=graphresult; if gra=grok then begin mauchu:=14; setfillstyle(8,5); bar(0,0,getmaxx,getmaxy); setfillstyle(1,2); bar(150,150,500,300); setcolor(mauchu); kichthuoc:=1;tyle:=1;doday:=1;cochu; batdau; for ss:=0 to 7 do xuongdong; for ss:=0 to 22 do cach; k_hoa;chu_y;sac; setcolor(15);phay;cach;setcolor(mauchu); k_hoa;chu_i;chu_e;mu;hoi;chu_m;cach;chu_t;chu_r;chu_a;cach; setcolor(15);chu_h;chu_a;chu_y;cach; setcolor(mauchu);t_hoa;chu_h;chu_o;chu_a;sac;chu_t; setcolor(15);haicham; moveto(415,222);outtext('*********'); textcolor(15);gotoxy(53,14);readln(st); if (st='ky') then b:=0 else begin if (st='kiem tra') then b:=1 else b:=100; end; closegraph; end else begin textbackground(1);textcolor(15); writeln('graphics error:',grapherrormsg(gra)); end; giao_dien:=b; end; procedure giao_dien_ky; var y1,y2,xi,ss:word; st:string[50]; ok:boolean; begin det:=detect; initgraph(det,ycolet,''); gra:=graphresult; if gra=grok then begin mauchu:=13; setfillstyle(7,4); bar(0,0,getmaxx,getmaxy); setfillstyle(1,14); bar(150,130,500,300); setcolor(mauchu); kichthuoc:=1;tyle:=1;doday:=1;cochu; batdau; for ss:=0 to 6 do xuongdong; for ss:=0 to 22 do cach; day:=day-5; n_hoa;chu_h;chu_a;mu;nang;chu_p;cach; chu_f;chu_i;chu_l;chu_e;cach;chu_c;chu_a;mu;huyen;chu_n; cach;chu_k;chu_y;sac;cach;chu_l;chu_a;huyen;haicham; xuongdong;xuongdong; day:=day+13; for ss:=0 to 22 do cach; de_hoa;chu_aw;nang;chu_t;cach;chu_t;chu_e;mu;chu_n;cach; chu_c;chu_h;chu_o;cach;chu_f;chu_i;chu_l;chu_e;cach; chu_k;chu_y;sac;haicham; setcolor(0);moveto(385,190);outtext('***********'); gotoxy(50,12);readln(file_goc); setcolor(0);moveto(385,254);outtext('***********'); gotoxy(50,16);readln(file_ky); ky(file_goc,file_ky); closegraph; end else begin textbackground(1);textcolor(15); writeln('graphics error:',grapherrormsg(gra)); end; end; function giao_dien_kiem_tra:boolean; var y1,y2,xi,ss:word; st:string[50]; ok:boolean; begin det:=detect; initgraph(det,ycolet,''); gra:=graphresult; if gra=grok then begin mauchu:=15; setfillstyle(7,4); bar(0,0,getmaxx,getmaxy); setfillstyle(1,9); bar(120,175,500,260); setcolor(mauchu); kichthuoc:=1;tyle:=1;doday:=1;cochu; batdau; for ss:=0 to 7 do xuongdong; for ss:=0 to 18 do cach; n_hoa;chu_h;chu_a;mu;nang;chu_p;cach; chu_f;chu_i;chu_l;chu_e;cach;chu_c;chu_a;mu;huyen;chu_n; cach;chu_k;chu_i;chu_e;mu;hoi;chu_m;cach;chu_t;chu_r;chu_a; cach;haicham; setcolor(0);moveto(382,220);outtext('***********'); gotoxy(49,14);readln(file_ky); ok:=kiem_tra(file_ky); closegraph; end else begin textbackground(1);textcolor(15); writeln('graphics error:',grapherrormsg(gra)); end; giao_dien_kiem_tra:=ok; end; VAR a:byte; ok:boolean; BEGIN gioi_thieu; randomize; a:=giao_dien; while (a<2) do begin if (a=0) then begin giao_dien_ky; a:=giao_dien; end else if (a=1) then begin ok:=giao_dien_kiem_tra; gotoxy(20,13); if ok then write('File kiem tra khong bi thay doi') else write(' File kiem tra da bi thay doi '); readln; a:=giao_dien; end; end; ket_thuc; END.

Các file đính kèm theo tài liệu này:

  • docBLT-CKS3.doc