Khám phá các giải thuật mã hóa khóa công khai: RSA, MD5 và những giải thuật quan trọng khác

MỤC LỤC

Lý thuyết về mật mã khóa công khai

Whitfield Diffie, một trong những người khám phá ra mật mã khóa công khai (cùng với Martin Hellman) đã giải thích rằng yêu cầu này đã phủ định bản chất của mật mã: khả năng bảo vệ tính bí mật hồn hảo qua việc truyền thông riêng của bạn: “Nó sẽ làm tốt như thế nào sau mọi sự phát triển, hệ thống không thể xuyên qua được nếu các user bị bắt buộc tham gia (share) các khóa của nó với một KDC mà có thể được thỏa hiệp bởi kẻ trộm?”. - Bảng sau tóm tắt một số khía cạnh quan trọng về mã hóa quy ước và mã hóa công khai: để phân biệt giữa hai loại, chúng ta sẽ tổng quát hóa liên hệ khóa sử dụng trong mã hóa quy ước là khóa bí mật, hai khóa sử dụng trong mã hóa công khai là khóa công khai và khóa bí mật.

Các yêu cầu của mật mã khóa công khai

Có thể nhận thấy rằng việc tính Y=f(X) thì dễ dàng trong khi tính X=f –1(Y) là không thể thấy trước. Nói chung từ “dễ dàng” được xác định bởi 1 bài tốn là nó có thể được giải quyết trong thời gian nhất định (hàm của chiều dài input).

Giải thuật RSA (Rivest, Shamir và Adleman – 1977)

Sự che dấu thông tin trong hệ thống RSA

Hệ thống RSA có một đặc điểm đặc trưng là thông tin không phải luôn luôn được che dấu.

Các giải thuật tốn học được sử dụng trong RSA

- Để kiểm tra tính tồn vẹn của một khối data lớn, người ta sử dụng chữ ký số để đại diện cho khối data đó (giống như chữ ký trên văn bản) bằng cách dùng hàm băm: với input là một message bất kỳ, output là một chuỗi bít có chiều dài xác định trước, chuỗi bít này được gọi là message_digest. + 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.

Hình 1: Tạo message_digest sử dụng MD5.
Hình 1: Tạo message_digest sử dụng MD5.

Phân bố các khóa bảo mật 1. Sự tiền phân bố khóa

- Sơ đồ được xét trên Zp, với p là số nguyên tố, α là phần tử đơn giản của Zp , giá trị của p và α là công khai với mọi người trong mạng, ID(U) sẽ biểu thị thông tin định danh nhất định cho mỗi user trong mạng (ví dụ: tên, địa chỉ email, số điện thoại hay các thông tin thích hợp khác). Tuy nhiên việc phỏng đốn không chứng minh rằng bất kỳ giải thuật mà giải bài tốn Diffie_Hellman cũng có thể được sử dụng để giải bài tốn Discrete Log (giống như trong giải thuật RSA , việc bẻ gãy RSA thì tương đương với việc phân tích thừa số). Trong hệ thống mật mã không đối xứng (hệ thống khóa công khai), bất kỳ một thực thể nào cũng có thể tạo ra một cặp khóa cho riêng mình, trong đó một khóa là công khai, được gởi đi trên kênh truyền thông (không bảo mật), khóa còn lại (khóa bí mật) được bảo mật tại nơi tạo ra nó.

Quản lý khóa

Như vậy mục tiờu của quản lý khúa là bảo đảm cỏc khúa mó húa khụng bao giờ ở dạng rừ khi chỳng ở bên ngồi hệ mật mã, ngoại trừ dưới các điều kiện mật trong khi các khóa được khởi tạo lần đầu tiên, được phân bố và được cài đặt hoặc khi chúng được lưu trữ hoặc phục hồi nhằm đảm bảo an tồn khi có hư hỏng. Ngồi ra có thể kiểm tra khóa có hợp lệ hay không như sơ đồ sau (h3.1): mã hóa đoạn tin M bằng khóa KM, sau đó cất EKM(M) và M vào bộ nhớ, khi có yêu cầu kiểm tra tính xác thực của KM thì M sẽ được lấy từ bộ nhớ và mã hóa nó bằng khóa KM đang xét, kết quả mã hóa sẽ được so sánh với EKM(M) có trong bộ nhớ: nếu giống nhau thì khóa KM được coi là hợp lệ. - Giả sử ta muốn bảo vệ dữ liệu được lưu trữ giống như đã bảo vệ dữ liệu được truyền nghĩa là ta muốn sử dụng một khóa phiên liên lạc ở dạng EKM0(KS) như dữ liệu nhập cho các tác vụ mã hóa dữ liệu và giải mã dữ liệu nhằm mục đích tạo lập và phục hồi các tập tin dữ liệu.

Các Tiêu Chuẩn

Tiêu chuẩn mật mã khóa công khai

