2009-01-31 24 views

Trả lời

13

Ngẫu nhiên có nghĩa là đầu vào không thể chấp nhận được. Nếu đầu vào có thể đoán được, thì đầu ra có thể được tính toán dễ dàng. Thật tệ.

Ví dụ: Debian có lỗi lâu dài trong quá trình triển khai SSL không thể thu thập đủ ngẫu nhiên khi tạo khóa. Điều này dẫn đến phần mềm tạo ra một trong những chỉ 32k phím có thể. Do đó, bạn có thể dễ dàng giải mã mọi thứ được mã hóa bằng khóa như vậy bằng cách thử tất cả các khả năng 32k bằng cách dùng thử chúng, điều này rất nhanh với tốc độ xử lý hiện nay.

2

Để giải mã một tin nhắn, bạn cần biết khóa bên phải.

Càng có nhiều phím bạn phải thử, thì càng khó giải mã thư.

Lấy ví dụ cực đoan, giả sử không có sự ngẫu nhiên nào cả. Khi tôi tạo khóa để sử dụng để mã hóa thư của mình, tôi sẽ luôn luôn kết thúc bằng cùng một khóa chính xác. Không có vấn đề ở đâu hoặc khi tôi chạy chương trình keygen, nó sẽ luôn luôn cho tôi cùng một chìa khóa.

Điều đó có nghĩa là bất kỳ ai có quyền truy cập vào chương trình tôi đã sử dụng để tạo khóa, có thể giải mã các thư của tôi một cách trivially. Sau khi tất cả, họ chỉ cần yêu cầu nó để tạo ra một chìa khóa quá, và họ nhận được một giống hệt với một trong tôi sử dụng.

Vì vậy, chúng tôi cần một số ngẫu nhiên để làm cho nó không thể đoán trước mà bạn kết thúc bằng cách sử dụng chìa khóa. Như David Schmitt đề cập, Debian có lỗi khiến nó chỉ tạo ra một số lượng nhỏ các khóa duy nhất, có nghĩa là để giải mã một thông điệp được mã hóa bởi việc triển khai OpenSSL mặc định trên Debian, tôi chỉ phải thử số lượng khóa nhỏ hơn này. Tôi có thể bỏ qua số lượng lớn các khóa hợp lệ khác, vì việc triển khai SSL của Debian sẽ không bao giờ tạo ra các khóa đó.

Mặt khác, nếu có đủ ngẫu nhiên trong quá trình tạo khóa, bạn không thể đoán được bất kỳ điều gì về khóa. Bạn phải thử mọi mẫu bit có thể. (và đối với khóa 128 bit, đó là rất nhiều kết hợp.)

4

Tính năng quan trọng của hầu hết các hoạt động mã hóa là chúng rất dễ thực hiện nếu bạn có thông tin chính xác (ví dụ: khóa) và không thể thực hiện nếu bạn không có thông tin đó.

Ví dụ: mật mã đối xứng: nếu bạn có khóa, mã hóa và giải mã rất dễ dàng. Nếu bạn không có chìa khóa (và không biết gì về cấu trúc của nó) thì bạn phải bắt tay vào thứ gì đó đắt tiền như tìm kiếm toàn bộ không gian chính, hoặc giải mã mật mã hiệu quả hơn mà sẽ yêu cầu một số cực kỳ số lượng lớn mẫu.

Mặt khác, nếu bạn có bất kỳ thông tin nào về các giá trị có khả năng của khóa, tìm kiếm toàn diện của bạn về không gian phím sẽ dễ dàng hơn nhiều (hoặc số lượng mẫu bạn cần để mã hóa của bạn thấp hơn nhiều). Ví dụ, hiện tại (hiện tại) không thể thực hiện 2^128 decryptions dùng thử để khám phá khóa 128 bit thực sự là gì. Nếu bạn biết tài liệu chính xuất phát từ một giá trị thời gian mà bạn biết trong vòng một tỷ bọ ve, thì tìm kiếm của bạn chỉ trở thành 340282366920938463463374607431 lần dễ dàng hơn.

1

