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ô...
45 trang |
Chia sẻ: hunglv | Lượt xem: 1431 | Lượt tải: 0
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:
- BLT-CKS3.doc