Cần chú ý rằng trước khi nhập và sau khi xuất trong các thao tác mật mã đoạn tin phải được biến đổi từ xâu sang số nguyên (khi nhập) hoặc từ số nguyên sang xâu (khi xuất). Nếu hai byte đầu của EM khác 0 và 2 hay nếu không có byte 0 để tách PS khỏi M thì xuất “lỗi giải mã” và dừng.

Tiêu chuẩn chứng thực khóa công khai X.509

- Nếu các user ở trong một mạng truyền thông lớn thì không thể áp dụng cho tất cả các user mô tả cùng một CA bởi vì CA ký chứng thực, mỗi user tham gia phải có một bản sao khóa công khai của riêng CA để làm rỏ chữ ký. Ở mức tối thiểi đoạn tin bao gồm: timestamp tA (gồm có thời gian tạo và thời gian hết hạn), nonce rA, định danh của B, sgnData (chữ ký), Kab (khóa phiên liên lạc được mã hóa bằng khóa công khai của B). Giá trị rA là duy nhất trong thời gian hợp lệ của đoạn tin, nó được sử dụng để chống lại các cuộc tấn công lặp lại và nó được lưu trữ ở B cho đến khi hết hạn, B sẽ không nhận bất kỳ đoạn tin mới nào có rA tương tự.

Thuyết minh chương trình

Giới thiệu

Vấn đề quan trọng là phải đảm bảo tính xác thực của cặp khóa RSA (đặc biệt là khóa công khai) nghĩa là khi người gởi sử dụng khóa công khai KU của một người nào đó thì phải đảm bảo khóa công khai đó là của chính người đó chứ không phải của một người nào khác (người muốn giả dạng). Chương trình này cũng không ngồi mục đích đó, xây dựng server tạo khóa cho user, thông qua web server user có thể xem khóa công khai của các user khác thông qua thư mục khóa công khai và nếu có yêu cầu thì server sẽ tạo cặp khóa RSA cho user. Khóa công khai được cập nhật vào thư mục khóa công khai, còn khóa bí mật thì được mã hóa bằng khóa DES mà cả server lẫn user cùng sử dụng (một cách đơn giản là sử dụng password của user) và được gởi trở về cho user (user sẽ sử dụng password của mình để giải mã, tìm được khóa bí mật RSA).

Các hằng

Tất cả các số tự nhiên (DIGIT) có nhiều nhất MAX_NN_DIGITS chữ số, ngoại trừ các giá trị trung gian có chiều dài gấp đôi trong NN_Mult(t), NN_ModMult(t), NN_ModInv(w), NN_ModDiv(c). R_ENVELOPE_CTX: cung cấp một ngữ cảnh (context) cho các quá trình sealing (mã hóa) và openning (giải mã) một envelope. RE_LEN: chiều dài khóa phiên liên lạc ngồi vùng hay data được cung cấp trong RSA quá lớn so với khóa đã cung cấp.

Các tập tin nguồn (*.c)

    R_RandomCreate: tạo và khởi tạo một cấu trúc random tươi (fresh) sử dụng data từ đồng hồ hệ thống hiện tại, thông qua hàm gmtime của ANSI (hàm này chủ yếu sử dụng biến tách biệt RANDOM_BYTES_INT để chỉ lượng byte tổng hợp, hiện tại thiết lập ở 512). Kiểm tra xem số a có chiều dài adigits có phải là số nguyên tố hay không: nếu a nhỏ (chẳng hạn a < 9000) thì xem a có nằm trong bảng chứa các số nguyên tố hay không, ngược lại nếu a lớn thì ta sử dụng định lý Fermat để kiểm tra khả năng nguyên tố của a. Khi thành công trả về 0, dãy encryptedKeys chứa khóa công khai đã mã hóa khóa phiên liên lạc (cho mỗi khóa công khai được cung cấp) và encryptedKeyLens chứa chiều dài khóa mã hóa tương ứng, iv chứa vectơ khởi tạo của DES.

    Các tập tin demo (*.c)

      Sau khi user nhập các thông tin về bản thân (ví dụ: tên, định danh, địa chỉ, passsword, user mới hay cũ, chiều dài khóa…), nếu là user cũ thì chương trình sẽ tìm trong thư mục usrpass xem có user này không, nếu có thì tiếp tục, ngược lại thì yêu cầu user nhập lại thông tin, còn nếu là user mới thì cập nhật vào thư mục usrpass và tiếp tục. Sau khi user nhập các thông tin về bản thân (ví dụ: tên, định danh, địa chỉ, passsword, user mới hay cũ, chiều dài khóa…), nếu là user cũ thì chương trình sẽ tìm trong thư mục usrpass xem có user này không, nếu có thì tiếp tục, ngược lại thì yêu cầu user nhập lại thông tin, còn nếu là user mới thì cập nhật vào thư mục usrpass và tiếp tục. Sau đó yêu cầu user nhập vào user muốn tìm, nếu user này có trong thư mục khóa công khai thì in ra khóa công khai của user này, ngược lại báo “không có khóa công khai này, nhập lại thông tin cần tìm”.