Chương 3 : Thuật tốn mã hóa RSA và ECC
3.1 Thuật tốn mã hóa RSA
3.1.1 Giới thiệu
Thuật toán được Ron Rivest, Adi Shamir và Len Adleman mô tả lần đầu tiên vào năm 1977, tại Học viện Công nghệ Massachusetts (MIT) [11]. Tên của thuật toán lấy từ 3 chữ cái đầu tiên của tên 3 tác giả.
Trước đó, vào năm 1973, Clifford Cocks, một nhà tốn học người Anh làm việc tại GCHQ, đã mơ tả một thuật tốn tương tự nhưng với khả năng tính tốn tại thời điểm đó thì thuật tốn này khơng khả thi và chưa bao giờ được thực nghiệm. Tuy nhiên, phát mình này chỉ được cơng bố vào năm 1997 vì được xếp vào loại tuyệt mật. Thuật toán RSA được MIT đăng ký bằng sáng chế tại Hoa Kỳ vào năm 1983 (số đăng ký 4.405.829). Bằng sáng chế này hết hạn vào ngày 21 tháng 9 năm 2000. Tuy nhiên do thuật tốn đã được cơng bố trước khi có đăng ký bảo hộ nên sự bảo hộ hầu như khơng có giá trị bên ngồi Hoa Kỳ. Ngồi ra, nếu như cơng trình của Clifford Cocks đã được cơng bố trước đó thì bằng sáng chế RSA khơng thể được đăng ký.
3.1.2 Độ phổ biến và độ an toàn của RSA
Hiện tại, RSA đang là thuật tốn mã hóa bất đối xứng dùng nhiều nhất hiện nay, theo báo cáo của ECRYPT II [12], ta có bảng thống kê như sau:
Bảng 3: độ phổ biến và mức độ an tồn của RSA [12] Thuật tốn Kích thước
khóa
Mức độ phổ biến Mức độ an toàn Public Key Encryption Scheme
RSA PKCS#1 v 1.5 RSA OAEP RSA OAEP RSA OAEP Bất kỳ 1024 2048 ≥3072 *** * * * * * ** *** Public Key Signature Scheme
RSA PKCS# v1.5 1024 *** −
RSA PKCS# v1.5 2048 *** *
RSA PKCS# v1.5 ≥3072 − **
RSA PSS 2048 ** **
RSA PSS ≥3072 ** ***
Ghi chú:
- Mức độ phổ biến: mức đánh giá ba ngôi sao cho thấy mức độ triển khai rộng rãi nhất, không có sao nào cho thấy khơng có thơng tin thuật tốn đó được sử dụng.
- Mức độ an tồn: mức đánh giá ba ngơi sao chỉ ra rằng ECRYPT hoàn toàn tin tưởng vào sự an tồn của thuật tốn và kích thước khóa tương ứng, khơng có sao nào cho thấy thuật tốn và kích thước khóa tương ứng không nên tiếp tục sử dụng.
Từ thống kê trên ta nhận thấy rằng RSA-1024 hiện tại vẫn đang dùng rất phổ biến nhưng khơng cịn đảm bảo độ an tồn.
3.1.3 Một số điểm yếu khác
Thuật tốn RSA đã được cơng khai vào năm 1977 và hết hạn bản quyền sáng chế vào năm 2000, do đó hiện nay có nhiều nghiên cứu tấn cơng vào thuật toán này.
3.1.3.1 Năm cách tiếp cận có thể tấn cơng RSA
- Brute force (tấn công vét cạn): bằng cách thử tất cả các trường hợp của private key.
- Mathematical attack [13]: có nhiều phương pháp tấn công như: Integer Factoring attack, Wiener’s attack, Low public Exponent attack…
- Timing attack [14]: tấn công thời gian được sử dụng để phân tích sự khác biệt trong thời gian thực hiện thuật tốn mã hóa mà kết quả là do sự khác biệt trong các thông số đầu vào. Điều này giúp kẻ tấn cơng tìm thấy thơng tin bí mật, như hệ số mũ bí mật của RSA.
- Hardware fault-based attack [15]: gây ra lỗi phần cứng trong bộ tạo ra chữ ký điện tử RSA. Hiện nay, có thể sử dụng nền tảng FPGA để phá mã thu được private key của RSA-1024 trong khoảng 100 giờ.
Hình 3.1: fault-based attack RSA [15]
- Chosen ciphertext attack [16]: kiểu tấn cơng này khai thác các thuộc tính của thuật tốn RSA. Nó có thể thu hồi được plaintext, từ một ciphertext đã biết trong ít hơn log2n truy xuất oracle thực hiện các thuật toán, với n là hệ số RSA.
3.1.3.2 Back-door
Reuters thông tin rằng Cục an ninh quốc gia Hoa Kỳ (NSA) đã trả 10 triệu đô cho RSA (cơng ty sở hữu thuật tốn RSA) để tạo ra một hệ thống mật mã không đáng tin cậy được cài đặt mặc định trong phần mềm được sử dụng bởi một loạt chương trình trên internet và máy tính [17].
Hệ thống này gọi là Dual EC [18], là một bộ tạo số ngẫu nhiên, nhưng nó có lỗ hổng có chủ định – hay cịn gọi là “back door” cho phép NSA phá mã khi cần. 3.2 Thuật tốn mã hóa ECC
3.2.1 Giới thiệu
Đường cong elliptic – cũng như đại số hình học – được nghiên cứu rộng rãi trong vòng 150 năm trở lại đây, nhưng mãi đến năm 1985, hai nhà khoa học Neal Koblitz và Victor S. Miller đã độc lập nghiên cứu và đưa ra đề xuất ứng dụng lý thuyết toán học đường cong elliptic (elliptic curve) trên trường hữu hạn. Thành quả
này chính là tiền đề để áp dụng các lý thuyết của đường cong elliptic vào lĩnh vực mã hóa.
Ngày nay, hầu hết các sản phẩm và tiêu chuẩn có sử dụng thuật tốn mã hóa cơng khai để mã hóa và chữ ký điện tử thường dùng RSA. Nhưng chúng ta nhận thấy rằng chiều dài khóa để sử dụng an tồn thuật tốn mã hóa này đã tăng lên trong những năm gần đây, điều này đặt ra một vấn đề đó là mức độ tính tốn nặng hơn cho các ứng dụng sử dụng RSA. Gánh nặng này có hậu quả nghiêm trọng, đặc biệt cho các thiết bị sở hữu tài nguyên phần cứng thấp, các web server, các trang thương mại điện thử cần thực hiện một số lượng lớn giao dịch an tồn đồng thời.
Chính vì thế một thuật tốn cạnh tranh, thách thức RSA là Elliptic Curve Cryptography (ECC) ra đời. Sự hấp dẫn chủ yếu của ECC so với RSA là nó cung cấp cùng mức độ bảo mật nhưng sử dụng một khóa có kích thước nhỏ hơn, do đó giảm thiểu mức độ xử lý.
3.2.2 Độ phổ biến và an toàn của ECC:
Theo báo cáo của ECRYPT II [12], ta có bảng thống kê như sau: Bảng 4: độ phổ biến và an toàn của ECC [12]
Thuật tốn Kích thước khóa Mức độ phổ biến Mức độ an toàn Key Encapsulation Schemes
ECIES-KEM ≥256 − ***
Public Key Signature Schemes
EC-DSA 160 ** **
EC-DSA ≥256 * ***
Từ thống kê trên chúng ta thấy rằng ECC-256 là an toàn cho mọi ứng dụng ở hiện tại và tương lai.
3.3 So sánh thuật toán RSA và ECC 3.3.1 Về lý thuyết 3.3.1 Về lý thuyết
3.3.1.1 Kích thước khóa
Sự hấp dẫn chủ yếu của ECC so với RSA là nó cung cấp cùng một mức độ bảo mật nhưng sử dụng một khóa có kích thước nhỏ hơn, do đó giảm thiểu mức độ xử lý.
Bảng sau so sánh kích thước khóa giữa RSA và ECC ở cùng mức độ bảo mật: Bảng 5: so sánh kích thước khóa RSA và ECC ở cùng mức độ bảo mật [19]
Kích thước khóa Tỉ lệ kích thước khóa
RSA ECC 1024 160 7:1 2048 224 10:1 3072 256 12:1 7680 384 20:1 15360 521 30:1
Hình 3.2: biểu đồ so sánh kích thước khóa RSA và ECC ở cùng mức độ bảo mật [19]
Bảng 6: kích thước khóa và thời gian cần thiết để phá mã [20] ECC key size
(bits)
RSA key size (bits)
Year to attack Protection lifetime
160 1024 12 10 Đến trước năm 2010 224 2048 24 10 Đến trước năm 2030 256 3072 28 10 Sau năm 2031 384 7680 47 10 3.3.1.2 Hiệu suất
So sánh hiệu suất hai thuật toán RSA và ECC trong trường hợp tạo và xác thực chữ ký điện tử
Bảng 7: so sánh hiệu năng RSA và ECC [21] Thuật tốn Độ bảo mật Tính phức tạp Phạm vi sử dụng Tạo khóa Thời gian thực hiện Xác thực Tạo chữ ký RSA Cao Phân tích ra thừa số nguyên tố PC, laptops, siêu máy tính
Nhanh Chậm Nhanh Nhanh
ECC Cao Logarithm rời rạc Các thiết bị có phần cứng thấp, yếu. Nhanh hơn Nhanh Chậm Nhanh hơn 3.3.2 Về thực tế
Trong phần này, tôi áp dụng thuật tốn mã hóa bất đối xứng RSA và ECC để tạo và xác thực chữ ký điện tử trên cùng một ứng dụng, việc triển khai trên cùng một ứng dụng nhằm bỏ qua thời gian trễ lan truyền khi thực hiện quá trình tạo chữ ký điện tử và xác thực chữ ký ở hai ứng dụng khác nhau.
Ứng dụng được triển khai trên nền tảng Android. Việc lựa chọn nền tảng Android nhằm tạo tiền đề xây dựng phần mềm xác thực phía người dùng cho hệ thống kiểm sốt truy cập mới mà đề tài đang hướng tới. Bên cạnh đó Android cũng là nền tảng hệ điều hành cho thiết bị đi động phổ biến nhất hiện nay.
Như thống kê ở bảng 6, kích thước khóa an tồn đối với thuật tốn RSA là 3072 bit và ECC là 256 bit, do đó trong phần này tơi sẽ thực hiện so sánh tốc độ tạo khóa, tạo chữ ký điện tử và xác thực chữ ký giữa hai thuật toán RSA-3072 và ECC- 256.
3.3.2.1 Phần mềm triển khai trên smartphone Android cao cấp
Smart phone sử dụng trong phần này là Samsung Galaxy S8, có thơng số kỹ thuật như sau:
Bảng 8: thông số kỹ thuật Samsung Galaxy S8
Thông số Chi tiết
RAM 4GB
Chipset Exynos 8895
CPU 8 core (4 core 2.3 GHz + 4 core 1.7GHz), 64 bit, vi xử lý 10 nm
- Thuật toán RSA-3072:
Thực hiện lặp lại 10 lần, ta có kết quả đo như sau:
Bảng 9: kết quả đo tốc độ thực hiện RSA-3072 (Galaxy S8)
Lần thực hiện Tạo cặp khóa (ms) Tạo chữ ký (ms) Xác thực chữ ký (ms)
1 784 52 8 2 605 42 7 3 951 49 7 4 732 50 7 5 996 51 8 6 835 47 7 7 664 44 7 8 1096 50 7 9 1077 48 8 10 762 55 7 Trung bình 850.2 48.8 7.3
Hình 3.4: triển khai thuật tốn RSA-3072 trên Samsung Galaxy S8 - Thuật toán ECC-256: - Thuật toán ECC-256:
Thực hiện 10 lần, ta có kết quả đo như sau:
Bảng 10: kết quả đo tốc độ thực hiện ECC-256 (Galaxy S8)
Lần thực hiện Tạo cặp khóa (ms) Tạo chữ ký (ms) Xác thực chữ ký (ms)
1 43 14 108 2 47 13 117 3 40 14 119 4 38 12 118 5 41 10 117 6 44 10 117 7 47 4 118 8 49 10 115 9 43 9 110 10 40 9 114 Trung bình 43.2 10.5 115.3
Hình 3.6: so sánh hiệu năng RSA-3072 và ECC-256 trên Samsung Galaxy S8 3.3.2.2 Phần mềm triển khai trên smartphone Android cơ bản 3.3.2.2 Phần mềm triển khai trên smartphone Android cơ bản
Smart phone sử dụng trong phần này là Samsung Galaxy J3 Pro (2017), có thơng số kỹ thuật như sau:
Bảng 11: thông số kỹ thuật Samsung Galaxy J3 Pro
Thông số Chi tiết
RAM 2GB
Chipset Exynos 7570
CPU 4 core 1.4GHz
- Thuật toán RSA-3072
Bảng 12: kết quả đo tốc độ thực hiện RSA-3072 (Galaxy J3)
Lần thực hiện Tạo cặp khóa (ms) Tạo chữ ký (ms) Xác thực chữ ký (ms)
1 19359 85 11 2 12714 70 11 3 11169 72 11 4 13269 73 10 5 10766 83 11 6 15991 71 10 7 9994 74 10 8 11588 69 10 9 10366 72 10 10 9733 74 10 Trung bình 12494.9 74.3 10.4
Hình 3.7: triển khai thuật tốn RSA-3072 trên Samsung Galaxy J3 - Thuật toán ECC-256
Bảng 13: kết quả đo tốc độ thực hiện ECC-256 (Galaxy J3)
Lần thực hiện Tạo cặp khóa (ms) Tạo chữ ký (ms) Xác thực chữ ký (ms)
1 57 16 164 2 55 18 164 3 53 17 168 4 55 15 167 5 57 16 164 6 52 17 165 7 54 15 171 8 53 14 160 9 56 15 163 10 52 14 162 Trung bình 54.4 15.7 164.8
Hình 3.9: so sánh hiệu năng RSA-3072 và ECC-256 trên Samsung Galaxy J3 3.3.3 Lập trình ứng dụng 3.3.3 Lập trình ứng dụng
3.3.3.1 RSA-3072 - Tạo cặp khóa
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA"); keyPairGenerator.initialize(3072,new SecureRandom());
KeyPair keyPair = keyPairGenerator.generateKeyPair();
publicKey = keyPair.getPublic(); privateKey = keyPair.getPrivate();
- Tạo chữ ký điện tử
String origin = txtChuoi.getText().toString();
byte[] chuoiInput = origin.getBytes("UTF-8");
sig = Signature.getInstance("SHA256withRSA"); sig.initSign(privateKey);
sig.update(chuoiInput); signatureBytes = sig.sign();
- Xác thực chữ ký điện tử
String origin = txtChuoi.getText().toString();
sig = Signature.getInstance("SHA256withRSA","SC"); sig.initVerify(publicKey);
byte[] chuoiInput = origin.getBytes("UTF-8");
sig.update(chuoiInput); txtVerify.setText(sig.verify(signatureBytes)+""); 3.3.3.2 ECC-256 - Tạo cặp khóa ECNamedCurveParameterSpec spec = ECNamedCurveTable.getParameterSpec("prime256v1"); KeyPairGenerator g = KeyPairGenerator.getInstance("ECDSA","SC"); g.initialize(spec, new SecureRandom());
KeyPair keyPair = g.generateKeyPair();
privateKey = keyPair.getPrivate(); publicKey = keyPair.getPublic();
- Tạo chữ ký điện tử
String origin = txtChuoi.getText().toString();
byte[] chuoiInput = origin.getBytes("UTF-8");
sig = Signature.getInstance("SHA256withECDSA","SC"); sig.initSign(privateKey); sig.update(chuoiInput); signatureBytes = sig.sign(); txtSign.setText(Base64.encodeToString(signatureBytes,Base64.DEFAULT)); - Xác thực chữ ký điện tử
String origin = txtChuoi.getText().toString();
sig = Signature.getInstance("SHA256withECDSA","SC"); sig.initVerify(publicKey);
byte[] chuoiInput = origin.getBytes("UTF-8");
sig.update(chuoiInput);
txtVerify.setText(sig.verify(signatureBytes)+"");
3.3.4 Kết luận
Từ so sánh về lý thuyết và thực tế, chúng ta có thể thấy rằng, tuy thuật tốn mã hóa ECC chậm hơn RSA trong việc xác thực chữ ký điện tử nhưng tổng thời gian trung bình để thực hiện là nhỏ hơn rất nhiều so với RSA, đặc biệt đối với các thiết bị có tài nguyên thấp. Bên cạnh đó, do thuật tốn RSA đã phát triển, sử dụng rộng rãi và hết hạn bằng sáng chế từ lâu nên thuật toán này phải đối mặt với nhiều nguy cơ hơn ECC (3.1.2 – 3.1.3). Do đó, trong đề tài luận văn này tơi quyết định chọn ECC- 256 để áp dụng cho hệ thống access control mới.
Hình 3.10: tổng thời gian thực hiện t/bình giữa RSA-3072 và ECC-256 (Galaxy S8)
4 Chương 4: Chứng thực khóa cơng khai (Certificate Authority - CA)
4.1 Giới thiệu
Trong chương 2, tôi đã giới thiệu về cách thức hoạt động của mã hóa bất đối xứng, khóa cơng khai (public key) trong mã hóa bất đối xứng có thể được biết bởi bất cứ ai mà không ảnh hưởng đến độ an tồn của thơng tin cần giữ bí mật. Tuy nhiên, điều này cũng gây ra một vấn đề đó là: “Khi Alice muốn gửi thơng tin bí mật cho Bob thì Alice cần biết khóa cơng khai của Bob, Bob phải gửi public key của mình cho Alice. Tuy nhiên, Truty cũng có khả năng đưa cho Alice một public key và giả mạo đó là khóa của Bob. Bằng cách này Truty có thể đọc mọi thơng tin mà Alice gửi cho Bob”. Vấn đề đặt ra là làm sao Alice biết khóa cơng khai nhận được chính là khóa của Bob, người mà mình muốn truyền thơng tin bí mật?
Vấn đề này được giải quyết bằng cách có một tổ chức thứ ba được mọi người tin cậy, đứng ra chứng nhận public key cho mỗi người. Bên thứ ba này phát hành một chứng nhận khóa cơng khai (public key certificate), một loại văn bản điện tử kết hợp chữ ký số để ràng buộc public key cùng danh tính của chủ sở hữu khóa. Tổ chức này được gọi là nhà cung cấp chứng nhận số, gọi tắt là CA (Certificate Authority). 4.2 Các loại chứng nhận số
Để khóa cơng khai của mình được chứng nhận, mỗi bên tham gia phải tạo một cặp khóa và gửi public key cho CA. Bên tham gia phải gửi kèm các thông tin về bản thân như tên, địa chỉ,…đến CA. CA chứng nhận khóa cơng khai bằng cách ký nhận chúng. Nếu các bên cịn lại tin tưởng vào CA thì họ có thể tin vào chữ ký của CA đó. Chứng nhận này là một tập tin nhị phân có thể dễ dàng chuyển đổi qua mạng máy tính và có một số chuẩn như sau:
4.2.1 Chứng nhận X.509
Chứng nhận X.509 là chứng nhận khóa cơng khai phổ biến nhất. Hiệp hội viễn thông quốc tế (International Telecommunication Union – ITU) đã chỉ định chuẩn
X.509 vào năm 1988 [24] – đây là phiên bản 1 của chuẩn X.509. Vào năm 1993, phiên bản 2 của chuẩn X.509 được phát hành với 2 trường nhận dạng được bổ sung. Phiên bản 3 của chuẩn X.509 được phát hành vào năm 1997.
Thông tin về các trường của chuẩn X.509 v3
Version Serial Number Signature Algorithm Issuer Name Validity Period Subject Name Public Key Issuer Unique ID Subject Unique ID Extensions Signature Hình 4.1: X.509 v3
- Version: cho biết thông tin phiên bản của chứng nhận X.509
- Serial Number: số seri được gán bởi CA. Mỗi CA nên gán một số seri duy nhất cho mỗi chứng nhận mà nó phát hành
- Signature Algorithm: thuật toán chữ ký điện tử mà CA sử dụng để ký chứng nhận. Trong chứng nhận X.509 thường là sự kết hợp giữa thuật toán băm