4. Nội dung luận văn
2.2.6 Định lý Ferma
Cho trước p là số nguyên tố và a là số nguyên và nguyên tố cùng nhau với p,
a p-1 ≡ 1 (mod p).
2.2.7 Định lý Euler
Giả sử n > 1 là số nguyên dương, với mọi số nguyên a nguyên tố cùng nhau với n thì ta luôn có aφ(n) ≡ 1 (mod n).
2.2.8 Hàm Băm
Hàm băm mật mã là hàm toán học chuyển đổi một thông điệp (message) có độ dài bất kỳ (hữu hạn) thành một dãy bit có độ dài cố định (tùy thuộc vào thuật toán băm). Dãy bit này được gọi là thông điệp rút gọn (message digest) hay giá trị băm
(hash value), đại diện cho thông điệp ban đầu.
Hàm băm giúp xác định được tính toàn vẹn dữ liệu của thông tin: mọi thay đổi, dù là rất nhỏ, trên thông điệp cho trước, ví dụ chỉ thay đổi giá trị 1 bit, đều làm thay đổi thông điệp rút gọn tương ứng. Tính chất này hữu ích trong việc phát sinh, kiểm tra chữ ký điện tử, các đoạn mã chứng nhận thông điệp, phát sinh số ngẫu nhiên, tạo ra khóa cho quá trình mã hóa, ….
- Các tính chất cơ bản của hàm băm:
+ Là hàm một chiều, không thể thực hiện phép biến đổi ngược như trong quá trình mã hóa và giải mã, nghĩa là với một message_digest cho trước, khó có thể tìm được một message nào mà có hàm băm bằng message_digest này.
+ Khó có thể tìm được hai message mà có cùng một message_digest.
- Hàm một chiều: Hàm f(x) được gọi là hàm một chiều, nếu tính y = f(x) là dễ, nhưng việc tính ngược x = f -1 (y) là rất khó („dễ‟ nghĩa là tính được trong thời gian đa thức, „khó‟ là không tính được trong thời gian đa thức).
Ví dụ: Hàm f(x) = p*q = n là hàm một chiều vì biết p và q tính n là dễ nhưng ngược lại biết n tìm p và q là khó.
Hàm băm là nền tảng cho nhiều ứng dụng mã hóa. Có nhiều thuật toán để thực hiện hàm băm, trong số đó, phương pháp SHA-1 và MD5 thường được sử dụng khá phổ biến từ thập niên 1990 đến nay.
2.2.9 Hàm băm MD5
Giải thuật MD5 được phát triển bởi Ron Rivest ở MIT [5][9]: nhận đầu vào là một khối data (message) có chiều dài bất kỳ (hữu hạn), xử lý nó thành các khối 512 bít, tạo đầu ra là một giá trị băm 128 bít. Quá trình bao gồm các bước sau:
* Bước 1: message ban đầu được thêm (padding) một số bít (bắt đầu là bít 1, kế tiếp là các bít 0, số bít thêm vào từ 1 tới 512 bít) sao cho tổng số bít sau khi thêm vào cộng với 64 (chiều dài của message ban đầu) là bội số của 512.
Hình 2.3: Tạo message_digest sử dụng MD5
* Bước 2: khởi tạo bộ đệm MD có kích thước 128 bít. Bộ đệm 128 bít này được dùng để chứa kết quả trung gian và kết quả cuối cùng của hàm băm. Có thể xem bộ đệm như là 4 thanh ghi 32 bít. Các thanh ghi này được khởi tạo (dạng số hex) như sau:
A = 01234567 B = 89abcdef C = fedcba98 D = 76543210
* Bước 3: Xử lý message thành từng khối 512 bít (16 từ 32 bít). Quá trình tính toán được chia thành từng giai đoạn, số giai đoạn bằng số chiều dài (tính theo bít) của message sau khi đã padding chia cho 512. Mỗi giai đoạn nhận đầu vào là khối 512 bít của message đã được padding và message_digest của giai đoạn trước, cho ra kết quả là message_digest mới (hình 2.2). Mỗi giai đoạn thực hiện trong 4 bước (vòng), bốn vòng có cấu trúc giống nhau nhưng mỗi vòng sử dụng một hàm luận lý khác nhau, được đặc tả là F, G, H, I. Trong hình 2.3, bốn vòng được đặt nhãn là fF, fG, fH, fI, để chỉ rằng mỗi vòng có cấu trúc hàm tổng quát như nhau nhưng tùy thuộc vào sự khác nhau của hàm thao tác (F, G, H, I).
F(X,Y, Z) = (XY) (X Z). G(X,Y, Z) = (X Z) (YZ). H(X,Y, Z) = X Y Z. I(X,Y, Z) = Y (X vZ). Trong đó: x y: phép toán AND. x y: phép toán OR. z y: phép toán XOR. x: phép lấy bù x.
Hình 2.4: Xử lý MD5 trên một khối đơn 512 bít.
Mỗi vòng được thực hiện 16 bước tuần tự trên các dữ liệu A, B, C, D (hình 2.4). Biểu thức tính toán được sử dụng trong mỗi vòng có dạng:
a = b + CLSs(a + g(b, c, d) + X[k] + T[i]). Trong đó:
• a, b, c, d: là 4 word A, B, C, D theo thứ tự nào đó. • g: là một trong các hàm F, G, H, I.
• X[k] = M[q*16 + k]: từ 32 bít thứ k của khối 512 bít thứ q của message. MD5 sử dụng thêm một mảng T[1….64] được xây duwjwng từ hàm sin. • T[i] = 232 * abs(sin(i)): từ 32 bít thứ i (i tính theo radian).
• Phép toán cộng (+) tính cho modulo 232
Hình 2.5: Tác vụ của MD5[abcd k s i]. Bảng 2.2: Giá trị hằng số của mảng T có 64 phần tử
T1= D76AA478 T17= F61E2562 T33= FFFA3942 T49 = F4292244 T2 = E8C7B756 T18= C040B340 T34 = 8771F681 T50 = 432AFF97 T3 = 242070D8 T19= 65E5A51 T35 = 69D96122 T51 = AB9423A7 T4 = 1BDCEEE T20=E9B6C7AA T36=FDE5380C T52 = FC93A039 T5 = F57C0FAF T21=D62F105D T37=A4BEEA44 T53 = 655B59C3 T6 = 4787C62A T22= 02441453 T38=4BDECFA9 T54 = 8F0CCC92 T7 = A8304613 T23=D8A1E681 T39= F6BB4B60 T55 = FFEFF47D T8 = FD469501 T24= 7D3FBC8 T40= BEBFBC70 T56 = 85845DD1 T9 = 698098D8 T25=21E1CDE6 T41 = 289B7EC6 T57 = 6FA87E4F T10 = 8B44F7AF T26= C33707D6 T42= EAA127FA T58 = FE2CE6E0
T11 = FFFF5BB1 T27= F4D50D87 T43 = D4EF3085 T59 = A3014314 T12 = 895CD7BE T28=455A14ED T44 = 04881D05 T60 = 4E0811A1 T13 = 6B901122 T29= A9E3E905 T45= D9D4D039 T61 = F7537E82 T14 = FD987193 T30=FCEFA3F8 T46 = E6DB99E5 T62= BD3AF235 T15 = A679438E T31 = 676F02D9 T47 = 1FA27CF8 T63=2AD7D2BB T16 = 49B40281 T32= D2A4C8A T48 = C4AC5665 T64 = EB86D391
Bảng 2.3: Xây dựng các tác vụ ABCD 0 7 1 1 5 17 5 4 33 0 6 49 DABC 1 12 2 6 9 18 8 11 34 7 10 50 CDAB 2 17 3 11 14 19 11 16 35 14 15 51 BCDA 3 22 4 0 20 20 14 23 36 5 21 52 ABCD 4 7 5 5 5 21 1 4 37 12 6 53 DABC 5 12 6 10 9 22 4 11 38 3 10 54 CDAB 6 17 7 15 14 23 7 16 39 10 15 55 BCDA 7 22 8 4 20 24 10 23 40 1 21 56 ABCD 8 7 9 9 5 25 13 4 41 8 6 57 DABC 9 12 10 14 9 26 0 11 42 15 10 58 CDAB 10 17 11 3 14 27 3 16 43 6 15 59 BCDA 11 22 12 8 20 28 6 23 44 13 21 60 ABCD 12 7 13 13 5 29 9 4 45 4 6 61 DABC 13 12 14 2 9 30 12 11 46 11 10 62 CDAB 14 17 15 7 14 31 15 16 47 2 15 63 BCDA 15 22 16 12 20 32 2 23 48 9 21 64
* Bước 4: Xuất kết quả, tất cả khối 512 bít L đã được xử lý thì đầu ra ở giai đoạn thứ L là message_digest 128 bít.
Có thể tóm tắt hoạt động của MD5 như sau: MD0 = IV
MDq+1 = MDq + fI(Yq, fH(Yq, fG(Yq, fF(Yq, MDq)))). MD = MDL-1
Trong đó:
+ IV: giá trị khởi tạo của bộ đệm ABCD được xác định trong bước 2. + Yq: khối message 512 bít thứ q.
+ L: số khối message (đã được padding). + MD: giá trị message_digest cuối cùng.
Dưới đây là các ví dụ mô tả các kết quả thu được sau khi băm.
MD5("The quick brown fox jumps over the lazy dog") = 9e107d9d372bb6826bd81d3542a419d6
Thậm chí chỉ cần một thay đổi nhỏ cũng làm thay đổi hoàn toàn kết quả trả về:
MD5("The quick brown fox jumps over the lazy cog") = 1055d3e698d289f2af8663725127bd4b
Ngay cả một chuổi rổng cũng cho ra một kết quả phức tạp:
MD5("") = d41d8cd98f00b204e9800998ecf8427e
2.2.10 Hàm băm SHA1
Đầu vào của thuật toán là một thông điệp có chiều dài bất kỳ nhỏ hơn 264 bit, SHA-1 cho ra kết quả là một thông điệp rút gọn có độ dài là 160 bit [5][9].
Các bước thực hiện thuật toán
Bước 1: Mở rộng thông điệp
Thông điệp M được mở rộng trước khi thực hiện băm. Mục đích của việc mở rộng này là để đảm bảo cho thông điệp mở rộng có độ dài là bội số của 512.
Thêm bit 1 vào cuối thông điệp, sau đó là các bit 0 cho đến khi chiều dài của chuỗi thông điệp đồng dư với 448 modulo 512.
Sau khi thông điệp đã được mở rộng, thông điệp mở rộng được phân tích thành N khối 512 bit M1, M2, …, Mn. Như vậy thông điệp sau khi thêm chứa
16*n từ 32 bít (n > 0, thông điệp gồm n khối 16 từ: M1, M2,…, Mn. Mỗi khối có chiều dài 512 bít).
Bước 2: Khởi tạo bộ đệm
Việc tính toán dùng 2 vùng đệm, mỗi vùng chứa 5 từ 32 bít và một chuỗi 80 từ 32 bít.
Vùng đệm 5 từ đầu ký hiệu A, B, C, D, E. Các vùng đệm của 5 từ thứ 2 là H0, H1, H2, H3, H4. Các từ của chuỗi 80 từ được ký hiệu là w(0), w(1), w(2), ..., w(79).
Bộ đệm MD 160 bít gồm 5 từ H0, H1, H2, H3, H4 được xem là 5 thanh ghi 32 bít, những thanh ghi này được khởi tạo giá trị ban đầu theo hệ thập lục phân như sau:
H0 = 67452301 H1 = EFCDAB89 H2 = 98BADCFE H3 = 10325476 H4 = C3D2E1F0 Bước 3: Xử lý các khối 512 bít
- SHA1 xử lý từng khối 512 bít gồm 16 từ 32 bít. Các khối M1, M2, …, Mn được xử lý như sau:
• Chia M(i) thành 16 từ W(0), W(1), ..., W(15) trong đó W(0) là từ bên trái nhất, thuật toán sẽ sinh ra 80 từ theo công thức:
IF (t ≥ 0) and (t ≤ 15) then Wt = X[t] For t = 16 to 79 do Wt = (Wt-3 Wt-8 Wt-14 Wt-16) <<< 1 • Đặt A = H0, B = H1, C = H2, D = H3, E = H4 • For t = 0 to 79 do Temp A <<< 5 + f(t; B, C, D) + E + W(t) + K(t) E = D; D = C; C = B <<< 30; B = A; A = Temp. Trong đó : f(t; B, C, D) = (BC) (B D) (0 ≤ t ≤ 19)
f(t; B, C, D) = (BCD) (20 ≤ t ≤ 39)
f(t; B,C, D) = (BC) (BD) (CD) (40 ≤ t ≤ 59)
f(t; B, C, D) = (BCD) (60 ≤ t ≤ 79) SHA-1 sử dụng dãy các hằng số K(0), …, K(79) có giá trị như sau: K(t) = 5A827999 ( 0 <= t <= 19)
K(t) = 6ED9EBA1 (20 <= t <= 39) K(t) = 8F1BBCDC (40 <= t <= 59) K(t) = CA62C1D6 (60 <= t <= 79).
• Tính lại giá trị các thanh ghi H0 = H0 + A
H1 = H1 + B H2 = H2 + C H3 = H3 + D H4 = H4 + E
Bước 4: xuất kết quả
Sau khi n khối 512 bít của thông điệp M được xử lý xong ở bước 3 ta thu được giá trị băm tại 5 thanh ghi, đó chính là 5 từ biểu diễn chuỗi thông điệp thu gọn có độ dài 160 bít: H0 H1 H2 H3 H4.
Cài đặt SHA1:
SHA1Managed SHhash1 = new SHA1Managed();
btSentHash = SHhash1.ComputeHash(btpayload, 0, btpayload.Length); txtgtbam.AppendText(System.Convert.ToBase64String(btSentHash));
btEncryptedSentHash = cRSAWrap.EncryptBuffer(txtpublic1.Text,btSentHash); Dưới đây là một ví dụ mô tả hàm băm SHA-1
SHA1("The quick brown fox jumps over the lazy dog") = 2fd4e1c6 7a2d28fc ed849ee1 bb76e739 1b93eb12
Chỉ cần một thay đổi nhỏ dog thành cog thì kết quả trả về cũng thay đổi hoàn toàn.
= de9f2c7f d25e1b3a fad3e85a 0bd17d9b 100db4b3 2.3 Lƣợc đồ chữ ký điện tử RSA 2.3.1 Định nghĩa lược đồ chữ ký Một lược đồ chữ ký số là một bộ (M, MS, K, S, V) trong đó[9][10]: - M là tập hữu hạn các văn bản có thể. - MSlà tập hữu hạn các chữ ký có thể. - K là tập hữu hạn các khóa. - S là tập các thuật toán ký. - V là tập hợp các thuật toán chứng thực chữ ký.
Với mỗi kK là một cặp (k‟, k‟‟), trong đó k‟ là khóa bí mật dùng để ký, k‟‟ là khóa công khai dùng để chứng thực chữ ký.
Mỗi k = (k‟, k‟‟)K. Có một thuật toán ký Sig k‟: M M
s (Sigk‟ S) và một thuật toán kiểm thử Verk‟‟: M x Ms {True, False} (Verk‟‟ V). Thoả mãn điều kiện sau đây với mọi x M, y Ms:
Các thuật toán Sigk‟ và Verk‟‟ cần phải được tính dễ dàng (trong thời gian đa thức). Hàm Sig là khó tính được, nếu không biết khóa k‟ điều đó cho phép đảm bảo tính bí mật của việc ký, hay nói cách khác cho việc chống giả mạo chữ ký, không thể chối bỏ được chữ ký khi đã ký vào thông điệp và gửi đi.