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
45 trang |
Chia sẻ: oanhnt | Lượt xem: 1932 | Lượt tải: 4
Bạn đang xem trước 20 trang tài liệu Luận văn Mô phỏng chương trình chữ kí số elgamal trên văn bản điện tử, để xem tài liệu hoàn chỉnh 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 d