Làm thế nào mã hóa có thể liên quan đến ngẫu nhiên?


8

Nếu một thuật toán mã hóa có nghĩa là chuyển đổi một chuỗi thành một chuỗi khác mà sau đó có thể được giải mã trở lại ban đầu, làm thế nào quá trình này có thể liên quan đến bất kỳ sự ngẫu nhiên nào?

Chắc chắn nó phải có tính xác định, nếu không thì làm sao chức năng giải mã có thể biết những yếu tố nào liên quan đến việc tạo ra chuỗi mã hóa?


3
Vui lòng không đặt câu hỏi giống hệt nhau trên nhiều trang web Stack Exchange, như trang này trên Crypto.SE .
Paŭlo Ebermann

Câu trả lời:


5

Có thể có nhiều hơn một bản mã để ánh xạ trở lại cùng một bản rõ. Theo thuật ngữ toán học, thuật toán mã hóa phải được tiêm để bạn có thể khôi phục bản rõ cho bản mã, nhưng điều này không ngăn được bản mã hóa mã hóa nhiều thông tin hơn bản rõ.

Để làm ví dụ cụ thể, hãy xem xét các chế độ hoạt động của mật mã khối như CBC , CTR hoặc OFB . Tất cả các chế độ này liên quan đến IV (vectơ khởi tạo) ngoài bản rõ, thuật toán mã hóa khối và khóa của nó. (Đối với TLB, IV được gọi là nonce, nhưng nó đóng vai trò tương tự.) Hàm mã hóa có tính xác định đối với IV đã cho. Mặt khác, IV có thể được chọn ngẫu nhiên (đối với TLB, nó phải được chọn ngẫu nhiên). Do đó, trừ khi giao thức chỉ định phương pháp xác định chọn IV (chẳng hạn như hằng số đã thỏa thuận), IV được gửi cùng với bản mã. Trong thực tế, đầu ra của phần mềm mã hóa thường bao gồm IV theo sau là văn bản mã hóa nghiêm ngặt. Bản thân IV được gửi trong bản rõ; nó không (không được) chứa bất kỳ thông tin bí mật nào.

Một ví dụ khác, hãy xem xét chế độ PKCS1.5 (sơ đồ đệm của bộ đệm) của RSA (được xác định trong PKCS # 1 phiên bản 1.5 - xem p.22 Tua25 của PKCS # 1 v2.1 ). Đơn giản hóa một chút, chế độ này bao gồm nối một chuỗi ngẫu nhiên với thông báo, sau đó áp dụng thao tác lũy thừa. Bản mã là trong đó là nối, là thông báo và là một chuỗi đệm hầu hết các bit có ngẫu nhiên. Để khôi phục tin nhắn từ bản mã , hãy áp dụng thao tác giải mã thô và chia thành phần đệm (bị loại bỏ) và tin nhắn.(PM)emodnMPCCdmodnC


4

Các lược đồ mã hóa không chỉ có thể có tính ngẫu nhiên, mà trong một số trường hợp (ví dụ: mã hóa khóa công khai ), chúng phải được chọn ngẫu nhiên. Đây không phải là vấn đề vì chúng tôi yêu cầu một sơ đồ mã hóa là chính xác , nghĩa là, đối với mọi thông báo và bất kỳ khóa nào giữ nó qua tính ngẫu nhiên .mk

Pr[ DEC( ENC(k,m,R) )=m]=1
R

Lý do các lược đồ khóa công khai phải xuất phát ngẫu nhiên từ cách chúng tôi xác định bảo mật: chúng tôi không muốn bản mã bị rò rỉ bất kỳ thông tin nào về tin nhắn được mã hóa. Ví dụ cổ điển là như sau. Giả sử rằng lần lượt là khóa chung và khóa bí mật và đối thủ chặn tin nhắn được mã hóa gửi đến một số đơn vị trong trường. Kẻ thù biết rằng tin nhắn là "ATTACK" hoặc "RETREAT", nhưng không biết tin nhắn nào. Một điều mà đối thủ có thể làm là mã hóa cả hai tin nhắn bằng cách sử dụng công khai . hãy để và . Nếu(pk,sk)cpkcA=ENCpk("ATTACK ")cR=ENCpk("RETREAT")ENCmang tính quyết định, đối thủ có thể tìm ra thông điệp một cách chắc chắn bằng cách so sánh với và .ccAcR

Cách khái niệm này được định nghĩa chính thức được gọi là bảo mật ngữ nghĩa :

Lược đồ mã hóa được bảo mật về mặt ngữ nghĩa nếu bất kỳ đối thủ nào không thể thắng trò chơi sau với xác suất lớn hơn đáng kể là :A1/2

  1. Một kẻ thách thức tạo các khóa và gửi khóa công khai cho đối thủ.C(pk,sk)pk
  2. A chọn hai tin nhắn có độ dài bằng nhau và và gửi cả hai cho .m0m1C
  3. C chọn một bit và gửi lại .b{0,1}ENC(mb)
  4. A cần cho biết tin nhắn nào đã được mã hóa: hoặc , nghĩa là anh ta cần xuất bit .m0m1b

(Tôi đang bỏ qua tham số bảo mật , điều rất quan trọng để xác định "không đáng kể" hoặc "đáng chú ý"; Chúng tôi cần giả định rằng việc tạo các khóa phụ thuộc vào và lợi thế có ở trên không đáng kể trong , tức là nhỏ hơn ) κκA1/2κκω(1)


chúng ta có thể thêm một chuỗi ngẫu nhiên vào cuối đầu vào trước khi mã hóa trước để tránh sự cố và luôn có , nghĩa là điều kiện có thể mạnh hơn điều kiện bạn đã nêu ở trên . DEC(ENC(k,m,R))=m
Kaveh

3

Bạn chưa nói loại mã hóa nào chúng ta đang thảo luận, nhưng hãy để tôi chỉ ra những gì thực sự cần thiết cho bảo mật của các giao thức bản đồ (ngoài những gì được nêu trong các câu trả lời khác).

Điều chúng ta thực sự cần là: các khóa nên được tạo ngẫu nhiên (điều này có thể được thực hiện trong sự cộng tác như trong mật mã khóa công khai như RSA hoặc bởi một thực thể như trong mật mã khóa riêng). Tính ngẫu nhiên của khóa đảm bảo rằng một kẻ thù không thể dự đoán được các khóa (và sử dụng chúng để phá vỡ giao thức). Miễn là các khóa trông ngẫu nhiên đối với kẻ thù, giao thức sẽ được bảo mật. Thông thường, các khóa được tạo bởi một thuật toán ngẫu nhiên và sau đó được trao cho các bên, trong khi các thuật toán mã hóa và giải mã không phải là ngẫu nhiên mà là xác định.

Cũng nên nhớ rằng việc được chọn ngẫu nhiên không có nghĩa là quá trình này không thể đảo ngược. Một ví dụ đơn giản là như sau: đã cho , tạo ngẫu nhiên , output . Để đảo ngược, chúng ta có thể xuất phần đầu tiên của cặp.xrx,r


ví dụ của bạn rất quan trọng: không có phần đệm ngẫu nhiên, vanilla RSA không an toàn. với phần đệm ngẫu nhiên, RSA có thể được chứng minh là có các thuộc tính bảo mật tốt trong mô hình nhà tiên tri ngẫu nhiên
Sasho Nikolov

1

Cả hai thuật toán mã hóa và giải mã đều có thể được chọn ngẫu nhiên miễn là bạn có thể chứng minh một số định lý rằng mã hóa theo sau là giải mã sẽ cung cấp cho bạn thông điệp ban đầu hầu hết mọi lúc .

Tại sao bất cứ ai cũng muốn một chương trình mã hóa như vậy? Bởi vì: 1) có tồn tại tình huống mà chúng ta không muốn trở thành đúng tất cả các thời gian nhưng chỉ 99.999.999 lần trong mỗi 100000000 và 2) cho phép sai sót nhỏ như vậy thường cải thiện cái gì khác (chẳng hạn như hiệu quả) bằng một lượng không cân xứng.