Nó đã làm với một số lý do cơ bản cho việc mã hóa:

  • Hãy chắc chắn rằng một thông điệp không bị thay đổi trên đường vận chuyển (bất biến)
  • Hãy chắc chắn rằng một tin nhắn không được đọc quá cảnh (bảo đảm)
  • Hãy chắc chắn rằng thông điệp là từ người nó nói đó là từ (Authentic)
  • Hãy chắc chắn rằng thông điệp là không giống như một bản gửi trước đây (không Replay)
  • vv

Có một vài điều bạn cần bao gồm, sau đó, để đảm bảo rằng điều trên là đúng. Một trong những điều quan trọng là một giá trị ngẫu nhiên.

Ví dụ, nếu tôi mã hóa "Quá nhiều bí mật" với một chìa khóa, nó có thể đi ra với "dWua3hTOeVzO2d9w"

Có hai vấn đề với điều này - một kẻ tấn công có thể có thể phá vỡ các mã hóa dễ dàng hơn vì Tôi đang sử dụng một bộ ký tự rất hạn chế. Hơn nữa, nếu tôi gửi cùng một tin nhắn một lần nữa, nó sẽ đi ra chính xác như nhau. Cuối cùng, kẻ tấn công có thể ghi lại và gửi lại tin nhắn và người nhận sẽ không biết rằng tôi đã không gửi nó, ngay cả khi kẻ tấn công đã không phá vỡ nó.

Nếu tôi thêm một số rác ngẫu nhiên vào chuỗi mỗi khi tôi mã hóa nó, sau đó không chỉ làm cho nó khó crack hơn, nhưng thông báo được mã hóa thì khác nhau mỗi lần.

Các tính năng khác của mật mã trong các viên đạn trên được cố định bằng cách sử dụng các phương tiện khác (ngẫu nhiên giá trị, xác thực hai chiều, v.v.).

Nguồn ngẫu nhiên xấu giới hạn ký tự đặt lại, do đó dễ phá vỡ hơn và nếu dễ đoán, hoặc bị giới hạn, thì kẻ tấn công có ít đường dẫn để thử khi thực hiện tấn công vũ phu.

-Adam

1

Một mô hình phổ biến ở mật mã là (văn bản gửi từ alice để bob) sau:

Take plaintext p 
Generate random k 
Encrypt p with k using symmetric encryption, producing crypttext c 
Encrypt k with bob's private key, using asymmetric encryption, producing x 
Send c+x to bob 
Bob reverses the processes, decrypting x using his private key to obtain k 

Lý do cho mô hình này là mã hóa đối xứng là nhanh hơn nhiều so với mã hóa không đối xứng. Tất nhiên, nó phụ thuộc vào một bộ tạo số ngẫu nhiên tốt để tạo ra k, nếu không thì kẻ xấu chỉ có thể đoán được nó.

0

Làm việc ra this vấn đề từ Dự án Euler và nó thực sự sẽ giúp bạn về nhà những gì "rất nhiều ngẫu nhiên" sẽ làm cho bạn. Khi tôi nhìn thấy câu hỏi này, đó là điều đầu tiên xuất hiện trong đầu tôi.

Sử dụng phương pháp mà anh ấy nói ở đó, bạn có thể dễ dàng thấy được "sự ngẫu nhiên nhiều hơn" sẽ giúp bạn đạt được điều gì.

0

Một bài báo khá tốt mà vạch ra lý do tại sao không cẩn thận với tính ngẫu nhiên có thể dẫn đến mất an toàn:

này mô tả cách trở lại vào năm 1995 thực hiện SSL chính trình duyệt của Netscape là dễ bị đoán các khóa SSL do một vấn đề nảy mầm PRNG.

1

Đây là tương tự "trò chơi bài": Giả sử chúng tôi chơi nhiều vòng trò chơi với cùng một cỗ bài. Sự xáo trộn của sàn giữa các vòng là nguồn ngẫu nhiên chính. Nếu chúng tôi không phát ngẫu nhiên đúng cách, bạn có thể đánh bại trò chơi bằng cách dự đoán thẻ.

Khi bạn sử dụng nguồn ngẫu nhiên kém để tạo khóa mã hóa, bạn giảm đáng kể entropy (hoặc độ không chắc chắn) của giá trị khóa. Điều này có thể làm tổn hại đến việc mã hóa bởi vì nó làm cho việc tìm kiếm bạo lực trên không gian chính dễ dàng hơn nhiều.

Các vấn đề liên quan