Bài gốc: https://manhhomienbienthuy.github.io/2017/02/20/he-ma-hoa-rsa-va-chu-ky-so.html tác giả)
Trong bài viết trước chúng ta đã tìm hiểu về chứng chỉ https và ssl. Trong số đó, chúng tôi đã biết rằng chứng chỉ ssl cần được chứng thực bằng chữ ký số. Trên thực tế, không chỉ trong chứng chỉ SSL, chữ ký số là một công nghệ rất quan trọng, có ứng dụng trong nhiều lĩnh vực khác nhau. Trong bài viết này, chúng ta sẽ xem xét kỹ hơn về chữ ký điện tử cũng như cách tạo và xác minh chúng.
Mật mã bất đối xứng, còn được gọi là mật mã khóa công khai, là một hệ thống mã hóa sử dụng một cặp khóa để mã hóa và giải mã: khóa chung dùng để mã hóa và khóa riêng dùng để giải mã.
Trong hệ thống mã hóa này, bất kỳ ai cũng có thể mã hóa tin nhắn bằng khóa chung và gửi tin nhắn đó cho người nhận. Nhưng rõ ràng chủ sở hữu của khóa riêng sẽ giữ bí mật để chỉ anh ta mới có thể giải mã được.
Thông thường, cặp khóa được tạo này sẽ cố gắng gây khó khăn (gần như không thể) để truy xuất khóa riêng tư từ khóa chung. Vì vậy, bất kỳ kẻ tấn công nào lấy được khóa chung (dễ dàng) đều không thể lấy được khóa riêng để giải mã.
Tuy nhiên, thực tế phũ phàng hơn nhiều. Hoàn toàn không có thuật toán nào đạt được lý tưởng như vậy. Các thuật toán tạo khóa hiện tại chỉ bảo vệ chống lại các kỹ thuật bẻ khóa thông thường sử dụng máy tính cá nhân. Với sự phát triển của siêu máy tính và máy tính lượng tử, hệ thống mật mã bất đối xứng cũng đang phải đối mặt với nhiều thách thức.
Chữ ký số là một dạng chữ ký điện tử. Nó là một dạng dữ liệu được sử dụng để xác thực các dữ liệu khác. Chúng ta sẽ xem cách xác thực hoạt động trong phần tiếp theo.
Chữ ký số sử dụng hệ thống mã hóa bất đối xứng. Trong hầu hết các trường hợp, nó thậm chí còn kiểm tra tính toàn vẹn của dữ liệu. Chữ ký điện tử tương tự như chữ ký viết tay theo nhiều cách, nhưng khó cài đặt và sử dụng hơn nhiều.
Trong phần tiếp theo, chúng ta sẽ học cách sử dụng hệ thống mã hóa bất đối xứng cổ điển rsa cho chữ ký điện tử.
RSA là một hệ thống mã hóa bất đối xứng được phát triển bởi Ron Rivest, Adi Shamir và Leonard Adleman (tên cũng là tên viết tắt của ba tác giả) và được sử dụng rộng rãi trong công nghệ mật mã và chữ ký điện tử. Trong hệ thống mật mã này, khóa công khai có thể được chia sẻ công khai cho mọi người. Hoạt động của rsa dựa trên 4 bước chính: tạo khóa, chia sẻ khóa, mã hóa và giải mã.
Khóa cơ bản của tạo khóa trong rsa là tìm bộ 3 số tự nhiên e, d, n sao cho:
Một điểm nữa không thể không nhắc đến đó là cần đảm bảo tính an toàn của d, để dù biết e, n hay cả m thì cũng không tìm được d.
Khóa rsa cụ thể được tạo như sau:
- Chọn 2 số nguyên tố p và q
- Tính n = pq. Sau này n sẽ được sử dụng làm mô đun trong khóa công khai và khóa riêng.
- Tính toán các số giả nguyên tố bằng cách sử dụng phi hàm carmichael như sau: λ(n) = bcnn(λ(p), λ(q)) = bcnn(p − 1, q − 1). Giá trị này sẽ được giữ kín.
- Chọn một số tự nhiên e trong khoảng (1, λ(n)), sao cho ucln(e, λ(n)) = 1, tức là e và λ(n) nguyên tố cùng nhau.
- Tính số d sao cho d ≡ 1/e (mod λ(n)) hoặc dễ viết hơn là de ≡ 1 (mod λ(n)). Số d được gọi là mô đun nghịch đảo của e (modulo mod λ(n)).
Khóa chung là bộ (n, e) và khóa riêng là bộ (n, d). Chúng ta cần phải rất cẩn thận trong việc giữ khóa bí mật và các số nguyên tố p và q, bởi vì từ chúng, chúng ta có thể tính toán khóa rất dễ dàng.
Trong thực tế, để mã hóa và giải mã nhanh hơn, chúng ta thường chọn e nhỏ hơn. Một giá trị thường được sử dụng là e = 65537. Ngoài ra, chúng ta có thể sử dụng hàm không phải Euler φ(n) = (p − 1)(q − 1) để tính số giả nguyên tố và sử dụng nó làm λ(n) . Vì φ(n) là bội số của λ(n), nên một số d sao cho de ≡ 1 (mod φ(n)) cũng sẽ thỏa mãn d ≡ 1/e (mod λ(n)). Tuy nhiên, một số tác dụng phụ của việc này là d thường sẽ trở nên lớn hơn mức cần thiết.
Mã hóa và giải mã
Trong phần này, chúng ta sẽ tìm hiểu cách mã hóa bằng khóa chung (n, e) và giải mã bằng khóa riêng (n, d).
Nếu có bản rõ m thì cần chuyển nó thành số tự nhiên m trong khoảng (0, n) sao cho m, n nguyên tố cùng nhau. Điều này được thực hiện dễ dàng bằng cách thêm các kỹ thuật đệm. Tiếp theo, chúng ta chuyển đổi m, sang c như sau:
Giá trị c sau đó sẽ được gửi đến người nhận.
Bên nhận sẽ giải mã từ c để ra m như sau:
Có thể lấy tin nhắn từ m bằng cách đảo ngược phần đệm
Hãy lấy một ví dụ đơn giản:
Ta chọn e = 5 vì ucln(5, 24) = 1, và cuối cùng là d = 29 vì ed – 1 = 29×5 – 1 chia hết cho 24.
Giả sử m = 32 (dấu cách), ta mã hóa m thành
Giải mã c để lấy m
Đây là bản gốc m. Bạn có thể mth các giá trị khác nhau và xem thuật toán có chính xác không. Tất nhiên, nó đã được chứng minh. Chứng minh rằng rsa hoạt động chính xác là một vấn đề toán học khá phức tạp và sẽ không được thảo luận chi tiết trong bài viết này.
Tính bảo mật của RSA phụ thuộc phần lớn vào khả năng phân tích số lượng lớn. Bởi vì chúng tôi công bố rộng rãi, việc tiết lộ thông tin cá nhân là không thể tránh khỏi nếu việc phân tích thừa số nguyên tố đơn giản.
Do đó, khi tạo khóa ta cần chọn ngẫu nhiên các số nguyên tố p và q. Bản thân hai số nguyên tố cũng rất lớn và để làm cho việc phân tích bao thanh toán trở nên khó khăn hơn, hai số nguyên tố sẽ không có cùng độ dài. Trong tương lai gần, có lẽ sẽ không có cách nào hiệu quả để PC thực hiện công việc này.
Tuy nhiên, với sự phát triển của công nghệ, ngày càng có nhiều siêu máy tính ra đời. Cùng với các máy tính lượng tử của chúng tôi cho phép tính toán ở tốc độ cao hơn nhiều, có thể phá vỡ tính bảo mật của rsa.
Thuật toán của Shor đã được phát triển từ năm 1993 và đã chỉ ra rằng máy tính lượng tử có thể giải các bài toán phân tích thừa số trong thời gian đa thức. May mắn thay, đây chỉ là những lý thuyết, vì máy tính lượng tử hiện tại và trong nhiều năm tới vẫn chưa hoàn hảo.
Một câu hỏi thú vị là liệu vai trò của khóa công khai và khóa riêng tư có thể hoán đổi cho nhau hay không? tức là chúng ta có mã hóa bằng khóa riêng và giải mã bằng khóa chung không? Câu trả lời là có. Tuy nhiên, không ai làm điều đó vì nó quá đơn giản: lấy khóa riêng từ khóa chung thì khó, nhưng lấy khóa chung từ khóa riêng thì dễ. Nếu chúng tôi đưa khóa riêng cho người khác (để họ mã hóa nó), kẻ tấn công trung gian có thể dễ dàng tính toán khóa chung và thay đổi hoàn toàn cuộc trò chuyện của chúng tôi. Điều đó quá nguy hiểm.
Tuy nhiên, trong một số trường hợp, chúng tôi đảo ngược vai trò của khóa riêng và khóa chung như thế này. Đây là lúc chúng ta sử dụng chữ ký điện tử.
Việc sử dụng hệ thống mã hóa rsa để ký và xác minh chữ ký số cũng tương tự như quy trình mã hóa và giải mã ở trên. Tuy nhiên, vai trò của khóa công khai và khóa riêng thay đổi một chút.
Để tạo chữ ký, người gửi sẽ sử dụng khóa riêng và người nhận sẽ sử dụng khóa chung để xác thực chữ ký.
Tuy nhiên, do độ dài của tin nhắn nên việc mã hóa toàn bộ tin nhắn sẽ tốn thời gian. Vì vậy, trong thực tế, chữ ký điện tử thường sử dụng phương pháp mã hóa giá trị băm của thông điệp. Điều này mang lại nhiều lợi ích, chẳng hạn như:
- Các hàm băm là các hàm một chiều, vì vậy ngay cả khi bạn có hàm băm, bạn cũng không có cách nào biết thông điệp ban đầu trông như thế nào.
- Độ dài hàm băm là cố định, thường nhỏ nên các số không chiếm nhiều dung lượng.
- Giá trị băm cũng có thể được sử dụng để kiểm tra xem tin nhắn nhận được đã hoàn tất chưa?
Chữ ký số có giá trị hơn chữ ký tay. Có lẽ vì điều này, chữ ký điện tử phức tạp hơn một chút so với chữ viết tay truyền thống.
Xác định nguồn
Mã hóa bất đối xứng cho phép ký bằng khóa riêng mà chỉ chủ sở hữu mới biết. Sau khi nhận được gói, người nhận xác minh chữ ký bằng khóa công khai đã giải mã, sau đó tính toán hàm băm của thông điệp gốc và so sánh nó với hàm băm trong gói nhận được. Hai chuỗi này phải khớp với nhau. Tất cả các hệ thống mật mã rsa vẫn có một số thách thức về bảo mật, nhưng nó vẫn rất an toàn.
Dữ liệu còn nguyên
Thông báo được gửi bởi chủ sở hữu khóa riêng tư rất khó có khả năng bị giả mạo. Bởi vì nếu thông báo thay đổi, hàm băm cũng phải thay đổi. Tất nhiên, một kẻ nghe trộm trên mạng có thể tìm cách đọc tin nhắn gốc và hàm băm của nó. Nhưng anh ta không thể thay đổi tin nhắn vì anh ta không có khóa riêng để sửa đổi chữ ký điện tử cho phù hợp.
Chữ ký số không thể chối bỏ
Trong một giao dịch, gói được ký điện tử giúp dễ dàng tìm ra nguồn của chữ ký. Vì khóa riêng là bí mật và chỉ chủ sở hữu của nó biết nên họ không thể phủ nhận rằng chữ ký không phải do họ cấp. Tương tự như trên, rsa hay bất kỳ hệ thống mã hóa nào khác đều có vấn đề về bảo mật nên không thể đảm bảo chính xác tuyệt đối.
Công nghệ luôn thay đổi từng ngày và các giao dịch điện tử, đặc biệt là thương mại điện tử không ngừng diễn ra từng ngày, từng giây. Chữ ký điện tử là một kỹ thuật cho phép xác định chủ sở hữu của dữ liệu cụ thể và kiểm tra tính toàn vẹn của dữ liệu.
Ở nước ta, chữ ký số được sử dụng nhiều trong hoạt động ngân hàng, kế toán. Nhưng trong tương lai gần, khi chúng ta tiến tới một thế giới không có bút và giấy, chữ ký điện tử có thể sẽ trở nên phổ biến hơn.