3
Mặc dù mã hóa xác suất tồn tại, nhưng chúng lại ở khía cạnh kỳ lạ. Rất nhiều thuật toán mã hóa hàng ngày liên quan đến tính ngẫu nhiên mà không có xác suất.
Gilles 'SO- ngừng trở nên xấu xa'

@Gilles: Một sự phân biệt quan trọng để thực hiện.
Raphael

0

Chỉ cần trích dẫn một ví dụ, trong mã hóa RSA , bạn cần tạo hai số nguyên tố và và một số nguyên sẽ được sử dụng để tạo khóa chung và khóa riêng của bạn.pqe

Nếu bạn tạo bất kỳ giá trị nào trong số này theo cách xác định, thì thế hệ của chúng có thể được sao chép, có khả năng ảnh hưởng đến mã hóa của bạn. Nếu những con số này được tạo ra một cách ngẫu nhiên, thì đây không phải là vấn đề.

Cập nhật

Như một ví dụ cụ thể hơn về câu trả lời của Ran G. , bạn có thể xem mật mã Elliptic Curve , trong đó thuật toán yêu cầu một tham số ngẫu nhiên (thường được gọi là , hoặc ) để mã hóa và giải mã tin nhắn. Nếu cùng một tham số "ngẫu nhiên" được sử dụng nhiều lần, khóa đó có thể được tính từ hai tin nhắn được mã hóa. Đây là vấn đề / tiền đề của vụ hack PlayStation 3 năm ngoái .dkr


1
Đây là sự ngẫu nhiên trong thế hệ khóa, mà tôi nghi ngờ là câu hỏi: bất kỳ thế hệ khóa nào cũng phải liên quan đến tính ngẫu nhiên, nếu không thì khóa có thể dự đoán được (hoặc xuất phát và không được tạo).
Gilles 'SO- ngừng trở nên xấu xa'

Tôi không nghĩ đó là nơi ngẫu nhiên mà OP có trong tâm trí. Các khóa được đưa ra và tĩnh cho quá trình (en | de). Làm thế nào bạn chọn chìa khóa của bạn là độc lập với điều đó.
Raphael

@Gilles: Tôi sẽ không xem xét nó rõ ràng. Các giá trị , và thường được lưu trữ ở dạng được mã hóa, với mật khẩu do người dùng chọn. Nói một cách chính xác, chúng là chìa khóa, nhưng theo quan điểm của người dùng , chúng chỉ là các giá trị ngẫu nhiên được tạo ra bằng cách gõ vô nghĩa trên bàn phím và không liên quan gì đến mật khẩu được chọn cẩn thận của chúng. pqe
Pedro

@Pedro Tôi không hiểu nhận xét mới nhất của bạn liên quan đến câu hỏi như thế nào. Ngay cả từ góc độ của các tệp chính (mà tôi không thấy trong câu hỏi), khóa rõ ràng không được tạo ngẫu nhiên, nó xuất phát từ tệp chính và mật khẩu.
Gilles 'SO- ngừng trở nên xấu xa'
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.