Tải bản đầy đủ (.doc) (14 trang)

VẤN ĐỀ TÍNH TOÁN SỐ LỚN TRÊN MÁY TÍNH.doc

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (98 KB, 14 trang )

Modulo số Hệ mật RSA
Chơng II :
Vấn đề tính toán số lớn trên máy tính
I. Các vấn đề khai báo số lớn và các phép toán cơ
bản trên máy tính.
1. Khai báo số lớn:
Nh đã trình bày trong những phần trớc hệ mật RSA của chúng ta chỉ
làm việc trên số nguyên tố. Hơn nữa để hệ mật của chúng ta an toàn thì
nhất thiết các số nguyên tố của chúng ta phải đủ lớn làm cho các thuật
toán phân tích hữu hiệu nhất cũng không có khả năng phân tích. Trong
phần này em xin trình bày một cách khai báo số lớn trên để làm việc trên
máy tính.
Nh chúng ta biết ngôn ngữ C++ là một ngôn ngữ khá mạnh trong
công cụ lập trình và nó hỗ trợ rất nhiều kiểu dữ liệu khác nhau nh int,
char, float.... Nhng trong hệ mật RSA muốn bảo mật thì chúng phải làm
việc trên số nguyên tố lớn nếu chúng ta sử dụng cách khai báo thông th-
ờng thì không thể đáp ứng đợc, chẳng hạn nếu ta dùng kiểu số nguyên
(int) thì ta chỉ có thể khai báo các số từ -32769 đến 32767, hoặc khai báo
theo kiểu số thực (float hoặc double) thì số lợng số mũ cũng có thể đáp
ứng đợc nhng kết quả lại không chính xác mà hệ mật của chúng ta lại
yêu cầu độ chính xác rất cao. Vì vậy, ta không thể sử dụng các kiểu dữ
liệu chuẩn đợc mà phải tự tạo ra kiểu dữ liệu mới để chứa kết quả. Cách
tốt nhất là ta khai báo dới dạng mảng để chứa các chữ số. Trong đó với
mỗi phần tử mảng sẽ chứa một số các chữ số. Sau đây là cách khai báo số
lớn dùng trong chơng trình:
15
Modulo số Hệ mật RSA
#define C_max 200
typedef unsigned short WORD;
typedef WORD So_Lon[C_max];
2. Cách phép toán cơ bản trong trờng dữ liệu.


Sau khi tạo ra kiểu dữ liệu rồi, ta phải định nghĩa các thao tác trên
kiểu dữ liệu này. Nh chúng ta đã biết, mọi phép toán số học đều đợc định
nghĩa qua các phép toán sau đây: Cộng, trừ, nhân, chia và so sánh hai số.
Nhng trong hệ mật RSA ta chỉ quan tâm đến các phép toán công, trừ,
nhân và phép so sánh. Sau đây là việc phân tích các thủ tục đó:
a. Thủ tục cộng:
Để cộng hai số biểu diễn dới dạng mảng So_Lon ta thực hiện các thao
tác sau đây : Lần lợt cộng các phần tử tơng ứng của mảng So_Lon lần lợt
từ các phần tử biểu diễn hàng thấp nhất với một byte đợcgọi là byte
nhớ. Byte này xuất phát đợc gán bằng 0 và sau mỗi bớc nó sẽ đợc xác
định tuỳ theo việc tính tổng của các phần tử trên còn thuộc hay ngoài
phạm vi khai báo của phần tử mảng So_Lon.
Sau đây là thủ tục cài đặt trong môi trờng C :
void cong_SL(So_Lon x, So_Lon y)
{int i,nho=0,d=do_dai_SL(x),c=do_dai_SL(y);
if (c>d) d=c;
for (i=0;i<=d;i++)
{x[i]+=y[i];
x[i]+=nho;
if (x[i]<y[i]) nho=1;
else
if (x[i]>y[i]) nho=0;
}
x[d+1]=nho;
}
16
input x,y
nho=0;d=do_dai_SL
(x)
i=0; c=do_dai_SL(y)

c>d
d=c
i<d
x[i]+=y[i];
x[i]+=nho;
x[i]<
y[i]
x[i]>y
[i]
Tru
e
nho=1
nho=0
x[d+1]=nh
o
Fals
e
True
True
Fals
e
True
Sơ đồ khối phép cộng trong trường DL
So_Lon
Modulo số Hệ mật RSA
b. Thủ tục trừ:
Đối với thủ tục trừ số lớn sẽ đợc thực hiện tơng tự nh thủ tục cộng ta
chỉ cần thay phép cộng trong thủ tục cộng bằng phép trừ cho thủ tục trừ.
Sau đây là thủ tục trừ đã đợc cài đặt trong chơng trình:
void tru_SL(So_Lon x, So_Lon y)

{int i,nho=0,d=do_dai_SL(x);
for (i=0;i<=d;i++)
{if (x[i]>y[i])
{x[i]-=y[i];
x[i]-=nho;
nho=0;
}
17
Modulo số Hệ mật RSA
else
{if (x[i]==y[i]) x[i]=0-nho;
else
{x[i]-=nho;
x[i]-=y[i];
nho=1;
}
}
}
}
c. Thủ tục so sánh:
Trong thủ tục so sánh hai mảng So_Lon ta làm theo trình tự ngợc lại,
tức là lần lợt xét sự bằng nhau của các phần tử tơng ứng bắt đầu từ phần
tử biểu diễn hàng cao nhất cho đến khi tìm ra vị trí khác nhau. Kết luận
lớn hay bé của hai mảng So_lon tơng đơng kết luận tơng ứng của hai
phần tử cuối này.
Thủ tục cài đặt:
int be_hon_SL(So_Lon x,So_Lon y)
{int i=C-1;
while (x[i]==y[i] && (i>0)) i--;
return (x[i]<y[i]);

}
int bang_nhau_SL(So_Lon x,So_Lon y)
{return (!be_hon_SL(x,y)&&!be_hon_SL(y,x));
}
d. Thủ tục nhân
18
Modulo số Hệ mật RSA
Để nhân hai số kiểu So_Lon với nhau ta không thể dùng phơng pháp
nhân thông thờng mà ta cần phải định nghĩa phép nhân cho nó. ở đây em
muốn nhắc đến một phơng pháp nhân mà tất cả chúng ta đã đợc học khi
còn học phổ thông, đó là phép nhân dọc. Đây là một phép toán rất phổ
thông, em xin nêu một thí dụ nhỏ sau mô tả phép toán nhân dọc nhằm đa
ra cơ sở để định nghĩa phép toán cho kiểu dữ liệu đợc khai báo ở trên :
Chúng ta thấy phơng pháp nhân trên đợc thực hiên bởi các tao tác sau :
Lấy lần lợt phần tử của số hạng thứ hai nhân với tất cả các phân
tử của số hạng thứ nhất.
Dịch trái một số bớc phù hợp
Cộng hai kết quả nhân trên lại
Theo phần trình bày ở trên kiểu dữ liệu của chúng ta là một mảng số
nên ta có thể áp dụng phơng pháp nhân trên cho kiểu dữ liệu của chúng ta
nh sau:
Ta coi mỗi phần tử trong mảng So_Lon nh là một chữ số trong hai
số hạng trên và sử dụng một byte làm số nhớ, ban đầu gán giá trị 0
cho số nhớ.
Thực hiện nhân từng phần tử của một số hạng với toàn bộ phần tử
của mảng còn lại, sau đó cộng với số nhớ, đợc kết quả đem chia cho
19
234
x42
468

+ 936
9828

×