CHƯƠNG 2. CÁC BIỆN PHÁP BẢO MẬT HỆ THỐNG THÔNG TIN18 2.1. Các mục tiêu của bảo mật hệ thống
2.7. Chữ ký điện tử
2.7.3. Một số sơ đồ chữ ký điện tử phổ biến
a. Rivest Shamir Adleman (RSA)
- Sơ lƣợc về các khái niệm toán học dùng trong RSA.
* Số nguyên tố (prime)
Số nguyên tố là những số nguyên chỉ chia chẵn đƣợc cho 1 và cho chính nó.
Ví dụ : 2, 3, 5, 7, 11, 13, 17, 23...
* Khái niệm nguyên tố cùng nhau (relatively prime or coprime).
Với hai số nguyên dương a và b. Ta ký hiệu UCLN(a,b): Ước chung lớn nhất của a và b.
Để đơn giản ta ký hiệu UCLN(a,b) = (a,b) Ví dụ :
(4,6)=2 (5,6)=1
Hai số a và b gọi là nguyên tố cùng nhau khi (a,b)=1 Ví dụ : 9 và 10 nguyên tố cùng nhau vì (9,10)=1
* Khái niệm modulo
Với m là một số nguyên dương. Ta nói hai số nguyên a và b là đồng dư với nhau
+ modulo m, nếu m chia hết hiệu (a-b) (viết là m|(a-b) ) Ký hiệu a ≡ b (mod m) [5]
Nhƣ vậy a ≡ b (mod m ) khi và chỉ khi tồn tại số nguyên k sao cho: a = b + k*m
Ví dụ: 13 ≡ 3 (mod 10) vì 13= 3 + 1*10
* Phi – Hàm EULER
Định nghĩa: Phi – Hàm Euler Φ(n) có giá trị tại n bằng số các số không vƣợt quá n và nguyên tố cùng nhau với n. [5]
Ví dụ : Φ(5) = 4 , Φ(6) = 2 ,Φ(10) = 4
* Một số định lý cơ bản
Định lý Euler: Nếu m là số nguyên dương và P nguyên tố cùng nhau với m thì PΦ(m) ≡ 1 (mod m) [5]
Vậy nếu m và p nguyên tố cùng nhau . Ta đặt s = Φ(m) thì Ps ≡ 1 (mod m)
Suy ra với: a= 1 + k*s
Ta có : Pa ≡ P*(Ps)k ≡ P*1k (mod m) ≡ P (mod m) Với e là số nguyên dương nguyên tố cùng nhau với s ,tức là (e,s)=1. Khi đó tồn tại một nghịch đảo d của e modulo s tức là e*d≡ 1 (mod s) ; e*d = 1 + k*s Đặt E(P) ≡ C ≡ Pe (mod m)
Đặt D(C) ≡ Cd (mod m) Ta thấy D(C) ≡ Cd ≡ (Pe (mod m))d (mod m)≡
Pe*d (mod m) ≡ P(1+k*s) (mod m) ≡ P.(Ps)k (mod m)≡P.(1)k (mod m)≡ P (mod m)
Ví dụ : m = 10 , P = 9 ta có (10,9)=1, s = Φ(10) = 4, e = 7, ta có (7,4) = 1.
Nghịch đảo của (7 modulo 4) là: d = 3, vì 7*3 =1 + 5*4 Lúc đó ta có:
E(P) ≡ C ≡ Pe ≡ 97 ≡ 4.782.969 ≡ 9 (mod 10) => C=9 D(C) ≡ Cd ≡ 93 ≡ 729 ≡ 9 (mod 10) Vậy D chính là hàm ngƣợc của E. Đây là cơ sở cho việc xây dựng thuật toán RSA.
Tính Φ(m) khi biết m. Chúng ta có định lý sau đây: Giả sử m = p1a1*p2a2*… *pkak.
Khi đó. Φ(m) =( p1a1– p1(a1-1))* … * (pkak – pk(ak-1))
Ví dụ: m= 10 Ta phân tích 10 =2*5=> Φ(10) =( 21 – 20) *(51 – 50) = 1*4
= 4.
- Cách tạo khóa:
Chúng ta cần tạo ra một cặp khóa Ký và Xác nhận theo các bước sau:
Bước1. Chọn 2 số nguyên tố lớn p và q với (p # q), lựa chọn ngẫu nhiên và độc lập.
Bước2. Tính số hàm modulo của hệ thống: n= p*q.
Bước3. Tính: Giá trị hàm số Ơle: Φ(n)= (p-1)(q-1).
Bước4. Chọn một số tự nhiên khóa mã e sao cho (1 <= e <= Φ(n)) và là số nguyên tố cùng nhau với Φ(n).
Bước5. Tính khóa giải mã d sao cho: d*e ≡ 1 (mod Φ(n)). Với 0<=d<=
Φ(n)
Khi đó ta phân phát khóa công khai: KU= {e,n}.
Và giữ khóa bí mật: KR= {d,n}.
Một số lưu ý:
Các số nguyên tố thường được chọn bằng phương pháp thử xác suất.
Các bước 4 và 5 có thể được thực hiện bằng giải thuật Euclid mở rộng Bước 5 có thể viết cách khác:
Tìm số tự nhiên x sao cho d=(x(p-1)(q-1)+1)/e cũng là số tự nhiên.
Khi đó sử dụng giá trị: d mod (p-1)(q-1).
Từ bước 3 sử dụng: £=BCNN(p-1)(q-1) thay cho Φ(n)=(p-1)(q-1). [5]
* Khóa công khai bao gồm:
n, môđun.
e, số mũ công khai.
* Khóa bí mật bao gồm:
n, môđun, xuất hiện cả trong khóa công khai và khóa bí mật.
d, số mũ bí mật.
- Quy trình thực hiện ký và xác nhận văn bản.
Dựa vào ưu điểm của hê ̣ mã RSA, nếu thiết lâ ̣p được sơ đồ ch ữ ký dựa trên bài toán phân tích ra thƣ̀a số nguyên tố thì đô ̣ an toàn của ch ữ ký sẽ rất cao.
* Ký (Mã hóa).
Giả sử có văn bản cần ký M. Đầu tiên chuyển M thành một số m<n theo một hàm có thể đảo ngƣợc (từ m có thể xác định lại M) đƣợc thỏa thuận trước.
Lúc này ta muốn ký lên văn bản M với số tương ứng là m. Ta sẽ tính c là bản ký của m theo công thức:
C = SigK(m) = md mod n. ( Trong đó d là khóa bí mật của người cần ký) Hàm trên có thể tính dễ dàng sử dụng phương pháp tính hàm mũ (theo môđun) bằng (thuật toán bình phương và nhân). Cuối cùng ta có bản ký c hay bản chữ ký điện tử và gửi cho đối tác.
* Xác nhận (Giải mã).
Sau khi nhận được bản chữ ký điện tử, người nhận cần phải xác nhận chữ ký trên văn bản là đúng người ký bằng cách xác nhận bản ký với khóa công khai của người ký với công thức sau.
VerK(m,c) = TRUE m ≡ ce (mod n) với x, y € Zn.
Quá trình giải mã hoạt động vì ta có Ce ≡ (md)e ≡ mde (mod n);
Do: ed ≡ 1 (mod p-1) và ed ≡ 1 (mod q-1), (theo Định lý Fermat nhỏ) nên:
Mde ≡ m (mod p);
và
mde ≡ m (mod q);
Do p và q là hai số nguyên tố cùng nhau, áp dụng định lý số dƣ Trung Quốc, ta có:
Mde ≡ m (mod pq);
hay:
Ce ≡ m (mod n);
Thông thường, chữ ký được kết hợp với hàm mã hoá công khai. Giả sử A muốn gửi mô ̣t bức điê ̣n đã được mã hoá và đã được ký đến cho B . Với bản rõ
x cho trước, A sẽ tính toán chữ ký của mình y = SigA(m) và sau đó mã hoá cả
x và y sử dụng khoá công khai eB của B, kết quả nhâ ̣n được là z = eB(m, c).
Bản mã z sẽ được gửi tới B , khi B nhâ ̣n được z, đầu tiên anh ta giải mã với hàm giải mã dB của mình để nhận đƣợc (m, c). Sau đó anh ta dùng hàm xác minh công khai của A để kiểm tra xem VerA(m,c) = TRUE hay không [1].
Song nếu đầu tiên A mã hoá m, rồi sau đó mới ký lên bản mã nhâ ̣n được thì sao? Khi đó, A sẽ tính:
c = SigA(eB(m))
A sẽ truyền că ̣p (z, c) tới B, B sẽ giải mã z và nhận đƣợc m, sau đó xác minh chữ ký c trên m nhờ dùng VerA. Mô ̣t vấn đề nảy sinh nếu A truyền (m, c) kiểu này thì mô ̣t người thứ ba C có thể thay ch ữ ký c của A bằng chữ ký của chính mình.
c’ = SigC(eB(m))
Chú ý rằng, C có thể ký lên bản mã eB(m) ngay cả khi anh ta không biết bản rõ m. Khi đó nếu C truy ền (z, c’) đến B, chữ ký của C đƣợc B xác minh bằng VerC và do đó, B cho rằng bản rõ x xuất phát tƣ̀ C. Do khó khăn này, hầu hết người sử dụng được khuyến nghị “ký trước khi mã” [3].
- Tính bảo mật.
Bài toán bảo mật của hệ chữ ký RSA là tránh trường hợp người ngoài có thể tính ra giá trị d bí mật (giá trị ký hay mã hóa) khi biết đƣợc giá trị xác nhận e (công khai).
Độ an toàn của hệ thống ký RSA dựa trên hai vấn đề của toán học: Bài toán phân tích ra thừa số nguyên tố các số nguyên lớn và bài toán RSA. Nếu hai bài toán trên là khó (không tìm được thuật toán hiệu quả để giải chúng) thì không thể thực hiện đƣợc việc phá mã toàn bộ đối với RSA.
Bài toán RSA là bài toán tính căn bậc e môđun n (với n là hợp số): Tìm số m sao cho me=c mod n, trong đó (e, n) chính là khóa công khai và c là bản mã. Hiện nay phương pháp triển vọng nhất giải bài toán này là phân tích n ra thừa số nguyên tố. Khi thực hiện đƣợc điều này, kẻ tấn công sẽ tìm ra số mũ bí mật d từ khóa công khai và có thể giải mã theo đúng quy trình của thuật toán. Nếu kẻ tấn công tìm đƣợc hai số nguyên tố p và q sao cho: n = pq thì có thể dễ dàng tìm đƣợc giá trị (p-1)(q-1) và qua đó xác định d từ e. Chƣa có một
phương pháp nào được tìm ra trên máy tính để giải bài toán này trong thời gian đa thức (polynomial-time). Tuy nhiên người ta cũng chưa chứng minh đƣợc điều ngƣợc lại (sự không tồn tại của thuật toán).
Tại thời điểm năm 2005, số lớn nhất có thể đƣợc phân tích ra thừa số nguyên tố có độ dài 663 bit với phương pháp phân tán trong khi khóa của RSA có độ dài từ 1024 tới 2048 bit. Một số chuyên gia cho rằng khóa 1024 bit có thể sớm bị phá vỡ (cũng có nhiều người phản đối việc này). Với khóa 4096 bit thì hầu như không có khả năng bị phá vỡ trong tương lai gần. Do đó, người ta thường cho rằng RSA đảm bảo an toàn với điều kiện n được chọn đủ lớn. Nếu n có độ dài 256 bit hoặc ngắn hơn, nó có thể bị phân tích trong vài giờ với máy tính cá nhân dùng các phần mềm có sẵn. Nếu n có độ dài 512 bit, nó có thể bị phân tích bởi vài trăm máy tính tại thời điểm năm 1999. Một thiết bị lý thuyết có tên là TWIRL do Shamir và Tromer mô tả năm 2003 đã đặt ra câu hỏi về độ an toàn của khóa 1024 bit. Vì vậy hiện nay người ta khuyến cáo sử dụng khóa có độ dài tối thiểu 2048 bit.
Năm 1993, Peter Shor công bố thuật toán Shor chỉ ra rằng: Máy tính lƣợng tử (trên lý thuyết) có thể giải bài toán phân tích ra thừa số trong thời gian đa thức. Tuy nhiên, máy tính lƣợng tử vẫn chƣa thể phát triển đƣợc tới mức độ này trong nhiều năm nữa [1].
b. Các dạng tấn công * Phân phối khóa
Cũng giống nhƣ các thuật toán mã hóa khác, cách thức phân phối khóa công khai là một trong những yếu tố quyết định đối với độ an toàn của RSA.
Quá trình phân phối khóa cần chống lại đƣợc tấn công đứng giữa (man-in-the- middle attack). Giả sử kẻ xấu (C) có thể gửi cho người gửi thông tin(A) một khóa bất kỳ và khiến (A) tin rằng đó là khóa (công khai) của đối tác(B). Đồng thời (C) có khả năng đọc đƣợc thông tin trao đổi giữa (A) và (B). Khi đó, (C) sẽ gửi cho (A) khóa công khai của chính mình (mà (A) nghĩ rằng đó là khóa của (B)). Sau đó, (C) đọc tất cả văn bản mã hóa do (A) gửi, giải mã với khóa bí mật của mình, giữ một bản copy đồng thời mã hóa bằng khóa công khai của (B) và gửi cho (B). Về nguyên tắc, cả (A) và (B) đều không phát hiện ra sự can thiệp của người thứ ba. Các phương pháp chống lại dạng tấn công này
thường dựa trên các chứng thực khóa công khai hoặc các thành phần của hạ tầng khóa công khai.
* Tấn công dựa trên thời gian
Vào năm 1995, Paul Kocher mô tả một dạng tấn công mới lên RSA:
Nếu kẻ tấn công nắm đủ thông tin về phần cứng thực hiện mã hóa và xác định đƣợc thời gian giải mã đối với một số bản mã lựa chọn thì có thể nhanh chóng tìm ra khóa d. Dạng tấn công này có thể áp dụng đối với hệ thống chữ ký điện tử sử dụng RSA. Năm 2003, Dan Boneh và David Brumley chứng minh một dạng tấn công thực tế hơn: Phân tích thừa số RSA dùng mạng máy tính (Máy chủ web dùng SSL). Tấn công đã khai thác thông tin rò rỉ của việc tối ƣu hóa định lý số dƣ Trung quốc mà nhiều ứng dụng đã thực hiện.
Để chống lại tấn công dựa trên thời gian là đảm bảo quá trình giải mã luôn diễn ra trong thời gian không đổi bất kể văn bản mã. Tuy nhiên, cách này có thể làm giảm hiệu suất tính toán. Thay vào đó, hầu hết các ứng dụng RSA sử dụng một kỹ thuật gọi là che mắt. Kỹ thuật này dựa trên tính nhân của RSA: thay vì tính cd mod n, đầu tiên chọn một số ngẫu nhiên r và tính (rec)d mod n. Kết quả của phép tính này là rm mod n và tác động của r sẽ đƣợc loại bỏ bằng cách nhân kết quả với nghịch đảo của r. Đối với mỗi văn bản mã, người ta chọn một giá trị của r. Vì vậy, thời gian giải mã sẽ không còn phụ thuộc vào giá trị của văn bản mã.
* Tấn công bằng phương pháp lựa chọn thích nghi bản mã.
Năm 1981, Daniel Bleichenbacher mô tả dạng tấn công lựa chọn thích nghi bản mã (adaptive chosen ciphertext attack) đầu tiên có thể thực hiện trên thực tế đối với một văn bản mã hóa bằng RSA. Văn bản này đƣợc mã hóa dựa trên tiêu chuẩn PKCS #1, một tiêu chuẩn chuyển đổi bản rõ có khả năng kiểm tra tính hợp lệ của văn bản sau khi giải mã.
Do những khiếm khuyết của PKCS #1, Bleichenbacher có thể thực hiện một tấn công lên bản RSA dùng cho giao thức SSL (tìm được khóa phiên). Do phát hiện này, các mô hình chuyển đổi an toàn hơn nhƣ chuyển đổi mã hóa bất đối xứng tối ƣu (Optimal Asymmetric Encryption Padding) đƣợc khuyến cáo sử dụng. Đồng thời phòng nghiên cứu của RSA cũng đƣa ra phiên bản mới của PKCS #1 có khả năng chống lại dạng tấn công nói trên.