EJBCA sử dụng gói thư viện mã hóa mã nguồn mở Bouncy Castle (gọi tắt là BC) trong mọi quy trình mã hóa và giao thức của mình nhằm mang lại tính cẩn mật, toàn vẹn, xác thực và không thể chối từ. Gói thư viện mã hóa này là một thực thi Java của các thuật toán mã hóa, được phát triển bởi công ty Legion of the Bouncy Castle. Gói thư viện này được tổ chức nhằm cung cấp một giao tiếp lập trình ứng dụng (Application Program Interface – API) “gọn nhẹ” (light-weight) phù hợp cho việc sử dụng trong bất kỳ môi trường nào (bao gồm cả phiên bản J2EE mới nhất) với hạ tầng bổ sung để các thuật toán phù hợp với cơ cấu mở rộng mã hóa Java (Java Cryptography Extension – JCE) .
API mã hóa của Bouncy Castle cho Java bao gồm các phần sau:
Một API mã hóa gọn nhẹ cho Java và C#.
Một provider cho JCE và kiến trúc mã hóa Java (Java Cryptography Architecture – JCA).
Một thư viện cho việc đọc và ghi các đối tượng ASN.1 được mã hóa.
Một API TLS24 phía trình khách “gọn nhẹ”.
Các bộ phát sinh cho chứng nhận X.509 phiên bản 1 và 3, CRL phiên bản 2 và các tập tin PKCS #12.
Các bộ phát sinh cho chứng nhận thuộc tính X.509 phiên bản 2.
Các bộ phát sinh/xử lý cho S/MIME và CMS (PKCS #7/RFC 3852).
Các bộ phát sinh/xử lý cho OCSP (RFC 2560).
Các bộ phát sinh/xử lý cho TSP (RFC 3161).
Các bộ phát sinh/xử lý cho OpenPGP (RFC 2440).
Một phiên bản jar được ký phù hợp cho JDK 1.4-1.6 và Sun JCE.
API nhỏ gọn làm việc với mọi thứ từ J2ME đến JDK 1.6 và cũng có một API trong C# cung cấp hầu hết những chức năng tương tự như trên.
Như đã trình bày ở Chương 2, đề tài này quan tâm đến hệ mã khóa công khai RSA và các ứng dụng của nó trong mã hóa và chữ ký số nên các hàm liên quan đến hệ mã
24
TLS (Transport Layer Security) là giao thức mật mã cung cấp các giao tiếp an toàn trên Internet như cho trình duyệt web, thư điện tử, gửi tin nhắn tức thời, trao đổi dữ liệu, … Tiền thân của TLS chính là giao thức SSL (Secure Sockets Layer).
RSA được đặc biệt chú ý. Hàm sinh khóa genKeys của EJBCA trong lớp KeyTool thuộc gói org.ejbca.util như sau:
public static KeyPair genKeys(String keySpec, String keyAlg)
throws NoSuchAlgorithmException, NoSuchProviderException, InvalidAlgorithmParameterException {
…
KeyPairGenerator keygen = KeyPairGenerator.getInstance(keyAlg, "BC");
…
// RSA keys
int keysize = Integer.parseInt(keySpec); keygen.initialize(keysize);
…
KeyPair keys = keygen.generateKeyPair(); …
return keys; }
Hình 8.2. Hàm phát sinh khóa RSA của EJBCA
Ta thấy biến keygen có kiểu KeyPairGenerator (thuộc gói java.security) sẽ nhận thực thể của provider BC nếu được. Nếu gói thư viện BC này chưa được cài đặt, nó sẽ lấy thực thể mặc định của Java. Đây là thao tác kiểm tra trong trường hợp người sử dụng quên cài đặt gói thư viện BC này.
Lệnh keygen.generateKeyPair nhằm phát sinh cặp khóa. Khi thuật toán được chọn là RSA, hàm RSAKeyPairGenerator của BC (lớp RSAKeyPairGenerator thuộc gói org.bouncycastle.crypto.generators) sẽ được thực hiện. Thuật toán phát sinh cặp khóa RSA được hàm này sử dụng như sau:
RSAKeyPairGenerator(e, strength)
Đầu vào: số nguyên 𝑒 là số mũ công khai, 𝑠𝑡𝑟𝑒𝑛𝑔𝑡 là độ dài khóa.
Đầu ra: cặp khóa công khai 𝑛, 𝑒 và bí mật 𝑛, 𝑑 . (1) 𝑝𝐵𝑖𝑡𝐿𝑒𝑛𝑔𝑡 ← (𝑠𝑡𝑟𝑒𝑛𝑔𝑡 + 1)/2.
(2) 𝑞𝐵𝑖𝑡𝐿𝑒𝑛𝑔𝑡 ← 𝑠𝑡𝑟𝑒𝑛𝑔𝑡 − 𝑝𝐵𝑖𝑡𝐿𝑒𝑛𝑔𝑡.
(3) Chọn một số nguyên ngẫu nhiên 𝑝, độ dài 𝑝𝐵𝑖𝑡𝐿𝑒𝑛𝑔𝑡.
(4) Nếu 𝑝 không là số nguyên tố hoặc 𝑔𝑐𝑑(𝑒, 𝑝) ≠ 1 thì trở lại bước (3). (5) Chọn một số nguyên ngẫu nhiên 𝑞, độ dài 𝑞𝐵𝑖𝑡𝐿𝑒𝑛𝑔𝑡.
(6) Nếu 𝑞 không là số nguyên tố hoặc 𝑔𝑐𝑑(𝑒, 𝑞) ≠ 1 hoặc độ dài của 𝑝 × 𝑞 khác
𝑠𝑡𝑟𝑒𝑛𝑔𝑡 thì quay lại bước (5). (7) 𝑛 ← 𝑝 × 𝑞.
(8) 𝑝𝑖 ← 𝑝 − 1 × (𝑞 − 1). (9) 𝑑 ← 𝑒−1 𝑚𝑜𝑑 𝑝𝑖.
(10) Trả về (𝑛, 𝑒) và (𝑛, 𝑑).
Theo các phân tích ở Chương 5, các số nguyên tố 𝑝 và 𝑞 được sinh ra ở bước (3) và (5) trong Thuật toán 8.1 trên nên là các số nguyên tố mạnh (strong prime) thay vì các số nguyên tố ngẫu nhiên nhằm tránh các phương pháp tấn công phân tích đặc biệt. Vì vậy, phần sinh khóa của RSA sẽ được thay bằng phần sinh khóa của thư viện mã hóa SmartRSA được xây dựng và giới thiệu ở Chương 7.
8.2.3 Nhận xét
Bouncy Castle là gói phần mềm mã hóa mã nguồn mở cung cấp các chức năng nhằm mang lại tính cẩn mật, toàn vẹn, xác thực và không thể chối từ cho bất kỳ hệ thống nào sử dụng nó, điển hình là hệ thống EJBCA. Với việc cải tiến hàm sinh khóa RSA của gói phần mềm mã hóa này bằng hàm sinh khóa mạnh của bộ thư viện SmartRSA đã được trình bày ở Chương 7, hệ thống EJBCA sẽ mang lại độ an toàn và hiệu quả cao hơn khi đi vào sử dụng trong thực tế.