Sau khi tạo một cặp khóa, chúng tôi có thể chọn khóa nào sẽ là riêng tư hay công khai không?
Không, nói chung chúng ta không thể. Cho hầu hết hệ thống mật mã bất đối xứng khóa riêng và khóa chung là các loại đối tượng hoàn toàn khác nhau (ví dụ: một khóa có thể là số và khóa kia là một điểm trên đường cong elip) và không có cách nào để sử dụng khóa này thay cho khóa kia.
Tuy nhiên, có một gần như ngoại lệ đáng chú ý: hệ thống mật mã RSA có khóa công khai và khóa riêng có thể được biểu diễn dưới dạng cùng một loại đối tượng (mô đun và số mũ) và được sử dụng trong cùng một phép toán (lũy thừa mô-đun) để mã hóa và giải mã tin nhắn. Cho nên, trên lý thuyết, người ta có thể tạo cặp khóa RSA "đối xứng" (như được mô tả trong câu hỏi này) rồi chọn xuất bản một nửa và giữ riêng tư một nửa.
Tuy nhiên, trên thực tế, ngay cả việc tạo khóa RSA cũng không hoạt động theo cách đó vì một số lý do:
Sẽ hiệu quả hơn khi chọn số mũ công khai là một số nhỏ cố định với dạng đơn giản ở dạng nhị phân. (Các lựa chọn phổ biến là 3 và 65537 = 216 + 1.) Điều này an toàn khi thực hiện đối với khóa chung, nhưng rõ ràng sẽ không an toàn nghiêm trọng đối với khóa riêng (vì số mũ là phần bí mật duy nhất của khóa riêng — mô-đun giống nhau cho cả hai nửa của khóa cặp khóa).
Có nhiều cách để tăng tốc hoạt động của khóa riêng RSA (nghĩa là giải mã hoặc ký) bằng cách sử dụng các thủ thuật toán học bổ sung như Định lý phần dư Trung Quốc, nhưng những điều này yêu cầu thêm thông tin về cách các khóa được tạo (chẳng hạn như các thừa số nguyên tố bí mật của mô-đun). Lưu trữ thông tin bổ sung này cùng với khóa riêng không có vấn đề gì và các định dạng khóa riêng RSA được sử dụng phổ biến nhất thực sự làm như vậy. Nhưng việc xuất bản nó sẽ cho phép bất kỳ ai phá vỡ cặp khóa và giải mã và/hoặc giả mạo tin nhắn.
Kết quả của tất cả những điều này là, trong thực tế, có thể tính khóa công khai RSA từ khóa riêng, nhưng không phải ngược lại. Như câu trả lời được liên kết (mà tôi đã viết) trên security.SE cho biết, về mặt lý thuyết, có thể tạo khóa RSA riêng an toàn mà khóa chung không thể tính được, nhưng điều này sẽ yêu cầu sử dụng cả thuật toán tạo khóa không chuẩn và thuật toán không chuẩn định dạng lưu trữ khóa riêng. Và ngay cả khi các vấn đề về định dạng đã được xử lý, không phải tất cả các triển khai RSA đều hoạt động với các khóa riêng tư đó (do thiếu thông tin bổ sung được đề cập ở trên).
Chúng ta có mã hóa hoặc giải mã Văn bản mật mã bằng một khóa nhất định không? Điều này có đúng về mặt kỹ thuật để nói như vậy không?
Sắp xếp, vâng. Nhưng những gì chúng ta thông thường làm là tạo một khóa ngẫu nhiên cho một mật mã đối xứng Như là AES, mã hóa văn bản gốc bằng mã đó, sau đó mã hóa khóa AES bằng thuật toán mã hóa bất đối xứng và khóa chung của người nhận dự định. Sau đó, chúng tôi gửi cả bản mã AES và khóa AES được mã hóa bất đối xứng cho người nhận, người này trước tiên có thể giải mã khóa AES và sau đó là bản mã.
Lý do chính cho việc sử dụng như vậy mã hóa lai là các mật mã đối xứng như AES được thiết kế để mã hóa nhiều dữ liệu một cách nhanh chóng, trong khi các hệ thống bất đối xứng thì không:
Mã hóa bất đối xứng có xu hướng tương đối chậm thường chậm hơn hàng chục, hàng trăm hoặc hàng nghìn lần so với mã hóa cùng một lượng dữ liệu bằng mật mã đối xứng nhanh như AES. Giải mã bất đối xứng thậm chí còn chậm hơn (trong khi giải mã AES thường nhanh như mã hóa).
Tất cả các sơ đồ mã hóa bất đối xứng an toàn đều tạo ra bản mã dài hơn bản rõ, do cần phải đưa một số tính ngẫu nhiên vào quy trình mã hóa để ngăn chặn các cuộc tấn công đoán. Một số (chẳng hạn như ElGamal-like lược đồ) sẽ tăng gấp đôi độ dài của văn bản gốc (sau khi đệm nó lên đến kích thước khối tin nhắn). Những thứ khác, chẳng hạn như RSA, yêu cầu đệm bản rõ lên đến hàng chục lần chiều dài ban đầu của nó. Rõ ràng, điều này là không mong muốn khi mã hóa các tập dữ liệu lớn. Trong khi đó, các mật mã đối xứng như AES thường chỉ thêm vài chục byte dữ liệu bổ sung vào bản mã bất kể độ dài của nó (tùy thuộc vào chế độ hoạt động).
Tổng quát hơn, các lược đồ mã hóa bất đối xứng đơn giản là không được thiết kế để mã hóa các thông điệp dài hơn vài chục byte hoặc hơn (tùy thuộc vào kích thước khóa và các tham số khác của lược đồ). Khóa AES sẽ phù hợp, nhưng ngay cả một tin nhắn trò chuyện cũng không được — và toàn bộ trang web hoặc hình ảnh hoặc luồng video chắc chắn sẽ không.
(Về mặt kỹ thuật, giống nhau là loại đúng đối xứng mật mã khối giống như AES cũng vậy: chúng cũng mã hóa dữ liệu theo khối vài chục byte và để mã hóa các tin nhắn dài, chúng cần được sử dụng với một bộ xử lý phù hợp. phương thức hoạt động áp dụng mật mã cho từng khối dữ liệu. Nhưng có rất nhiều chế độ hoạt động của mật mã khối nhanh và an toàn có thể chứng minh được mà hầu hết phần mềm và phần cứng tiền điện tử đều hỗ trợ ngay lập tức, trong khi đối với các sơ đồ mã hóa bất đối xứng về cơ bản là không có. Và nếu bạn cố gắng tự mình thiết kế và triển khai một cái, khả năng cao là nó sẽ không hiệu quả và cũng không an toàn.)
Có đúng không khi nói rằng:
Có cặp khóa này, tôi có thể mã hóa một tin nhắn bằng khóa riêng của mình và sau đó xuất bản nó.Việc bất kỳ ai cũng có thể giải mã tin nhắn bằng khóa chung của tôi có nghĩa là tôi đã mã hóa nó bằng khóa riêng của mình, điều đó có nghĩa là chính tôi là người đã tạo tin nhắn, vì chỉ có tôi mới có khóa riêng của mình. Mã hóa dữ liệu bằng khóa riêng của người gửi, chúng tôi gọi là định dạng tin nhắn mở, bởi vì bất kỳ ai có bản sao của khóa chung tương ứng đều có thể giải mã tin nhắn.
Không thật sự lắm. Khóa riêng trong sơ đồ mã hóa bất đối xứng dùng để giải mã, trong khi khóa chung dùng để mã hóa. Bạn thường không thể mã hóa bất cứ thứ gì bằng khóa riêng, cũng như bạn không thể giải mã bằng khóa chung.
Tuy nhiên, cũng có bất đối xứng sơ đồ chữ ký số cho phép bạn dấu hiệu dữ liệu bằng khóa riêng và để thẩm tra chữ ký bằng khóa công khai, chứng minh rằng dữ liệu trên thực tế đã được ký bằng một nửa riêng tư của cùng một cặp khóa.
Một số lược đồ chữ ký số thực sự dựa trên các lược đồ mã hóa bất đối xứng. Trên thực tế, chữ ký điện tử, theo một nghĩa chung nhất định, có thể được coi là một bằng chứng không kiến thức thực tế là người ký có thể giải mã một bản mã cụ thể (thường bắt nguồn từ một băm của tin nhắn được ký) bằng khóa riêng của họ bằng cách sử dụng một số sơ đồ mã hóa bất đối xứng, do đó chứng minh rằng họ có quyền truy cập vào cả tin nhắn (hoặc ít nhất là hàm băm của nó) và khóa riêng.
Đặc biệt, hệ thống mật mã RSA cũng có thể được sử dụng như một phần của sơ đồ chữ ký (chẳng hạn như RSA-PSS), sử dụng cùng loại khóa công khai và khóa riêng và cùng các phép toán (lũy thừa mô-đun) như đối với mã hóa RSA. Điều này (và những lời giải thích phổ biến ban đầu về mật mã khóa công khai) là nơi xuất phát mô tả phổ biến nhưng gây hiểu nhầm về việc ký (RSA) là "mã hóa bằng khóa riêng". Về mặt kỹ thuật thì không toàn bộ sai, ít nhất là nếu bạn bỏ qua tất cả các khác các phần của sơ đồ (băm, đệm, v.v.) ngoại trừ phép lũy thừa mô-đun ở cốt lõi của thuật toán RSA.
Nhưng nếu bạn sẵn sàng đơn giản hóa mọi thứ đến mức đó, bạn cũng có thể lưu ý rằng cả hai Mã hóa và giải mã RSA (cũng như xác minh chữ ký và chữ ký) về cơ bản chỉ là các phép lũy thừa mô-đun, vì vậy bạn cũng có thể nói rằng chúng tất cả các điều tương tự và việc ký RSA đó thực sự chỉ là giải mã RSA được áp dụng cho một bản mã đặc biệt. Theo một cách nào đó, điều này cũng đúng về mặt kỹ thuật và có lẽ không hơn (hoặc ít) gây hiểu lầm hơn là mô tả nó là "mã hóa bằng khóa riêng".