31 LÝ DO CHỌN ĐỀ TÀI Đây là một giải thuật mã hóa khóa công khai được sử dụng rất phổ biến trong internet hiện nay và được giới thiệu trong môn An ninh mạng viễn thông, vì sự tò mò và
GIỚI THIỆU
Mô tả giải thuật
Các khóa cho thuật toán RSA được tạo theo cách sau:
1 Chọn hai số nguyên tố phân biệt p và q
○ Vì mục đích bảo mật, các số nguyên p và q nên được chọn ngẫu nhiên và phải có độ lớn tương tự nhau nhưng độ dài khác nhau một vài chữ số để làm cho việc tính toán khó hơn
○ p và q được giữ bí mật
○ n được sử dụng làm môđun cho cả khóa công khai và khóa riêng Độ dài của nó, thường được biểu thị bằng bit, là độ dài khóa
○ n được phát hành như một phần của khóa công khai
3 Tính λ ( n ) (λ là hàm trọng tâm của Carmichael)
Vì n = pq nên λ ( n ) = lcm ( λ ( p ), λ ( q )) (lcm: bội chung nhỏ nhất)
Vì p và q là số nguyên tố nên: λ ( p ) = φ ( p ) = p - 1 λ ( q ) = q - 1
○ Lcm có thể được tính thông qua thuật toán Euclide (thuật toán này dùng để tính ước chung lớn nhất của hai số nguyên)
4 Chọn số nguyên e sao cho 1 < e < λ ( n ) và gcd (e , λ ( n )) = 1, nghĩa là e và λ ( n ) là 2 số nguyên tố cùng nhau
○ e có độ dài bit ngắn và trọng lượng Hamming nhỏ dẫn đến mã hóa hiệu quả hơn , giá trị được chọn phổ biến nhất cho e là 2 16 + 1 = 65537 Giá trị nhỏ nhất (và nhanh nhất) có thể có đối với e là 3, nhưng giá trị nhỏ như vậy đối với e đã được chứng minh là kém an toàn hơn trong một số cài đặt
○ e được phát hành như một phần của khóa công khai
○ e được gọi là số mũ công khai hoặc số mũ mã hóa hoặc chỉ số mũ
5 Xác định d là d ≡ e −1 (mod λ ( n )), nghĩa là, d và e là nhân nghịch đảo của modulo λ ( n )
○ Điều này có nghĩa là tìm d khi cho phương trình d ⋅ e ≡ 1 (mod λ(n)) , d có thể được tính toán một cách hiệu quả bằng cách sử dụng thuật toán Euclid mở rộng , vì nhờ e và λ ( n ) là cùng chuẩn, phương trình đã nói là một dạng đồng nhất của Bézout , trong đó d là một trong các hệ số
○ d được giữ bí mật dưới dạng số mũ của khóa riêng
○ d được gọi là số mũ bí mật hoặc số mũ giải mã
Khóa công khai bao gồm môđun n và số mũ công khai e Khóa riêng tư bao gồm số mũ d riêng tư, phải được giữ bí mật Và p , q , và λ ( n ) cũng phải được giữ bí mật vì chúng có thể được sử dụng để tính d Trên thực tế, tất cả chúng đều có thể bị loại bỏ sau khi tính toán d.
Trong phiên bản RSA ban đầu, các hàm Euler φ ( n ) = ( p - 1).( q - 1) được sử dụng thay cho λ(n) để tính số mũ riêng d Vì φ ( n ) luôn chia hết cho λ ( n ) nên thuật toán cũng hoạt động tương tự Việc sử dụng hàm Euler totient cũng có thể được coi là hệ quả của định lý Lagrange áp dụng cho nhóm nhân các số nguyên modulo pq Vì vậy, bất kỳ d thỏa mãn d.e ≡ 1 (mod φ ( n )) cũng thỏa mãn d.e ≡ 1 (mod λ(n)) Tuy nhiên, tính toán d modulo φ (n) đôi khi sẽ mang lại kết quả lớn hơn mức cần thiết (tức là d > λ(n)) Hầu hết các triển khai của RSA sẽ chấp nhận số mũ được tạo bằng một trong hai phương pháp (nếu chúng sử dụng số mũ riêng d , thay vì sử dụng phương pháp giải mã tối ưu hóa dựa trên định lý phần dư Trung Quốc (CRT) ), nhưng một số tiêu chuẩn như FIPS 186-4 có thể yêu cầu d < λ ( n ) Bất kỳ số mũ riêng "quá khổ" nào không đáp ứng tiêu chí đó luôn có thể bị giảm modulo λ ( n ) để thu được số mũ tương đương nhỏ hơn
Vì bất kỳ thừa số chung nào của (p - 1) và (q - 1) đều có trong phân tích nhân tử của n
- 1 = pq - 1 = (p - 1) (q - 1) + (p - 1) + (q - 1) , khuyến nghị rằng (p - 1) và (q - 1) chỉ có những yếu tố chung rất nhỏ, nếu có bên cạnh những yếu tố cần thiết 2
➢ Tóm lại các bước trong RSA ban đầu:
1 Chọn hai số nguyên tố lớn p và q (p ≠ q), lựa chọn ngẫu nhiên và độc lập
4 Chọn một số tự nhiên e sao cho 1< e Y= (2M) mod n Từ đây ta có thể suy ra M
Có 1 cách giải quyết việc tấn công đó là đệm thêm bản rõ trước khi mật mã hóa Tuy nhiên các CCA tinh vi vẫn có thể thực hiện được và chèn thêm một giá trị ngẫu nhiên đơn giản không đủ cung cấp tính an toàn như mong muốn Để chống lại tấn công này ta thay đổi bản rõ sử dụng thủ tục đệm mật mã bất đối xứng tối ưu (OAEP)
Năm 1998, Daniel Bleichenbacher đã mô tả cuộc tấn công bản mã được chọn thích ứng thực tế đầu tiên , chống lại các thông điệp được mã hóa RSA bằng cách sử dụng sơ đồ đệm PKCS #1 v1 (một sơ đồ đệm ngẫu nhiên hóa và thêm cấu trúc vào một thông điệp được mã hóa RSA, vì vậy có thể xác định liệu một tin nhắn được giải mã là hợp lệ) Do các sai sót với lược đồ PKCS #1, Bleichenbacher đã có thể thực hiện một cuộc tấn công thực tế chống lại việc triển khai RSA của giao thức lớp cổng bảo mật (SSL) và để khôi phục các khóa phiên Vì điều này nên các nhà mật mã học giờ đây khuyên bạn nên sử dụng các sơ đồ đệm an toàn có thể chứng minh được.
ỨNG DỤNG
Bảo mật dữ liệu
Chắc hẳn các bạn đã từng truy cập tài khoản cá nhân vào hệ thống nào đó ví dụ như Gmail, Facebook, và được hệ thống gửi về mã xác nhận tài khoản Đây là một trong những phương pháp sử dụng giải thuật RSA
Truyền tải an toàn là phương pháp để truyền đi những thông tin cần bảo mật cao như thông tin ngân hàng Hiện nay, chúng ta đều sử dụng nó hằng ngày dưới giao thức HTTPS, kể cả Facebook và trang WordPress này mà các bạn đang theo dõi Truyền tải an toàn ngăn chặn kiểu tấn công nghe lén bằng cách mã hóa thông tin được truyền đi
Thông thường, thông tin được mã hóa sử dụng một phương pháp mã hóa khóa đối xứng (symmetric-key encryption) Mã hóa khóa đối xứng tốn ít tài nguyên hơn mã hóa RSA, do đó thích hợp để mã hóa lương thông tin lớn Tuy nhiên, vấn đề với mã hóa khóa đối xứng là việc mã hóa và giải mã sử dụng chung một khóa (gọi là khóa phiên),
17 Nhóm 02 và do đó, khóa này cần phải được truyền đi một cách bảo mật Nếu khóa đó bị lộ, việc mã hóa là vô nghĩa Trong quá khứ, khóa này có thể được truyền đi trực tiếp (bưu điện) hay qua điện thoại Hiện nay, khóa này được truyền đi sử dụng mã hóa RSA Như vậy ta có thể thấy giải thuật này ngoài để mã hóa dữ liệu trực tiếp nó còn dùng để phục vụ cho các giải thuật mã hóa khác Để thiết lập một đường truyền tải an toàn, ví dụ giữa Alice và Bob, các bước sau đâu được thực hiện:
1 Alice tạo ra một bộ khóa công khai và khóa bí mật theo RSA
2 Alice gửi khóa công khai cho Bob
3 Bob tạo ra một khóa phiên a ngẫu nhiên
4 Bob mã hóa a sẽ dụng khóa công khai để cho ra bản mã b và gửi cho Alice
5 Alice nhận bản mã b, dùng khóa bí mật để giải mã ra a
6 Alice và Bob cùng sử dụng a làm khóa phiên cho một thuật toán mã hóa khóa đối xứng khác
Nếu kẻ tấn công nghe lén được cuộc hội thoại, tất cả thứ hắn nghe được chỉ là: Khóa công khai từ Alice, mật văn b, tất cả thông tin sau đó bị mã hóa bởi a (mà chỉ có Alice và Bob biết)
Kẻ tấn công không thể tái tạo a từ mật văn b và khóa công khai, do đó hắn không thể giải mã những gói tin sau đó Đường truyền giữa Alice và Bob đã được bảo mật
Tuy nhiên, kẻ tấn công (ví dụ tên là Charlie) vẫn có thể đánh chặn được những gói tin của Alice và Bob (man-in-the-middle attack) Charlie có thể giả mạo là Bob trước mặt Alice, và giả làm Alice trước mặt Bob (OK, hắn lưỡng tính) Alice và Bob không truyền trực tiếp với nhau, nhưng thông qua Charlie Giữa Alice và Charlie, và giữa Charlie và Bob vẫn là những “đường truyền an toàn”, nhưng truyền tải an toàn chỉ bảo vệ thông tin khỏi những kẻ nghe lén bên ngoài, chứ không bảo vệ khỏi những kẻ mạo danh như Charlie Để xác thực được phần tiếp theo sẽ cung cấp điều đó
Chữ kỹ số (Digital Signature)
Giả sử Alice sử dụng khóa công khai của Bob để gửi cho anh ấy một tin nhắn được mã hóa Trong tin nhắn, cô ấy có thể tự xưng là Alice, nhưng Bob không có cách nào để xác minh rằng tin nhắn đó là của Alice vì bất kỳ ai cũng có thể sử dụng khóa công khai của Bob để gửi cho anh ấy các tin nhắn được mã hóa Để xác minh nguồn gốc của một tin nhắn, RSA cũng có thể được sử dụng để làm chữ ký số
Giả sử Alice muốn gửi một tin nhắn đã ký cho Bob Cô ấy sử dụng khóa riêng của mình vào chữ kỹ số (vì khóa riêng này chỉ Alice có mà không ai khác có) Cô ấy tạo ra một giá trị băm của tin nhắn, nâng nó lên thành lũy thừa d (modulo n), và gắn nó như một "chữ ký" vào tin nhắn Khi Bob nhận được tin nhắn đã ký, anh ta sử dụng cùng một thuật toán băm kết hợp với khóa công khai của Alice Anh ta nâng chữ ký lên thành lũy thừa e (modulo n), và so sánh giá trị băm kết quả với giá trị băm của tin nhắn Nếu hai giá trị này bằng nhau, anh ấy biết rằng đó có phải là Alice hay là kẻ giả mạo Thuật toán mô tả như sau :
Do đó, các khóa có thể được hoán đổi mà không làm mất tính tổng quát, đó là khóa riêng của một cặp khóa có thể được sử dụng để:
1 Giải mã một tin nhắn chỉ dành cho người nhận, tin nhắn này có thể được mã hóa bởi bất kỳ ai có khóa công khai
2 Mã hóa một tin nhắn có thể được giải mã bởi bất kỳ ai, nhưng chỉ có thể được mã hóa bởi một người, điều này cung cấp một chữ ký điện tử
MÔ PHỎNG GIẢI THUẬT RSA BẰNG LẬP TRÌNH PYTHON
Đầu tiên ta xây dựng các hàm dưới đây
MyBase: hàm chuyển đổi cơ số
Primetest: hàm kiểm tra tính nguyên tố
CreateKey : tạo khóa công khai và khóa riêng encode : hàm mã hóa decode : giải mã
GenePrime : Hàm sinh số nguyên tố xác xuất
Tạo thư mục tên “ Data “ trong cùng thư mục với các file py trên ( tức là trong cùng một project) Trong thư mục “Data” tạo một file text tên:”
NoiDungMaHoa” để nhập dữ liệu muốn mã hóa
❖ Dưới đây là code của các hàm trên:
#powMod(a, b, m): Trả về kết quả phép tính a^b mod m def powMod(a, b, m): x = [] while b != 0: x.append(b & 1) b = b >> 1 sz = len(x) po = [a%m] for i in range(1,sz): p = (po[i-1]*po[i-1])%m po.append(p) r = 1 for i in range(sz): if(x[i] != 0): r*= po[i] r%= m return r
#GCD(a, b):Trả về UCLN(a, b) def GCD(a, b): if b == 0: return a return GCD(b, a%b)
#GCD_extended(a, b): Trả về 3 số x,y,z thỏa mãn xa + yb = z = UCLN(a, b)
# a*x + b*y = z def GCD_extended(a, b): u1, u2, u3 = 1, 0, a v1, v2, v3 = 0, 1, b while v3 != 0: q = u3//v3 t1, t2, t3 = u1 - q*v1, u2 - q*v2, u3 - q*v3 u1, u2, u3 = v1, v2, v3 v1, v2, v3 = t1, t2, t3 return u1, u2, u3
MyBase: hàm chuyển đổi cơ số dig ="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-+" def getId(ch): if ch == '-': return 62 if ch == '+': return 63 if ch 1 s+= 1 m = n for i in range(x): a = sprime[i] if Q(a,p,m,s) == False: return False return True
GenePrime :Hàm sinh số nguyên tố xác xuất import random import PrimeTest
#Random (b): Hàm trả về số lẻ ngẫu nhiên b bits def Random (b): a = random.getrandbits(b) a = a | (1 = size_n: # Tối ưu mã hóa nhiều kí tự nhất có thể A.append(int(x)) x = "" x+= i
#encode(n, e, P, file): Mã hóa bản rõ P với khóa (n, e) lưu vào file với cơ
64 def encode(n, e, P, file): fo = open(file,"w")
A = createBigInt(R, len(str(n))) for i in A:
M = MyBase.toBase(M,64) #chuyen doi ban ma sang Base64 de tot hon khi truyen tai, va khi khoi phuc ham bam
C+= M + ' ' fo.write(M+' ') fo.close() return C def main(): n, e = getPublicKey("Data/PublicKey.txt")
C = encode(n, e, P, "Data/BanMa.txt") print("Noi dung can ma hoa la:") print(P) print("Noi dung sau khi duoc ma hoa la:") print (C) main() decode : Giải mã import MyMath import MyBase
#getPrivateKey (file): Lấy khóa mật (n,d) từ file def getPrivateKey (file) : # file Privatekey fi = open(file,"r") n = int(fi.readline()) d = int(fi.readline()) fi.close() return n, d
#getCiphertext(file): Lấy văn bản mã hóa từ file def getCiphertext(file): # file Ciphertext fi = open(file,"r")
#decode(n, d, C, base, fileOut): Giải mã bản mã C xuất ra bản rõ vào fileOut def decode(n, d, C, base, fileOut): # file PlanintextDecode fo = open(fileOut,"w")
P = "" for i in C: m = MyMath.powMod(MyBase.toInt(i,64),d,n) c = str(m) while len(c) % base != 0: c = '0' + c x = 0 while x != len(c):
P+= chr(int(a)) fo.write(chr(int(a))) fo.close() return P def main(): n, d= getPrivateKey("Data/PrivateKey.txt")
C= decode(n, d, C, 4, "Data/NoiDungSauKhiGiaiMa.txt") print("Sau khi giai ma nhan duoc la:") print(C) main()
Nội dung muốn mã hóa :
“Hi toi la Tran Quang Thanh sinh vien PTIT
Nhom toi gom 3 thanh vien :
Nhập nội dung cần mã hóa này vào file text “NoiDungMaHoa” trong folder Data đã tạo :
Và sau khi chạy trương trình, các file text “PrivateKey, PublicKey,
SoNguyenToLon, BanMa, NoiDungSauKhiGiaMa” sẽ sinh ra trong thư mục
Data Chúng ta có thể vào đó để xem Khóa công khai, khóa riêng, bản mã,…
2 Chạy thực chương trình thực thi giải thuật RSA
(Nội dung chúng ta sẽ mã hóa là nội dung đã nhập ở phần 1)
• Đầu tiên chạy Hàm GenePrime để sinh ra 2 số nguyên tố lớn
Nhìn trong hình ta thấy kết quả trả về là 2 số nguyên tố p và q có độ dài 1024 bit
• Chạy hàm CreateKey để tạo khóa công khai và khóa riêng
30 Nhóm 02 Ở đây ta chọn e = 65537 ( đây là giá trị hay dùng phổ biến)
Kết quả trả về các tham số n, e, d
• Chạy encode để mã hóa nội dung cần mã hóa mà đã nhập vào file text
Chạy thực thi mã hóa giải thuật RSA với nội dung mã hóa như trên
chú ý là trong bài này nội dung sau khi mã hóa sẽ chuyển đổi tiếp sang Base64, điều này giúp ích cho khi khôi phục chính xác hàm băm, và thuận tiện cho việc truyền tải hơn là truyền dữ liệu nhị phân
• Chạy decode để giải mã :
Kết quả trả về đúng như nội dung đã nhập trong file text “NoiDungMaHoa”
Vậy là chúng ta đã thực hiện mã hóa đơn giản giải thuật RSA trên máy tính bằng Python.