Các hệ mật mã khoá công khai, các lược dồ chữ ký số sẽ là không an toàn nếu tồn tại một thuật toán phân tích khoá công khai đê tìm lại được khoá bí mật thực hiện trong thời gian đa thức. Điều này là có thế, nếu các hệ mật này sử dụng tham số bé. Chính vì vậy, đê đảm bào độ an toàn, các hệ thống mật mã khoá công khai, các lược đồ chữ ký số .. đều sử dụng các tham số bí mật là các sổ nguyên tố rất lớn (có tới hàng trăm chữ so thập phân). Điều này có nghĩa là, độ an toàn của các hệ mật này là phụ thuộc vảo độ phức tạp tính toán.
Một bài toán tính toán được coi ià dễ nếu nó có thể giải được trong thời gian đa thức. Nói cách khác, nếu tồn tại một thuật toán giải bài toán trong thời gian đa thức với tất cả các dừ liệu vào thì có thề xem hệ mật là không an toàn.
Vì vậy, trước khi bắt đầu bài toán tấn công giao thức yếu sử dụng hệ mật mà khoá công khai, chúng ta phải xem xét đến việc biếu diễn các số nguyên lớn trong máy tính, cùng các thuật toán số học cơ bản làm việc với các sô nguyên lớn (vì chỉ có sự trợ giúp cùa máy tính điện tử thì mới có thể thực hiện được các giao thức này).
Ĩ ra n g 4 5
Chúng ta đều biết số nguyên lớn nhất lưu trừ được trong máy tính với dạng biểu diễn thông thường khôrm thế đảm báo được độ an toàn cho các hệ mật (vì chi cần một phương pháp phân tích thô sơ là ta đà có thê tim được các thừa số nguyên tố của nó). Do đó vấn đề biểu diễn và lưu trữ số lớn được đặt ra (để cho tiện, ta qui ước gọi các sổ nguyên dương lớn có hàng trăm chữ số là số lớn).
Có nhiều cách để biểu diễn, và lưu trừ sổ nguyên dương. Cách thông dụng nhất là biếu diễn ớ hệ cơ số 0=10. Ví dụ: a = 123 ở hệ cơ số 10 có nghĩa là: a = 1.1 o2 + 2.1 o1 + 3.10°. Một cách tổng quát, cho số nguyên dương b > 2 khi đó mọi sổ nguyên dương bất kỳ a đều có biểu diễn duy nhất dạng:
a = an_i . b" ' 1 + an_2 . bn' 2 +...+ ai . b + a0 ; và thường được viết dưới dạng:
a = ( a n - l ••• a l a o ) b í
nếu b = 1 0 thì biếu diễn này được viết là: a = (an.| ... ai a<))io ;
Vấn đề xuất hiện khi a là số có hàng trăm chữ số, khi đó tổng: an.| . blH + an.2. b11’2 +...+ ai . b + a0
sè vượt quá giới hạn lưu trừ của số nguyên trong máy tính. Có nhiều cách đế giải quyết vấn đề này. Một trong những cách đó là sử dụng biến kiểu xâu kí tự có dộ dài đú lớn đế biếu diễn và lưu trữ các hệ sổ của số lớn (được biểu diền ờ hệ cơ số b, 2 < b < 256). Cách biểu diễn tuân theo qui tắc sau:
Cho một số lớn, n+] chữ sổ biếu diễn ở hệ cơ số b, có dạng: A = (an ... aI au)b khi đó ta dùng xâu kí tự s có độ dài là n+l kí tự để biễu diễn a theo cách:
chừ số a<) được lưu vào phần tứ sịOj, chừ số aj được lưu vào phân tử s[l J,
chừ sổ an được lưu vào phần từ s[n],
Đe cho tiện trình bày, ta qui ước khi nói cho số lớn A thì ta hiểu A là xâu kí tự, các phần tử của xâu lun trữ các hệ số của sổ lớn đã cho (biểu diễn ở hệ cơ số b) một cách tương ứng.
Giả sử ta đang biểu diễn số ở hệ cơ số c nào đó (c = 10 chắng hạn) và việc tính toán được thực hiện theo cơ sô c. Sau đây là thuật toán chuyến số nguyên dương sang dạng biểu diền ở hệ c ơ số b:
Input: số nguyên dương A, số nguyên clương b; A>0; 2 < b <256; Output: biêu diễn ở hệ cơ số b của A = (a„... a] a0)b ; n > 0; a„ * 0.
1. i = 0; X = A; q ; a, = X - q.b; 2. while (q > 0) 2.1 i = i + l ; x = q ; q = X ~b ; a i = X - q . b ;
I r a n g 4 7
3.3. CÁC THUẬT TOÁN TÍNH TOÁN SỚ CỠ LỚN 3.3.1 Môt số khái niêm • •
- Tập các số nguyên {..., -3, -2, -l, 0, 1,2, 3...} dược kí hiệu là z.
- Cho a, b là hai số nguyên, a được gọi là ước cua b nếu tồn tại một số nguyên c sao cho b = a.c. Nếu a là ước của b thì ta kí hiệu là: a|b.
- Với mọi a, b và c e z, ta có: 1. a I a.
2. nếu a I b và b I c, thì a I c.
3 . n ế u a I b v à a I c , t h ì a I ( b . x + c . y ) v ớ i X , y € z .
4. nếu a I b và b I a, thì a = ± b.
Gọi q và r lần lượt là phần nguyên và phần dư của phép chia a cho b, ta có: a = q.b + r; 0< r <b. q và r là duy nhất và ta kí hiệu:
q = a div b; r = a mod b.
Sổ nguyên c được gọi là ước số chung của a và b nếu c I a và c I b.
Số nguyên k hông âm d được gọi là ước số chune; lớn nhất của a và b, kí
hiệu là d = gcd(a, b), nếu d là ước số chung của a và b; và nếu c là ước số chime của a và b thì c I d.
Số nguyên không âm d được gọi là bội số chung nhỏ nhất của a và b, kí hiệu !à d = lcm(a, b), nếu a I d và b I d; và nếu a Ị c và b I c, thì d I c.
Hai số nguyên a và b được gọi lả nguyên tổ cùng nhau nếu ước số chung lớn nhất cua chúng bàng 1 (gcd(a, b) = 1 ).
Số nguyên p > 2 được gọi là số nguyên tố nếu nó chỉ có ước là 1 và p; nuược lại p được gọi là hợp sô.
Kí hiêu 7ĩ(x) là số các số nguyên tố < X, ta có lim — —- =1 khỉ x ^ c o .
xì\r\x
Mọi số nguyên n > 2 đều phân tích được thành tích của các thừa sổ nguyên tố dạng: n = P\' ■ p? —pịk > trong đó p, là các số nguyên tố khác nhau, Cj là các số nạuyên, và phân tích này là duy nhất.
K í hiệu số các số nguyên trong khoảng (1, n) nguyên tố cùng nhau với n là ộ(n), ộ(n) = {x: gdc(x,n) = 1; 0 < X < n-1}
Trong các thuật toán tính toán sổ cờ lớn[2J sau đây, các số lớn đều được biếu diễn theo cơ số b như đã nêu trong phần 2 và được giả thiết là các số không âm.
3.3.2 So sánh
Input: Sổ lớn X có độ dài m và sổ lớn y có độ dài n;
Ouput: neu X > y thi return 1 ;
nếu X < y thì return 2;
nếu X = y thì return 0;
1. if(m > n) return 1; 2. if (m < n) return 2;
Trang 49
3. for (i = m-1; i>=0; i~)
3 .1 i f ( X j > Ỵi ) r e t u r n I ;
3.2 if ( X j < y, ) return 2;
4. return 0; 3.3.3 Phép cộng
Phép cộng được thực hiện trên hai so lớn có cùng độ dài. Trường hợp hai số có độ dài khác nhau thì số bé hơn sẽ được điền thêm các số 0 vào bên
t r á i .
Thuật toán cộng như sau:
Input: Hai sổ lớn X, V có độ dài là n+1; O u p u t : z = X + y = ( z n r | z n .. Z| z„ );
1. nho = 0; //nho là biến lưu trừ giá trị nhớ khi cộng các phần tử
2. for (i = 0 ; i < = n; i + + )
2.1 Zj = (Xj + Ỵí + nho) mod b;
2.2 if ( X j + yj + nho ) < b then nho = 0; else nho = 1 ;
3. znf|=nho;
3.3.4 Phép trù
Phép trừ cũng được thực hiện trên hai số lớn có cùng độ dài. Trường
h ợ p h a i s ố c ó đ ộ d à i k h á c n h a u t h ì s ố b é h ơ n s ẽ đ ư ợ c đ iề n t h ê m c á c s ố 0 v à o
bên trái.
Thuật toán trừ như sau:
Input: Hai số lớn X , y có độ dài là n+l; X > y
Ouput: z = X - y = (zn Z„ _ 1 .. Z| Zo );
]. nho = 0; //nho là biến lưu trữ giá trị nhớ khi trừ các phần tử
2. for (i = 0; i < n; i ++)
2.1 Zị = (Xj - y, + nho) m od b;
2.2 i f (Xj - yj + nho) > 0 then nho = 0; else nho = -1;
3. return z = (z„ zn.| .. Z | z0 ); 3.3.5 Phép nhân
C h o X, y l à h a i s ố l ớ n : X = ( x „ x „ . | .. X | X() ) v à y = ( y m y m.| .. y , y 0 ). K h i
đó tích của x.y sẽ có nhiều nhất là (n+m) chữ số. Ta kí hiệu (uv) = X j.y, , trong
đ ó u v à V là c á c s ố c ơ s ố b v à u c ó t h ể b à n g 0 .
Thuật toán nhân như sau:
Input: Hai số lớn X = (x n x„.| .. X| Xo ) vá y = (y m y m.| .. y, y0 );
O u t p u t : z = X . y = ( z n+nvH .. z, z „);
Trane 51
2. for (i = 0; i < m; i++)
2.1 nho = 0;
2.2 for (j = 0; j < n; j+ + )
2.2.1 tín h (uv)b = Zj+j + Xj.y, + nho;
2 ? 2 M + j ■ = V5 2.2.3 nho = u; 2.3 Zj+n-t-} Uj
3. return z = (zivtm+i .. Z| Zo);
3.3.6 Phép chia
Cho X, y là hai số lớn: X = (x„ x„.| .. X| Xo ) và y = (ym ym.| .. y, y0 ), với
X > V > 0 . P h é p c h i a X c h o y c ó k ế t q u ả là q v à r , t r o n g đ ó :
X = q.y + r; 0< r <y
Thuật toán chia như sau:
Input: Hai sổ lớn X - (x„ x„.| .. X| X() ) và y = (ym ym.| .. y, y(, );
với n > m > 1, ym 0.
Output: Thương sổ q = (qn.m .. qi q() ) và phần dư r = (rm .. 1*1 r() ) thoá mãn: x= q.y + r, 0 < r < y;
1. for Ci = 0; j < n-tn; j+ + ) q, = 0;
2.1 X = X - ybn'm; 3. for (i = n; i > m+1; i~ ) 3.1 if(Xi = = y, ) then q,.m.| = b - 1; else qj.m.| = L ( X j .b + X ị.|)/ y m J ; 3 . 2 w h i l e (q.-m-i ( y m -b + y„,-i) > Xi . b 2 + Xị.| . b +Xj.2) d o CỊi-m-l — ■ CỊi-m-l ” 1 » <■> -> _ _ 1 i-111- ỉ . 3.3. X = X - qi-m-1 • y . b ; 3.4 while (x < 0) do {x = x + y. b"111'1 ; qi-m- 1 = qi-m-i -1;} 4. r = x; 5. return (q, r); 3.3.7 Luỹ thùa
Thuật toán tính nhanh yn như sau: Input: Hai số lớn y và n; Output: Sổ lớn z = y" ; ]. a = n; z = 1 ; c = y; 2. while (a != 0) 2.1 if (a mod 2 = = 1) then z=z.c; 2 . 1 Cịn-m Cjn-111 í i
T r a n ụ 5 3
2.3 a = La/2J ; // lấy phần nguyên của a/2 3. return z;
3.3.8 Uóc số chung lón nhất
Sứ dụng thuật toán Euclid mở rộng tìm ước chung lớn nhất của hai sổ. Input: Hai số lớn a, b; a > b;
Output: d = gcd(a,b); và 2 số nguyên X, y thoả mãn: a.x + b.y = đ;
!. i f (b = = 0) then {d = a; X = 1 ; y = 0; return(d, X, y ) ; } 2. a 1 = 1 ; a2 = 0; a3 = a; b 1 = 0; b2 = 1 ; b3 = b; 3. q = a3 div b3; 4. while (b3 != 0) 4.1 cl = al ; c2 = a2; c3 = a3; 4.2 al =bl;a2 = b2;a3 = b3; 4.3 bl = c l - q . b l ; b2 = c2 - q.b2; b3 = c3 - q.b3; 6. if(a2 <0) a2 = a + a2; 7. d = a2; X = a l ; y = a3; 8. return (d, X, y );
3.3.9 Phép tính n h â n theo mudul p
Đe tính a.b mod p, ta biểu diễn b dưới dạng nhị phân:ỏ = b ị , trong ý=0
dỏ b| = 0 hoặc 1
k
Áp dụng thuật toán Horner: a.b mod p = ^ ( 2 /ồ/ơmodp)modp je0
Thuật toán tính a.b mod p như sau: Input: Ba số lớn a , b , p;
Output: z = a.b mod p
1. b= ỵ2Jbj; 7=0 z = a ; 3. for (i = k-1; i > 0; i —) 3.1 z = Z.2 mod p 3.2 if (bị = 1 ) then z = z+a; 4. return z ;
3.3.10 Phép tính luỹ thừa theo modul p
Thuật toán tính nhanh y" mod p như sau: Input: Ba số lớn y, n, p;
Trang 55
1. a = n; z = 1 ; c = y; 2. while (a != 0)
2.1 if (a mod 2 = =1) then z = z.c(modp);
2 . 2 c = c * c (mod p);
2.3 a = La/2j ; // lấy phần nguyên của a/ 2 3. return z;
3.3.11 Tìm phần tử nghịch đảo theo niodul p
Thuật toán Euclid mở rộng tìm phần tử nghịch đảo a' 1 mod p. Input: Hai số lớn m và a € z m;
Output: a' 1 mod m;
1. if (a = =0) return (“a Không có phần tử nghịch đảo”); 2. al = 1 ; a2 = 0; a3 = m; b 1 = 0; b2 = 1 ; b3 = a; 3. q = a3 div b3;
4. while ( b 3 != 0 )
4.1 cl = al; c2 = a2; c3 = a3; 4.2 al = b l; a 2 = b2;a3 = b3;
4.3 bl = c l - q.bl ; b2 = c2 - q.b2; b3 = c3 - q.b3;
5. if (a3 != 1 ) return (“a Không có phần tử nghịch đảo”); 6. if (a2 < 0) then a2 = m + a2;
Sau đây là các thuật toán thực hiện các phép lính cộng, trừ, nhân các sô lớn có dấu.
3.3.12 Phép cộng có dấu
Phép cộng hai số có dấu được thực hiện dựa trên phép so sánh, phép cộng và phép trừ hai số không âm trình bày ở mục 3.3.2, 3.3.3 và 3.3.4. Dấu cua số lớn được lưu tại bit cao nhất cua biến độ dài cua số lớn (xem phần 3.4).
Thuật toán cộng hai số có dấu như sau: Input: Hai số lớn X, y có dấu;
O u t p u t : z = X + y; / / z c ó d ấ u 1. if (x, y cùng dấu) 1.1 z = X + y; 1.2 đặt z cùng dấu với x; 1.3 return z; 2. if (x >= 0) //y < 0 2.1 if((s = So sánh (x,y)) != 2) return z = X - y; 2.2 i f ( ( s = 2) z = y - x; đặt z cùng dấu với y; return z;
Tra nu, 57 3.1 if ((s = So sánh (x,y)) — 2) return z = V - x; 3.2 if ((s != 2) z = x-y; đặt z cùng dấu với x; return z; 3.3.13 Phép trừ có dấu
Phép trừ hai số có dấu được thực hiện dựa trên phép cộng có dấu. Thuật toán trừ hai số có dấu như sau:
Input: Hai số lớn X, y có dấu; Output: z = X - y; llz có dấu
1. Đổi dấu y;
2. Cộng có dấu z = X + y;
3. return z;
3.3.14 Phép nhân có dấu
Phép nhân hai số có dấu được thực hiện dựa trên phép nhân hai sổ không âm trình bày trong mục 3.3.5.
Thuật toán nhân hai số có dấu như sau: input: Hai sổ lớn X, y có dấu;
Output: z = x.y; Hz có dấu;
1. if (x, y cùng dấu) return z = x.y;
2. i f (X, y khác dấu)
2 .1 z = x.y;
2.2 đổi dấu z; 2.3 return z;
3.4. MỘT SỚ NÉT VÈ LẶP TRÌNH TÍNH TOÁN SÓ CỠ LỚN
Trong phần 2 ta đã nói đến cách biếu diễn số lớn trong máy tính là sử dụng xâu ký tự đe lưu trữ các chừ số của số lớn. Trên cơ sở cách biếu diễn đó, trong chương trình của minh, tôi sử dụng kiểu cấu trúc để lưu trừ một số lớn như sau:
struct {
unsigned char * number; int len;
} bignumber, * bignumberptr;
M ồi khi cần biểu diễn một số lớn X ta sẽ cẩp phát bộ nhớ động cho biến X.number (kiểu xâu ký tự) theo độ dài x.len. Khi không dùng đến ta sẽ giải phóng bộ nhớ động này. Biến lưu trữ độ dài sẽ dành bit cao nhất để lưu dấu của số (1 là số âm, 0 là số dươrm); như vậy, độ dài tối đa của số lớn là 2 15 = 32767 (chừ sổ).
Các phép toán trên các số lớn được tính toán theo cơ số b = 256 (phù hợp với việc sử dụng 1 byte đế lưu trữ các ký tự của vãn bản).
I'rang 59
3.5. CIỚI THIỆU CHƯƠNG TRÌNH TẨN CÔNG GIAO THỨC s ử DỤNG HỆ MẬT MÃ RSA CÓ MODUL CHUNG• * •
Chương trình minh hoạ thuật toán được viết dưới dạng các modul bằng ngôn ngữ C[6]; giao diện hiên thị được viết băng ngôn ngừ VC[4], kết nối các modul con của chương trình. Các số lớn nhập vào và kết quả in ra hiến thị theo cơ số 10 quen thuộc với người sử dụne nhờ chương trình chuyển đổi từ cơ số 256 sang cơ sổ 10 và ngược lại..
Cụ thê chương trình gồm có hai phần: phần thứ nhất là bộ công cụ toán học đê tính toán với các số nguyên cỡ lớn; phần thứ hai là trình minh hoạ tấn công giao thức sử dụng hệ mật mã RSA có modul chung.
3.5.1 Bộ công cụ toán học
Bộ công cụ toán học tính toán các số cờ lớn, gồm các chức năng:
- Thực hiện các phép toán số học với các số nguyên lớn, bao gồm các phép tính cộng, trừ, nhân, chia lấy phần nguvên, lẩy phần dư, luỹ thừa, tim ước số chung lớn nhất.
- Thực hiện các phép toán trên phần dư số học với các số nguyên lớn, bao gồm các phép toán nhân, luỹ thừa, tìm phần tử nghịch đảo.
Sau đây là giao diện của công cụ tính toán với các số nguyên lớn. số liệu trên form là kết quá của phép tính: AH mod p với:
A = 85793841657461387564789650I 810758478
B = 84912792085983796191
p = 2472231347319538402664008764159401755955906639341
The Basic Arithmetic Operation E Input A: 857938416574613875647896501810758478 d J Input B: 84912792085983796191 _ l d Input P: 2472231347319538402664008764159401755955906639341 ÛK Result: 4395590032659717633316731861031D305886772182774 Befrcsh Exit A * B A - B I A x B A /B A mod B A'B
(A,Bj A~-1 modBj AB modP A'B modP
~ 1
Cách thực hiện: Nhập dừ liệu vào các ô tương ứng; bấm chọn OK để hiển thị các phép tính có thế thực hiện được. Chọn phép tính và kết quá sẽ hiên thị trong ô Result.
3.5.2 Trình minh hoạ thuật toán tấn công giao thức sử dụng hệ mật mà RSA có modui chung
Trình minh hoạ thuật toán giới thiệu ba trường hợp tấn công giao thức