Làm thế nào là giả ngẫu nhiên và số thực sự ngẫu nhiên khác nhau và tại sao nó quan trọng?


665

Tôi chưa bao giờ hoàn toàn hiểu điều này. Chỉ cần nói rằng bạn viết một chương trình nhỏ bằng bất kỳ ngôn ngữ nào để cuộn xúc xắc (chỉ sử dụng xúc xắc làm ví dụ). Sau 600.000 cuộn, mỗi số sẽ được cuộn khoảng 100.000 lần, đó là những gì tôi mong đợi.

Tại sao có các trang web dành riêng cho 'sự ngẫu nhiên thực sự'? Chắc chắn, với sự quan sát ở trên, cơ hội nhận được bất kỳ số nào gần như chính xác 1 so với bao nhiêu số có thể chọn.

Tôi đã thử nó trong Python : Đây là kết quả của 60 triệu cuộn. Biến thể cao nhất là 0,15. Đó không phải là ngẫu nhiên như nó sẽ nhận được sao?

1 - 9997653 2347.0
2 - 9997789 2211.0
3 - 9996853 3147.0
4 - 10006533 -6533.0
5 - 10002774 -2774.0
6 - 9998398 1602.0


21
Bạn có ý nghĩa gì khi "tung một vài con xúc xắc"? Nó có một cánh tay robot và máy ảnh kèm theo?
starblue

3
Mặc dù tôi đồng ý với ý chính chung về giọng điệu của bạn, rằng chúng tôi thường lo lắng về điều này quá nhiều, nhưng nó đã được khai thác trong cuộc sống thực: en.wikipedia.org/wiki/Ronald_Dale_Harris
Người chơi Grady

3
Xem này bài viết về một trò chơi poker trực tuyến thiếu tính ngẫu nhiên đúng đối với lý do tại sao nó quan trọng.
Varaquilex

1
Nếu bạn chỉ giữ một bộ đếm 0-5 và tung xúc xắc tương ứng, 666 tỷ lần, bạn cũng sẽ nhận được phân phối bằng nhau.
jcora

Câu trả lời:


1384

Chúng ta hãy chơi một số bài xì phé trên máy tính, chỉ có bạn, tôi và một máy chủ mà cả hai chúng tôi đều tin tưởng. Máy chủ sử dụng bộ tạo số giả ngẫu nhiên, được khởi tạo với hạt 32 bit ngay trước khi chúng tôi chơi. Vì vậy, có khoảng bốn tỷ sàn có thể.

Tôi có năm thẻ trong tay - dường như chúng tôi không chơi Texas Hold 'Em. Giả sử các thẻ được xử lý một cho tôi, một cho bạn, một cho tôi, một cho bạn, v.v. Vì vậy, tôi có các thẻ đầu tiên, thứ ba, thứ năm, thứ bảy và thứ chín trong bộ bài.

Trước đó, tôi đã chạy trình tạo số giả ngẫu nhiên bốn tỷ lần, một lần với mỗi hạt giống và viết ra thẻ đầu tiên được tạo cho mỗi thẻ vào cơ sở dữ liệu. Giả sử thẻ đầu tiên của tôi là nữ hoàng thuổng. Điều đó chỉ hiển thị một là thẻ đầu tiên trong một trong số 52 sàn có thể, vì vậy chúng tôi đã cắt giảm các sàn có thể từ bốn tỷ xuống còn khoảng 80 triệu.

Giả sử thẻ thứ hai của tôi là ba trái tim. Bây giờ tôi chạy RNG 80 triệu lần nữa bằng cách sử dụng 80 triệu hạt giống tạo ra nữ hoàng thuổng làm số đầu tiên. Điều này làm tôi mất vài giây. Tôi viết ra tất cả các cỗ bài tạo ra ba trái tim là lá bài thứ ba - lá bài thứ hai trong tay tôi. Đó chỉ là khoảng 2% số sàn, vì vậy bây giờ chúng tôi giảm xuống còn 2 triệu sàn.

Giả sử thẻ thứ ba trong tay tôi là 7 câu lạc bộ. Tôi có một cơ sở dữ liệu gồm 2 triệu hạt giống xử lý hai thẻ của mình; Tôi điều hành RNG của mình thêm 2 triệu lần nữa để tìm 2% số sàn tạo ra 7 câu lạc bộ làm thẻ thứ ba, và chúng tôi chỉ còn 40 nghìn sàn.

Bạn thấy điều này diễn ra như thế nào. Tôi chạy RNG 40000 lần nữa để tìm tất cả các hạt giống tạo ra thẻ thứ tư của mình và điều đó khiến chúng tôi giảm xuống 800 sàn, và sau đó chạy thêm 800 lần nữa để có ~ 20 hạt giống tạo ra thẻ thứ năm của tôi, và bây giờ tôi chỉ tạo ra hai mươi bộ bài đó và tôi biết rằng bạn có một trong hai mươi bàn tay có thể. Hơn nữa, tôi có một ý tưởng rất hay về những gì tôi sẽ vẽ tiếp theo.

Bây giờ bạn có thấy tại sao sự ngẫu nhiên thực sự là quan trọng? Cách bạn mô tả nó, bạn nghĩ rằng phân phối là quan trọng, nhưng phân phối không phải là thứ tạo nên một quá trình ngẫu nhiên. Không thể đoán trước là những gì làm cho một quá trình ngẫu nhiên.

CẬP NHẬT

Dựa trên các nhận xét (hiện đã bị xóa do tính chất không liên quan của họ), ít nhất 0,3% những người đã đọc điều này bị nhầm lẫn theo quan điểm của tôi. Khi mọi người tranh luận với những điểm tôi chưa đưa ra, hoặc tệ hơn, tranh luận về những điểm mà tôi đã đưa ra với giả định rằng tôi không tạo ra chúng, thì tôi biết rằng tôi cần phải giải thích rõ ràng và cẩn thận hơn.

Dường như có sự nhầm lẫn đặc biệt xung quanh việc phân phối từ vì vậy tôi muốn gọi ra cách sử dụng một cách cẩn thận.

Các câu hỏi trong tầm tay là:

  • Làm thế nào để số giả ngẫu nhiên và số thực sự ngẫu nhiên khác nhau?
  • Tại sao sự khác biệt quan trọng?
  • Sự khác biệt có liên quan gì đến việc phân phối đầu ra của PRNG không?

Hãy bắt đầu bằng cách xem xét cách hoàn hảo để tạo ra một cỗ bài ngẫu nhiên để chơi bài xì phé. Sau đó, chúng ta sẽ thấy các kỹ thuật khác để tạo sàn khác nhau như thế nào và liệu có thể tận dụng sự khác biệt đó hay không.

Hãy bắt đầu bằng cách giả sử rằng chúng ta có một hộp ma thuật được dán nhãn TRNG. Khi đầu vào của nó, chúng tôi cung cấp cho nó một số nguyên n lớn hơn hoặc bằng một, và vì đầu ra của nó, nó cung cấp cho chúng tôi một số thực sự ngẫu nhiên giữa một và n, bao gồm. Đầu ra của hộp là hoàn toàn không thể đoán trước (khi được đưa ra một số khác một) và bất kỳ số nào giữa một và n cũng có khả năng như một số khác; đó là để nói rằng phân phốithống nhất . .

Chúng tôi bắt đầu với một bộ bài không xáo trộn. Chúng tôi yêu cầu hộp cho một số từ một đến 52 - nghĩa là , TRNG(52). Bất kể số nào nó trả lại, chúng tôi sẽ đếm được rất nhiều thẻ từ bộ bài đã sắp xếp của chúng tôi và xóa thẻ đó. Nó trở thành lá bài đầu tiên trong bộ bài xáo trộn. Sau đó, chúng tôi yêu cầu TRNG(51)và làm tương tự để chọn thẻ thứ hai, và như vậy.

Một cách khác để xem xét nó là: có 52! = 52 x 51 x 50 ... x 2 x 1 sàn có thể, xấp xỉ 2 226 . Chúng tôi đã chọn một trong số họ một cách ngẫu nhiên.

Bây giờ chúng tôi giải quyết các thẻ. Khi tôi nhìn vào thẻ của mình, tôi không biết bạn có thẻ gì. (Ngoài thực tế rõ ràng là bạn không có bất kỳ thẻ nào tôi có.) Chúng có thể là bất kỳ thẻ nào, với xác suất như nhau.

Vì vậy, hãy để tôi chắc chắn rằng tôi giải thích điều này rõ ràng. Chúng tôi có phân phối thống nhất của từng đầu ra riêng lẻ của TRNG(n); mỗi người chọn một số từ 1 đến n với xác suất 1 / n. Ngoài ra, kết quả của quá trình này là chúng tôi đã chọn một trong số 52! sàn có thể với một xác suất 1/52 !, nên sự phân bố trên tập các sàn có thểcũng thống nhất.

Được rồi

Bây giờ hãy giả sử rằng chúng ta có một hộp ma thuật ít hơn, được dán nhãn PRNG. Trước khi bạn có thể sử dụng nó, nó phải được gieo bằng số không dấu 32 bit.

ASIDE: Tại sao 32 ? Nó không thể được gieo bằng số 64 hoặc 256 hoặc 10000 bit? Chắc chắn rồi. Nhưng (1) trong thực tế, hầu hết các PRNG ngoài luồng đều được gieo số 32 bit và (2) nếu bạn có 10000 bit ngẫu nhiên để tạo hạt giống thì tại sao bạn lại sử dụng PRNG? Bạn đã có một nguồn 10000 bit ngẫu nhiên!

Dù sao, trở lại cách PRNG hoạt động: sau khi nó được gieo, bạn có thể sử dụng nó giống như cách bạn sử dụng TRNG. Đó là, bạn truyền cho nó một số, n, và nó cung cấp cho bạn một số từ 1 đến n, bao gồm. Hơn nữa, sự phân phối của đầu ra đó ít nhiều đồng đều . Đó là, khi chúng tôi yêu cầu PRNGmột số từ 1 đến 6, chúng tôi nhận được 1, 2, 3, 4, 5 hoặc 6 mỗi khoảng một phần sáu thời gian, bất kể hạt giống là gì.

Tôi muốn nhấn mạnh điểm này nhiều lần vì nó có vẻ là một trong những người bình luận khó hiểu. Việc phân phối PRNG được thống nhất theo ít nhất hai cách. Đầu tiên, giả sử chúng ta chọn bất kỳ hạt giống cụ thể. Chúng tôi hy vọng rằng chuỗi PRNG(6), PRNG(6), PRNG(6)...một triệu lần sẽ tạo ra sự phân bố số lượng đồng đều từ 1 đến 6. Và thứ hai, nếu chúng tôi chọn một triệu hạt giống khác nhau và được gọi PRNG(6) một lần cho mỗi hạt giống, một lần nữa chúng tôi sẽ mong đợi sự phân bố số lượng đồng đều từ 1 đến 6. Tính đồng nhất của PRNG trên một trong hai hoạt động này không liên quan đến cuộc tấn công mà tôi đang mô tả .

Quá trình này được cho là giả ngẫu nhiên vì hành vi của hộp thực sự hoàn toàn mang tính quyết định; nó chọn một trong 2 32 hành vi có thể dựa trên hạt giống. Nghĩa là, một khi nó được gieo hạt, PRNG(6), PRNG(6), PRNG(6), ... tạo ra một chuỗi các số có phân bố đồng đều, nhưng chuỗi đó hoàn toàn được xác định bởi hạt giống. Đối với một chuỗi các cuộc gọi nhất định, giả sử PRNG (52), PRNG (51) ... và chỉ có 2 32 chuỗi có thể. Hạt giống về cơ bản chọn cái mà chúng ta nhận được.

Để tạo một cỗ máy chủ bây giờ tạo một hạt giống. (Làm thế nào? Chúng ta sẽ quay trở lại điểm đó.) Sau đó, họ gọi PRNG(52), PRNG(51)và cứ thế tạo ra cỗ bài, tương tự như trước đây.

Hệ thống này dễ bị tấn công mà tôi mô tả. Để tấn công máy chủ, trước tiên, hãy chọn bản sao của hộp bằng 0 và yêu cầu PRNG(52)và viết nó xuống. Sau đó, chúng tôi tái lập hạt giống với 1, yêu cầu PRNG(52)và viết nó xuống, tất cả các cách lên đến 2 32 -1.

Bây giờ, máy chủ poker đang sử dụng PRNG để tạo các sàn phải tạo ra một hạt giống nào đó. Không quan trọng làm thế nào họ làm như vậy. Họ có thể gọi TRNG(2^32)để có được một hạt giống thực sự ngẫu nhiên. Hoặc họ có thể lấy thời gian hiện tại làm hạt giống, điều này hầu như không ngẫu nhiên; Tôi biết mấy giờ nó cũng nhiều như bạn. Điểm tấn công của tôi là nó không quan trọng, vì tôi có cơ sở dữ liệu của mình . Khi tôi nhìn thấy thẻ đầu tiên của mình, tôi có thể loại bỏ 98% số hạt giống có thể. Khi tôi nhìn thấy thẻ thứ hai của mình, tôi có thể loại bỏ thêm 98%, và cứ thế, cho đến cuối cùng tôi có thể nhận được một số hạt giống có thể, và biết rất có khả năng những gì trong tay bạn.

Bây giờ, một lần nữa, tôi muốn nhấn mạnh rằng giả định ở đây là nếu chúng ta gọi PRNG(6)một triệu lần, chúng ta sẽ nhận được mỗi số khoảng một phần sáu thời gian . Phân phối đó là (ít nhiều) đồng nhấtnếu tính đồng nhất của phân phối đó là tất cả những gì bạn quan tâm , thì tốt thôi. Điểm của câu hỏi là có những thứ khác PRNG(6)mà chúng ta quan tâm không? và câu trả lời là . Chúng tôi quan tâm về sự khó lường là tốt.

Một cách khác để xem xét vấn đề là mặc dù việc phân phối một triệu cuộc gọi PRNG(6)có thể ổn, vì PRNG chỉ chọn từ 2 32 hành vi có thể, nhưng nó không thể tạo ra mọi sàn có thể. Nó chỉ có thể tạo 2 32 trong số 2 226 sàn có thể; một phần rất nhỏ Vì vậy, việc phân phối trên tập hợp tất cả các sàn là rất xấu. Nhưng một lần nữa, cuộc tấn công cơ bản ở đây dựa trên việc chúng ta có thể dự đoán thành công hành vi trong quá khứ và tương lai PRNGtừ một mẫu nhỏ của sản phẩm đầu ra.

Hãy để tôi nói điều này một hoặc ba lần để đảm bảo điều này chìm vào. Có ba bản phân phối ở đây. Đầu tiên, phân phối của quá trình tạo ra hạt giống 32 bit ngẫu nhiên. Điều đó có thể là hoàn toàn ngẫu nhiên, không thể đoán trước và thống nhất và cuộc tấn công sẽ vẫn hoạt động . Thứ hai, việc phân phối một triệu cuộc gọi đến PRNG(6). Điều đó có thể hoàn toàn thống nhất và cuộc tấn công vẫn sẽ hoạt động. Thứ ba, việc phân phối các sàn được chọn theo quy trình giả ngẫu nhiên mà tôi đã mô tả. Sự phân phối đó cực kỳ nghèo nàn; chỉ một phần rất nhỏ của các sàn IRL có thể có thể được chọn. Cuộc tấn công phụ thuộc vào khả năng dự đoán hành vi của PRNG dựa trên kiến ​​thức một phần về đầu ra của nó .

ASIDE: Cuộc tấn công này yêu cầu kẻ tấn công biết hoặc có thể đoán thuật toán chính xác được sử dụng bởi PRNG là gì. Cho dù đó là thực tế hay không là một câu hỏi mở. Tuy nhiên, khi thiết kế một hệ thống bảo mật, bạn phải thiết kế nó để an toàn trước các cuộc tấn công ngay cả khi kẻ tấn công biết tất cả các thuật toán trong chương trình . Nói cách khác: phần của hệ thống bảo mật phải giữ bí mật để hệ thống được bảo mật được gọi là "khóa". Nếu hệ thống của bạn phụ thuộc vào bảo mật của nó đối với các thuật toán bạn sử dụng là bí mật thì khóa của bạn chứa các thuật toán đó . Đó là một vị trí cực kỳ yếu để được vào!

Tiến lên.

Bây giờ hãy giả sử rằng chúng ta có một hộp ma thuật thứ ba được dán nhãn CPRNG. Nó là một phiên bản sức mạnh của tiền điện tử PRNG. Nó lấy một hạt giống 256 bit thay vì hạt giống 32 bit. Nó chia sẻ với PRNGtài sản mà hạt giống chọn từ một trong 2 256 hành vi có thể. Và giống như các máy khác của chúng tôi, nó có một số lượng lớn các cuộc gọi để CPRNG(n)tạo ra sự phân phối kết quả thống nhất giữa 1 và n: mỗi lần xảy ra 1 / n thời gian. Chúng ta có thể chạy cuộc tấn công của chúng tôi chống lại nó?

Cuộc tấn công ban đầu của chúng tôi yêu cầu chúng tôi lưu trữ 2 32 ánh xạ từ hạt giống đến PRNG(52). Nhưng 2 256 là một con số lớn hơn nhiều; nó là hoàn toàn không thể chạy được CPRNG(52)nhiều lần và lưu trữ kết quả.

Nhưng giả sử có một số cách khác để lấy giá trị CPRNG(52)và từ đó suy ra một thực tế về hạt giống? Chúng tôi đã khá ngu ngốc cho đến nay, chỉ cần vũ phu buộc tất cả các kết hợp có thể. Chúng ta có thể nhìn vào bên trong chiếc hộp ma thuật, tìm ra cách nó hoạt động và suy luận sự thật về hạt giống dựa trên đầu ra không?

Không. Các chi tiết quá phức tạp để giải thích, nhưng CPRNG được thiết kế khéo léo để không thể suy ra bất kỳ sự thật hữu ích nào về hạt giống từ đầu ra đầu tiên của CPRNG(52)hoặc từ bất kỳ tập hợp con nào của đầu ra, bất kể lớn đến đâu .

OK, vì vậy bây giờ hãy giả sử máy chủ đang sử dụng CPRNGđể tạo các sàn. Nó cần một hạt giống 256-bit. Làm thế nào để nó chọn hạt giống đó? Nếu nó chọn bất kỳ giá trị nào mà kẻ tấn công có thể dự đoán thì đột nhiên cuộc tấn công trở nên khả thi trở lại . Nếu chúng ta có thể xác định rằng trong số 256 hạt giống có thể, chỉ có bốn tỷ trong số chúng có khả năng được chọn bởi máy chủ, thì chúng ta đã quay trở lại hoạt động . Chúng ta có thể gắn kết cuộc tấn công này một lần nữa, chỉ chú ý đến số lượng nhỏ hạt giống có thể được tạo ra.

Do đó, máy chủ nên thực hiện công việc để đảm bảo rằng số 256 bit được phân phối đồng đều - nghĩa là, mỗi hạt giống có thể được chọn với xác suất 1/2 256 . Về cơ bản, máy chủ sẽ được gọi TRNG(2^256)-1để tạo hạt giống cho CPRNG.

Điều gì sẽ xảy ra nếu tôi có thể hack máy chủ và ngó vào nó để xem hạt giống nào được chọn? Trong trường hợp đó, kẻ tấn công biết quá khứ và tương lai hoàn toàn của CPRNG . Tác giả của máy chủ cần phải bảo vệ chống lại cuộc tấn công này! (Tất nhiên nếu tôi có thể thực hiện thành công cuộc tấn công này thì có lẽ tôi cũng có thể chuyển tiền trực tiếp vào tài khoản ngân hàng của mình, vì vậy có lẽ điều đó không thú vị. Điểm là: hạt giống phải là một bí mật khó đoán và số 256-bit thực sự ngẫu nhiên rất khó đoán.)

Quay trở lại quan điểm trước đây của tôi về phòng thủ chuyên sâu: hạt giống 256 bit là chìa khóa cho hệ thống bảo mật này. Ý tưởng của CPRNG là hệ thống được bảo mật miễn là khóa được bảo mật ; ngay cả khi mọi sự thật khác về thuật toán được biết đến, miễn là bạn có thể giữ bí mật chính, thẻ của đối thủ là không thể đoán trước.

OK, vì vậy, hạt giống nên được phân phối đồng đều và bí mật bởi vì nếu không, chúng ta có thể thực hiện một cuộc tấn công. Chúng tôi có giả định rằng việc phân phối đầu ra CPRNG(n)là thống nhất. Điều gì về phân phối trên tập hợp của tất cả các sàn có thể?

Bạn có thể nói: có 2 256 trình tự có thể xuất ra bởi CPRNG, nhưng chỉ có 2 226 sàn có thể. Do đó, có nhiều trình tự có thể hơn các sàn, vì vậy chúng tôi ổn; mọi sàn IRL có thể hiện có (với xác suất cao) có thể có trong hệ thống này. Và đó là một cuộc tranh luận tốt ngoại trừ ...

2 226 chỉ là xấp xỉ 52!. Chia nó ra. 2 256/52 ! không thể là một con số nguyên vẹn vì một điều, 52! chia hết cho 3 nhưng không có lũy thừa hai là! Vì đây không phải là toàn bộ số bây giờ, chúng ta có tình huống tất cả các sàn đều có thể , nhưng một số sàn có nhiều khả năng hơn các sàn khác .

Nếu điều đó không rõ ràng, hãy xem xét tình huống với số lượng nhỏ hơn. Giả sử chúng ta có ba thẻ, A, B và C. Giả sử chúng ta sử dụng PRNG với hạt 8 bit, do đó có 256 hạt giống có thể. Có 256 đầu ra có thể PRNG(3)phụ thuộc vào hạt giống; không có cách nào để có một phần ba trong số họ là A, một phần ba trong số họ là B và một phần ba trong số họ là C vì 256 không chia hết cho 3. Có một sự thiên vị nhỏ đối với một trong số họ.

Tương tự, 52 không chia đều cho 2 256 , do đó phải có một số sai lệch đối với một số thẻ làm thẻ đầu tiên được chọn và sai lệch so với các thẻ khác.

Trong hệ thống ban đầu của chúng tôi với hạt giống 32 bit, có sự thiên vị lớn và phần lớn các sàn có thể không bao giờ được sản xuất. Trong hệ thống này, tất cả các sàn có thể được sản xuất, nhưng việc phân phối các sàn vẫn còn thiếu sót . Một số sàn rất có khả năng hơn một số khác.

Bây giờ câu hỏi là: chúng ta có một cuộc tấn công dựa trên lỗ hổng này không? và câu trả lời là trong thực tế, có lẽ là không . CPRNG được thiết kế sao cho nếu hạt giống thực sự ngẫu nhiên thì không thể tính toán được sự khác biệt giữa CPRNGTRNG.

OK, vậy hãy tổng hợp lại.

Làm thế nào để số giả ngẫu nhiên và số thực sự ngẫu nhiên khác nhau?

Họ khác nhau về mức độ dự đoán mà họ thể hiện.

  • Con số ngẫu nhiên thực sự là không thể dự đoán.
  • Tất cả các số giả ngẫu nhiên đều có thể dự đoán được nếu hạt giống có thể được xác định hoặc đoán.

Tại sao sự khác biệt quan trọng?

Bởi vì có những ứng dụng mà tính bảo mật của hệ thống phụ thuộc vào sự không thể đoán trước .

  • Nếu TRNG được sử dụng để chọn từng thẻ thì hệ thống không khả dụng.
  • Nếu CPRNG được sử dụng để chọn từng thẻ thì hệ thống sẽ an toàn nếu hạt giống không thể đoán trước và không xác định.
  • Nếu một PRNG thông thường có không gian hạt nhỏ được sử dụng thì hệ thống sẽ không an toàn bất kể hạt giống đó là không thể đoán trước hay không biết; một không gian hạt giống đủ nhỏ dễ bị tấn công bằng vũ lực của loại tôi đã mô tả.

Sự khác biệt có liên quan gì đến việc phân phối đầu ra của PRNG không?

Tính thống nhất của phân phối hoặc thiếu đó cho các cuộc gọi cá nhân để RNG(n)không liên quan đến các vụ tấn công tôi đã mô tả.

Như chúng ta đã thấy, cả a PRNGCPRNGtạo ra các phân phối kém về xác suất chọn bất kỳ sàn riêng lẻ nào trong tất cả các sàn có thể. Điều PRNGtồi tệ hơn đáng kể, nhưng cả hai đều có vấn đề.

Một câu hỏi nữa:

Nếu TRNG tốt hơn nhiều so với CPRNG, điều này lại tốt hơn nhiều so với PRNG, tại sao mọi người sử dụng CPRNG hoặc PRNG?

Hai lý do.

Thứ nhất: chi phí. TRNG là đắt tiền . Tạo số thực sự ngẫu nhiên là khó khăn. CPRNG cho kết quả tốt cho nhiều cuộc gọi tùy ý chỉ với một cuộc gọi đến TRNG cho hạt giống. Mặt trái của khóa học là bạn phải giữ bí mật về hạt giống đó .

Thứ hai: đôi khi chúng tôi muốn dự đoán và tất cả những gì chúng tôi quan tâm là phân phối tốt. Nếu bạn đang tạo dữ liệu "ngẫu nhiên" làm đầu vào chương trình cho bộ kiểm tra và nó xuất hiện một lỗi, thì thật tuyệt khi chạy lại bộ kiểm tra lại tạo ra lỗi một lần nữa!

Tôi hy vọng rằng bây giờ rõ ràng hơn nhiều.

Cuối cùng, nếu bạn thích điều này thì bạn có thể thích đọc thêm về chủ đề ngẫu nhiên và hoán vị:


20
Ok, chàng trai và cô gái. Đó là đủ bình luận cho bây giờ. Nếu bạn muốn thảo luận thêm về vấn đề này, hãy lấy cho mình một phòng chat, kthnxbye!
Ivo Flipse

1
@Eric Nhưng hạt giống không được thiết lập lại trước mỗi lần rút bài mới, phải không? Vì vậy, trong khi bạn đúng rằng chỉ có tương đối ít quỹ đạo mà chúng tôi đang lấy mẫu, bạn không biết chính xác vị trí của quỹ đạo mà bạn đang ở hiện tại và quỹ đạo giao nhau.
NHƯ


Một cách xử lý tốt (nhưng dày đặc) các vấn đề liên quan nằm trong TAOCP vol 2 của Knuth, phần 3.5. Một trình tự ngẫu nhiên là gì? Các chuỗi giả ngẫu nhiên được thảo luận trong 3.5.F (trang 170). Xem thêm các tiêu chí của giả danh từ lý thuyết phức tạpBSI của Đức .
ShreevatsaR

160

Như Eric Lippert nói, nó không chỉ phân phối. Có nhiều cách khác để đo lường sự ngẫu nhiên.

Một trong những trình tạo số ngẫu nhiên ban đầu có một chuỗi trong bit có trọng số thấp nhất - nó xen kẽ 0 và 1. Do đó, LSB đã được dự đoán 100%. Nhưng bạn cần phải lo lắng nhiều hơn thế. Mỗi bit phải không thể đoán trước.

Đây là một cách tốt để suy nghĩ về vấn đề. Giả sử bạn đang tạo ra 64 bit ngẫu nhiên. Đối với mỗi kết quả, lấy 32 bit đầu tiên (A) và 32 bit (B) cuối cùng và tạo một chỉ mục thành một mảng x [A, B]. Bây giờ thực hiện kiểm tra một triệu lần và với mỗi kết quả, tăng mảng ở số đó, tức là X [A, B] ++;

Bây giờ vẽ sơ đồ 2D, trong đó số càng lớn, pixel càng sáng ở vị trí đó.

Nếu nó thực sự ngẫu nhiên, màu sắc phải là màu xám đồng nhất. Nhưng bạn có thể nhận được các mẫu. Ví dụ như sơ đồ "tính ngẫu nhiên" trong số thứ tự TCP của hệ thống Windows NT:

Windows NT

hoặc thậm chí cái này từ Windows 98:

Windows 98

Và đây là tính ngẫu nhiên của việc triển khai bộ định tuyến của Cisco (IOS). Cisco ISO

Những sơ đồ này là lịch sự của bài báo của Michał Zalewski . Trong trường hợp cụ thể này, nếu người ta có thể dự đoán số thứ tự TCP sẽ là gì của một hệ thống, thì người ta có thể mạo danh hệ thống đó khi thực hiện kết nối với hệ thống khác - cho phép chiếm quyền điều khiển kết nối, chặn giao tiếp, v.v. không thể dự đoán số tiếp theo 100% thời gian, nếu chúng ta có thể khiến kết nối mới được tạo dưới sự kiểm soát của mình , chúng ta có thể tăng cơ hội thành công. Và khi máy tính có thể tạo ra 100.000 kết nối trong vài giây, tỷ lệ của một cuộc tấn công thành công sẽ đi từ thiên văn học đến khả năng hoặc thậm chí có thể xảy ra.


30
Điều này thật tuyệt vời, nó mang lại những giọt nước mắt cho tôi. Cần có một ứng dụng tạo các ứng dụng này cho mọi HĐH (thiết bị di động / máy tính để bàn) và nền tảng (JVM / Javascript / etc).
HDave

5
Chức năng Windows rand () khá tốt! Nó tạo ra một đám mây không có bất kỳ mẫu rõ ràng nào. Xem thực hiện của tôi để thử nó (và các thuật toán khác) ra: github.com/Zalastax/visualize_random
Zalastax

93

Mặc dù số giả ngẫu nhiên được tạo bởi máy tính có thể chấp nhận được cho phần lớn các trường hợp sử dụng mà người dùng máy tính gặp phải, có những kịch bản yêu cầu số ngẫu nhiên hoàn toàn không thể đoán trước.

Trong các ứng dụng nhạy cảm với bảo mật như mã hóa, trình tạo số giả ngẫu nhiên (PRNG) có thể tạo ra các giá trị, mặc dù có vẻ ngoài ngẫu nhiên, trên thực tế có thể dự đoán được bởi kẻ tấn công. Ai đó đang cố gắng bẻ khóa một hệ thống mã hóa có thể đoán được các khóa mã hóa nếu PRNG được sử dụng và kẻ tấn công có thông tin về trạng thái của PRNG. Do đó, đối với các ứng dụng như vậy, một trình tạo số ngẫu nhiên tạo ra các giá trị thực sự không cần thiết là cần thiết. Lưu ý rằng một số PRNG được thiết kế để bảo mật bằng mật mã và có thể sử dụng được cho các ứng dụng nhạy cảm bảo mật này.

Thông tin thêm về các cuộc tấn công RNG có thể được tìm thấy trong bài viết Wikipedia này .


9
PRNG mã hóa tồn tại, và được sử dụng rộng rãi. Họ có thể từ một hạt giống có kích thước khiêm tốn tạo ra một dòng số ngẫu nhiên thực tế không giới hạn. Việc phân biệt luồng như vậy với các số ngẫu nhiên thực sự là không thể tính toán được, do đó không có thông tin bổ sung nào từ bất kỳ phần nào của luồng đó và đối với bất kỳ mục đích thực tế nào, các số này đều tốt như các số ngẫu nhiên thực.
aaaaaaaaaaaa

Tôi nghĩ cách dễ nhất để giải thích điều này là các thuật toán tạo số ngẫu nhiên phải được lập trình. Điều đó có nghĩa là có các hướng dẫn đang được tuân theo. Nếu có một bộ hướng dẫn, nó không thể là ngẫu nhiên.
Keltari

6
@Keltari Bạn đang thiếu yếu tố entropy ... Hầu hết các RNG (ít nhất là mã hóa) thu thập dữ liệu đầu vào từ các nguồn bên ngoài (ví dụ như chuyển động của chuột) và sử dụng như một phần của điều kiện bắt đầu - do đó, việc chuyển đổi từ Asang Bđược lập trình nhưng trạng thái ban đầu của A(nên) là vô duyên. Linux /dev/randomsẽ giữ một xấp xỉ về số lượng entropy có sẵn và ngừng đưa ra các con số nếu nó xuống quá thấp.
Cơ bản

Vì tò mò - tại sao đèn dung nham được coi là "thực sự ngẫu nhiên"? Tôi hiểu rằng nó thể hiện hành vi khá khó đoán, nhưng ai đó đủ hiểu về động lực học chất lỏng và cách những chất lỏng đó tương tác trong môi trường hấp dẫn của Trái đất chắc chắn có thể tạo ra kết quả "có thể dự đoán", phải không? Chắc chắn, đèn dung nham là không thể đoán trước, nhưng với tôi, chúng không ngẫu nhiên chút nào, nhưng rất dễ đoán.
theGreenCabbage

1
@theGreenCabbage: Tôi nghi ngờ rằng đèn dung nham là hỗn loạn. Đưa ra một mô hình máy tính đủ tốt và đủ các chữ số chính xác, về nguyên tắc, bạn có thể dự đoán hành vi trong một thời gian. Nhưng, vì hệ thống hỗn loạn, hai đèn dung nham với sự thay đổi nhỏ nhất trong điều kiện ban đầu sẽ nhanh chóng phân kỳ trong hành vi. (Và bình luận này bỏ qua những người thu hút hỗn loạn.)
dmm

76

Tôi đã thử nó trong Python: Đây là kết quả của 60 triệu cuộn. Biến thể cao nhất là 0,15. Đó không phải là ngẫu nhiên như nó sẽ nhận được sao?

Trên thực tế, nó "tốt" là xấu ... Tất cả các câu trả lời hiện có tập trung vào khả năng dự đoán được đưa ra một chuỗi nhỏ các giá trị ban đầu. Tôi muốn nêu một vấn đề khác:

    phân phối của bạn có độ lệch chuẩn nhỏ hơn nhiều so với cuộn ngẫu nhiên nên

Đúng ngẫu nhiên chỉ không đến khá gần trung bình "gần như chính xác 1 như thế nào bao giờ số nhiều nó có thể lựa chọn" mà bạn đang sử dụng như một dấu hiệu của chất lượng.

Nếu bạn xem câu hỏi Stack Exchange này về phân phối xác suất cho nhiều cuộn xúc xắc , bạn sẽ thấy một công thức cho độ lệch chuẩn của cuộn N xúc xắc (giả sử kết quả ngẫu nhiên thực sự):

 sqrt(N * 35.0 / 12.0).

Sử dụng công thức đó, độ lệch chuẩn cho:

  • 1 triệu cuộn là 1708
  • 60 triệu cuộn là 13229

Nếu chúng tôi nhìn vào kết quả của bạn:

  • 1 triệu cuộn: stddev (1000066, 999666, 1001523, 999452, 999294, 999999) là 804
  • 60 triệu cuộn: stddev (9997653, 9997789, 9996853, 10006533, 10002774, 9998398) là 3827

Bạn không thể mong đợi độ lệch chuẩn của một mẫu hữu hạn khớp chính xác với công thức, nhưng nó sẽ đến khá gần. Tuy nhiên, ở mức 1 triệu cuộn, bạn chưa đến một nửa số stddev thích hợp và 60 triệu bạn dưới một phần ba - điều đó trở nên tồi tệ hơn và đó không phải là sự trùng hợp ....

Pseudo-RNG có xu hướng di chuyển qua một chuỗi các số riêng biệt, bắt đầu bằng hạt giống và không xem lại số gốc trong một khoảng thời gian cụ thể. Ví dụ: việc triển khai rand()chức năng thư viện C cũ thường có khoảng thời gian là 2 ^ 32 và họ sẽ truy cập mọi số trong khoảng từ 0 đến 2 ^ 32-1 chính xác một lần trước khi lặp lại hạt giống. Vì vậy, nếu bạn mô phỏng 2 ^ 32 con xúc xắc cuộn mô đun trước (%) kết quả sẽ bao gồm mỗi số từ 0 đến 2 ^ 32, tổng số cho mỗi kết quả 1-6 sẽ là 715827883 hoặc 715827882 (2 ^ 32 không phải là bội số của 6) và do đó độ lệch chuẩn chỉ tầm thường trên 0. Sử dụng công thức ở trên, độ lệch chuẩn chính xác cho 2 ^ 32 cuộn là 111924. Dù sao đi nữa, vì số lượng cuộn giả ngẫu nhiên của bạn tăng lên, bạn hội tụ về 0 độ lệch chuẩn. Vấn đề có thể được dự kiến ​​là đáng kể khi số lượng cuộn là một phần đáng kể của thời kỳ, nhưng một số RNG giả có thể biểu hiện các vấn đề tồi tệ hơn - hoặc các vấn đề ngay cả với ít mẫu hơn - so với các mẫu khác.

Vì vậy, ngay cả khi bạn không quan tâm đến các lỗ hổng mật mã, trong một số ứng dụng, bạn có thể quan tâm đến việc có các bản phân phối không có kết quả quá mức, thậm chí giả tạo. Một số loại mô phỏng khá đặc biệt cố gắng tìm ra hậu quả của kết quả không đồng đều xảy ra một cách tự nhiên với các mẫu kết quả ngẫu nhiên riêng lẻ lớn, nhưng chúng được thể hiện dưới một số kết quả của pRNG. Nếu bạn đang cố gắng mô phỏng cách một dân số khổng lồ phản ứng với một sự kiện nào đó, vấn đề này có thể thay đổi hoàn toàn kết quả của bạn dẫn đến kết luận không chính xác.


Để đưa ra một ví dụ cụ thể: Giả sử một nhà toán học nói với một lập trình viên máy xì phé rằng sau 60 triệu cuộn mô phỏng - được sử dụng để nhấp nháy hàng trăm "đèn" nhỏ xung quanh màn hình, nếu đã có 10.013.229 hoặc nhiều hơn sáu, mà nhà toán học mong đợi 1 stddev từ trung bình, nên có một khoản thanh toán nhỏ. Theo quy tắc 68, 599595 (Wikipedia), điều này sẽ xảy ra khoảng 16% thời gian (~ 68% nằm trong độ lệch chuẩn / chỉ một nửa bên ngoài ở trên). Với trình tạo số ngẫu nhiên của bạn, đây là từ khoảng 3,5 độ lệch chuẩn trên trung bình: Dưới 0,025% cơ hội - gần như không có khách hàng nào nhận được lợi ích này. Xem bảng Độ lệch cao hơn trên trang vừa được đề cập, cụ thể:

| Range    | In range   | Outside range | Approx. freq. for daily event  |
| µ ± 1σ   | 0.68268... | 1 in 3        | Twice a week                   |
| µ ± 3.5σ | 0.99953... | 1 in 2149     | Every six years                |

Bạn đang so sánh táo và cam ở đây. Hai độ lệch chuẩn hoàn toàn không có gì để làm với nhau.
Jbeuh

50

Tôi chỉ viết trình tạo số ngẫu nhiên này để tạo ra các cuộn súc sắc

def get_generator():
  next = 1
  def generator():
    next += 1
    if next > 6:
      next = 1
    return next
  return generator

Bạn sử dụng nó như thế này

>> generator = get_generator()
>> generator()
1
>> generator()
2
>> generator()
3
>> generator()
4
>> generator()
5
>> generator()
6
>> generator()
1

v.v ... Bạn có vui khi sử dụng trình tạo này cho một chương trình chạy trò chơi súc sắc không? Hãy nhớ rằng, phân phối của nó chính xác là những gì bạn mong đợi từ một trình tạo "thực sự ngẫu nhiên"!

Các trình tạo số giả ngẫu nhiên thực hiện cùng một việc - chúng tạo ra các số có thể dự đoán được với phân phối chính xác. Chúng rất tệ vì cùng một lý do là trình tạo số ngẫu nhiên đơn giản ở trên là xấu - chúng không phù hợp với các tình huống mà bạn cần sự khó đoán thực sự, không chỉ là phân phối chính xác.


2
"Trình tạo số giả ngẫu nhiên ... tạo ra các số có thể dự đoán được với phân phối chính xác" - Chỉ vì PRNG không đảm bảo rằng nó có phân phối hoàn hảo (thực tế, các số thương mại lớn và chính xác là không lý do nêu trong những câu trả lời này). Mặc dù chúng có thể dự đoán được khi cung cấp đủ thông tin (thuật toán được sử dụng, khởi đầu hạt giống, giá trị đầu ra, w / e), chúng vẫn có phương sai.
Brian S

3
Bên cạnh những điểm, tôi biết, nhưng get_generator = lambda: itertools.cycle(range(1,7)), generator = get_generator(), next(generator) # and so onchỉ là quá tao nhã chưa kể đến :)
Janus Troelsen

2
@BrianS Trên thực tế, một PRNG thất bại trong các thử nghiệm phân phối theo thời gian sẽ được dự đoán theo định nghĩa. Vì vậy, trên một số N lớn, nếu bạn nhận được thậm chí một chút từ các đầu N / 2 trong N lật đồng xu, bạn có thể bắt đầu đặt cược vào các đầu và bạn có thể thắng nhiều hơn số tiền bạn thua. Tương tự như vậy, nếu bạn có một bản phân phối hoàn hảo của các đầu v. Đuôi, nhưng các đầu luôn đi theo cặp, thì bạn lại có một công thức để chiến thắng. Kiểm tra phân phối là cách bạn biết PRNG là tốt.
Jon Kiparsky

1
Bạn đã quên nonlocal next:-).
Kos

5
Ví dụ tốt hơn: Pi được cho là bình thường , có nghĩa là bất kỳ chuỗi chữ số nào có độ dài cho trước trong bất kỳ cơ sở nào xuất hiện không thường xuyên hơn bất kỳ chuỗi nào khác có độ dài đó trong cơ sở đó. Một thuật toán, khi được yêu cầu n bit ngẫu nhiên, sẽ lấy n bit tiếp theo của pi và trả về chúng ("hạt giống" là bit bạn bắt đầu), về lâu dài sẽ tạo ra một phân phối đồng đều hoàn hảo. Nhưng bạn vẫn không muốn nó cho trình tạo của mình - ai đó biết bó bit cuối cùng bạn tạo có thể tìm thấy lần đầu tiên chuỗi đó xảy ra, giả sử hạt giống của bạn ở đó và có khả năng là chính xác.
cpast

26

Việc tạo số ngẫu nhiên mà máy tính của bạn có thể thực hiện phù hợp với hầu hết các nhu cầu và bạn không thể gặp phải thời điểm mà bạn cần một số thực sự ngẫu nhiên.

Tạo số ngẫu nhiên thực sự có mục đích của nó mặc dù. Trong bảo mật máy tính, đánh bạc, lấy mẫu thống kê lớn, v.v.

Nếu bạn quan tâm đến các ứng dụng của số ngẫu nhiên, hãy xem bài viết Wikipedia .


12
Vấn đề lớn là khi bạn cần số ngẫu nhiên mà kẻ tấn công không thể dự đoán vì lý do bảo mật.
David Schwartz

16
Bạn chắc chắn sẽ đến một thời điểm mà bạn cần một con số thực sự ngẫu nhiên. Đủ để mở một trang web bắt đầu bằng https://...
Jan Hudec

3
@JanHudec: Vâng, trong sử dụng hàng ngày, bạn sẽ cần các số ngẫu nhiên an toàn ngay khi bạn mở bất kỳ chương trình nào, trước khi bạn nhập vào một thanh địa chỉ: xem ngẫu nhiên bố cục không gian địa chỉ . Đó là lý do tại sao những thứ như thế này xảy ra.
Reid

5
@JanHudec Tôi đã nói cụ thể theo nghĩa là bạn sẽ cần sử dụng một trình tạo số ngẫu nhiên trực tuyến. Số ngẫu nhiên thực sự được sử dụng thường xuyên, nhưng rất ít người thực sự cần phải tự tạo chúng.
Alex McKenzie

2
Máy đánh bạc cũng sử dụng PRNG, không phải TRNG. Máy phát chạy mọi lúc và một số được chọn vào thời điểm chính xác mà nút xoay được đẩy. Tổng số PRNG và thời gian nhấn nút thực sự ngẫu nhiên lên tới TRNG.
Roger Dahl

26

Các số ngẫu nhiên được tạo bởi các hàm điển hình trong hầu hết các ngôn ngữ lập trình không hoàn toàn là các số ngẫu nhiên. Chúng là những số giả ngẫu nhiên. Vì chúng không hoàn toàn là các số ngẫu nhiên, chúng có thể được đoán với đủ thông tin về các số được tạo trước đó. Vì vậy, đây sẽ là một thảm họa cho bảo mật trong mật mã .

Ví dụ, hàm tạo số ngẫu nhiên sau đây được sử dụng glibckhông tạo ra số ngẫu nhiên hoàn toàn. Số ngẫu nhiên giả được tạo bởi điều này có thể được đoán. Đó là một sai lầm cho các vấn đề bảo mật. Có một lịch sử của điều này trở thành thảm họa. Điều này không nên được sử dụng trong mật mã.

glibc random():
    r[i] ← ( r[i-3] + r[i-31] )  % (2^32)
    output  r[i] >> 1

Loại trình tạo số ngẫu nhiên giả này không bao giờ được sử dụng ở những nơi nhạy cảm về bảo mật mặc dù có ý nghĩa thống kê rất xa.

Một trong những cuộc tấn công nổi tiếng vào khóa ngẫu nhiên giả là tấn công vào WEP 802.11b . WEP có khóa dài 104 bit, được nối với IV (bộ đếm) 24 bit để tạo khóa 128 bit, lần lượt được áp dụng cho thuật toán RC4 để tạo khóa ngẫu nhiên giả.

( RC4( IV + Key ) ) XOR (message)

Các phím có liên quan chặt chẽ với nhau. Ở đây, chỉ IV tăng 1 trong mỗi bước và tất cả những người khác vẫn giữ nguyên. Vì điều này không hoàn toàn ngẫu nhiên, nó là thảm họa và dễ dàng bị phá vỡ. Khóa có thể được phục hồi bằng cách phân tích khoảng 40000 khung, đó là vấn đề của vài phút. Nếu WEP sử dụng IV 24 bit hoàn toàn ngẫu nhiên, thì nó có thể an toàn cho đến khoảng 2 ^ 24 (gần 16,8 triệu) khung.

Vì vậy, người ta nên đi với trình tạo số ngẫu nhiên thuần túy trong các vấn đề nhạy cảm bảo mật khi có thể.


3
Tôi đổ lỗi cho công cụ WEP trên một giao thức được thiết kế tồi bằng cách sử dụng một mật mã yếu. Với mật mã dòng hiện đại, bạn có thể sử dụng bộ đếm như IV.
CodeInChaos

2
Vấn đề chính với WEP là lặp lại khóa trong 2 ^ 24 (gần 16 triệu) khung. Nó thậm chí còn tệ hơn với các khóa liên quan khiến nó có thể bẻ khóa mã trong khoảng 40000 khung hình. Điểm chính ở đây là chìa khóa không phải là ngẫu nhiên. Nó có liên quan chặt chẽ, do đó rất dễ bị nứt.
Bohhu

1
Tính giả ngẫu nhiên chỉ xấu khi mã hóa khi tạo khóa mật mã . Nó là hoàn toàn tốt đẹp ngoài đó. Thật vậy, RC4 không khác gì một trình tạo số giả ngẫu nhiên được tạo mầm với sự mở rộng 128 bit của khóa XORed trên bản rõ của thông điệp.
Matt

12

Sự khác biệt là số giả tạo được tạo ra có thể dự đoán được (lặp lại) sau một thời gian khi số ngẫu nhiên thực sự không có. Độ dài cần lặp lại tùy thuộc vào độ dài của hạt giống được sử dụng cho thế hệ của nó.

Đây là một video khá hay về chủ đề đó: http://www.youtube.com/watch?v=itaMNuWLzJo


Dự đoán! = Lặp đi lặp lại. Mersenne Twister là một ví dụ tốt về điều đó. Trên hầu hết việc thực hiện sau 624 Int32, bạn có thể dự đoán tất cả các số tiếp theo, nhưng chuỗi Mersenne Twister dài hơn thế nhiều (2 ^ 19937 - 1).
HoLyVieR

Tôi không hiểu tại sao câu trả lời này không được đẩy lên, vì dường như đây là câu trả lời chính xác và ngắn gọn cho câu hỏi, ít nhất là một phần. Số ngẫu nhiên giả có thể dễ dàng dự đoán sau một số lần rút, số lần rút khác nhau với thuật toán "chất lượng" giả ngẫu nhiên. Chọn thuật toán "tốt" là xem xét các khía cạnh: 1. mọi giá trị được vẽ theo tần số (phân phối) bằng nhau, 2. phải mất một "thời gian dài" để khởi động lại chuỗi ở đầu và bắt đầu vẽ lại các số tương tự trong cùng một thứ tự.
phút

"số ngẫu nhiên thực sự không [dự đoán]". Đối với ngày hôm nay điều này là đúng. Bây giờ nếu chúng ta tin vào lý thuyết Vụ nổ lớn và chúng ta có nhiều sức mạnh để tính toán trạng thái của Vũ trụ bất cứ lúc nào sau BB, dựa trên vật lý thì ... chúng ta có thể dự đoán tương lai, bao gồm cả thực tế là Tôi đang viết bình luận rất chính xác này. Đúng?
phút

Điều đó là đúng về mặt giả thuyết, tuy nhiên, nếu xét đến mức độ lớn của entropy liên quan đến các hành động thực tế của các cơ thể thực, thì sức mạnh tính toán cần có sẽ rất lớn. Hãy nghĩ rằng các lục địa được bảo hiểm trong máy tính. Thêm vào đó, vì phụ thuộc vào trạng thái trước đó, trạng thái của mọi cơ thể trong vũ trụ tại mọi thời điểm sẽ cần được lưu trữ, theo định nghĩa sẽ cần nhiều không gian hơn trong vũ trụ, chứa đầy bộ máy nhớ
TheEn Môi trường

@TheEn Môi trường - À! "Các lục địa được bao phủ trong máy tính" ... đó không phải là "Hướng dẫn về thiên hà của Hitchhiker" sao? ;-)
ysap

10

Giả sử rằng một số ngẫu nhiên giả có thể được đoán bởi bất cứ ai trước khi nó được tạo ra.

Đối với các ứng dụng tầm thường, tính ngẫu nhiên giả là tốt, như với ví dụ của bạn, bạn sẽ nhận được tỷ lệ phần trăm chính xác (khoảng 1/6 tổng số kết quả) với một số biến thể nhỏ (Bạn sẽ thấy nếu bạn tung xúc xắc 600k lần);

Tuy nhiên, khi nói đến những thứ như bảo mật máy tính; Sự ngẫu nhiên thực sự là cần thiết.

Ví dụ, thuật toán RSA bắt đầu bằng việc máy tính chọn hai số ngẫu nhiên (P và Q) và sau đó thực hiện một số bước cho các số đó để tạo các số đặc biệt được gọi là khóa chung và khóa riêng của bạn. (Phần quan trọng của khóa riêng là nó là riêng tư và không ai biết điều đó!)

Nếu kẻ tấn công có thể biết hai số 'ngẫu nhiên' mà máy tính của bạn sẽ chọn, chúng có thể thực hiện các bước tương tự để tính khóa riêng của bạn (Số mà không ai khác phải biết!)

Với khóa riêng của bạn, kẻ tấn công có thể làm những việc như a) Nói chuyện với ngân hàng của bạn giả vờ là bạn, b) Lắng nghe lưu lượng truy cập internet 'an toàn' của bạn và có thể giải mã nó, c) Giả trang giữa bạn và các bên khác trên internet.

Đó là nơi mà tính ngẫu nhiên thực sự (nghĩa là không thể đoán / tính toán) được yêu cầu.


10

Số ngẫu nhiên đầu tiên mà tôi từng sử dụng có đặc tính tuyệt vời là bất kỳ hai số ngẫu nhiên liên tiếp nào, số thứ hai lớn hơn với xác suất 0,6. Không phải 0,5. Và cái thứ ba lớn hơn cái thứ hai với xác suất 0,6, v.v. Bạn có thể tưởng tượng làm thế nào mà chơi tàn phá với một mô phỏng.

Một số người sẽ không tin tôi điều này thậm chí có thể xảy ra với các số ngẫu nhiên được phân bổ đều, nhưng rõ ràng là có thể nếu bạn nhìn vào chuỗi (1, 3, 5, 2, 4, 1, 3, 5, 2, 4, ...) trong đó số thứ hai của hai số lớn hơn với xác suất 0,6.

Mặt khác, đối với mô phỏng, điều quan trọng là có thể tái tạo các số ngẫu nhiên. Giả sử bạn thực hiện mô phỏng lưu lượng truy cập và muốn tìm hiểu xem một số hành động bạn có thể thực hiện có thể cải thiện lưu lượng truy cập như thế nào. Trong trường hợp đó, bạn muốn có thể tạo lại chính xác cùng một dữ liệu lưu lượng truy cập (như mọi người đang cố gắng vào thị trấn) bằng các hành động khác nhau mà bạn đã cố gắng cải thiện lưu lượng.


8

Câu trả lời ngắn gọn là mọi người thường yêu cầu "sự ngẫu nhiên thực sự" vì một lý do xấu, cụ thể là họ không có hiểu biết về mật mã.

Các nguyên thủy mã hóa như mật mã dòngCSPRNG được sử dụng để tạo ra các luồng bit lớn không thể đoán trước một khi chúng được cung cấp một vài bit không thể đoán trước.

Người đọc cẩn thận bây giờ sẽ nhận ra có một vấn đề bootstrapping ở đây: chúng ta phải thu thập một vài bit entropy để bắt đầu tất cả. Sau đó, có thể cung cấp cho họ một CSPRNG , lần lượt sẽ vui vẻ cung cấp tất cả các bit không thể đoán trước mà chúng ta cần. Do đó, cần phải có RNG phần cứng để tạo CSPRNG . Đây là trường hợp duy nhất mà entropy được yêu cầu trong sự thật.

(Tôi nghĩ rằng điều này nên được đăng trong Bảo mật hoặc Mật mã.)

Chỉnh sửa: Cuối cùng, người ta phải chọn một trình tạo số ngẫu nhiên đủ tốt cho nhiệm vụ được hình dung và liên quan đến việc tạo số ngẫu nhiên, phần cứng không nhất thiết phải tương đương tốt. Cũng giống như PRNG xấu, các nguồn ngẫu nhiên phần cứng thường có thành kiến.

Chỉnh sửa: Một số người ở đây giả định mô hình mối đe dọa trong đó kẻ tấn công có thể đọc trạng thái bên trong của CSPRNG và từ đó đi đến kết luận rằng CSPRNG không phải là giải pháp an toàn. Đây là một ví dụ về mô hình chủ đề kém. Nếu kẻ tấn công sở hữu hệ thống của bạn, trò chơi kết thúc, đơn giản và đơn giản. Nó không tạo ra bất kỳ sự khác biệt nào cho dù bạn sử dụng TRNG hay CSPRNG tại thời điểm này.

Chỉnh sửa: Vì vậy, để tổng hợp tất cả những điều này ... Entropy được yêu cầu để tạo CSPRNG. Một khi điều này được thực hiện, một CSPRNG sẽ cung cấp tất cả các bit không thể đoán trước mà chúng ta cần cho các ứng dụng bảo mật nhanh hơn nhiều so với chúng ta có thể (thường) thu thập entropy. Nếu không thể dự đoán được, chẳng hạn như để mô phỏng, Mersenne Twister sẽ cung cấp các số có thuộc tính thống kê tốt với tốc độ cao hơn nhiều.

Chỉnh sửa: Bất kỳ ai sẵn sàng hiểu vấn đề tạo số ngẫu nhiên an toàn nên đọc bài này: http://www.cigital.com/whitepapers/dl/The_Importance_of_Reliable_Randomness.pdf


2
Đó không nhất thiết là một câu hỏi bảo mật. Tôi nghĩ rằng có những lý do để sử dụng các số thực sự ngẫu nhiên không liên quan đến bảo mật. Nếu tôi đang thực hiện một số nghiên cứu khoa học phụ thuộc vào các số ngẫu nhiên và vì lý do quan trọng là các số đó là ngẫu nhiên nhất có thể, tôi chắc chắn đã tận dụng RNG phần cứng để tôi có thể yên tâm rằng mọi thuộc tính được quan sát không phải là do theo quirks của RNG.
Kef Schecter

3
@KefSchecter Các PRNG phần cứng đã nghe của họ thường có đầu ra sai lệch và / hoặc tương quan. Họ cần một bước xử lý bài để biến nó thành đầu ra độc lập thống nhất. Không có lý do để tin rằng bước xử lý bài này đáng tin cậy hơn một mật mã dòng hiện đại. Tôi chắc chắn sẽ tin tưởng vào mật mã dòng hơn. Là một phần thưởng bổ sung, nó có thể tái tạo, có giá trị trong khoa học.
CodeInChaos

Được rồi. Nhưng điều tương tự sẽ áp dụng như nhau cho các ứng dụng mật mã? Ngay cả câu trả lời gievn ở đây cũng nói rằng bạn cần RNG phần cứng để tạo CSPRNG.
Kef Schecter

2
@KefSchecter Có, các ứng dụng tiền điện tử cần số ngẫu nhiên thực sự để tạo CSPRNG. Nhưng đối với mọi thứ khác, chúng ta có thể sử dụng CSPRNG đó.
CodeInChaos

@KefSchecter: Các ứng dụng mã hóa yêu cầu luồng không thể được tái tạo trên toàn thế giới. Ngược lại, trong các ứng dụng khoa học, việc có thể chỉ ra rằng các số "ngẫu nhiên" mà người ta đang sử dụng không được chọn đơn giản để hiển thị phân tích của một người trong một ánh sáng tốt là hữu ích. Ví dụ: nếu một người thông báo sau khi thông báo phương pháp của mình rằng người ta sẽ tạo dữ liệu theo một kiểu nhất định bằng cách sử dụng số xổ số của ngày hôm sau, độc giả có thể tin tưởng rằng người ta đã không làm mờ kết quả của mình ngay cả khi bản vẽ trong tuần chỉ có vài chục bit của entropy.
supercat

7

Không phải tất cả các PRNG đều phù hợp cho mọi mục đích sử dụng. Ví dụ: Java.util.SecureRandom sử dụng hàm băm SHA1, có kích thước đầu ra là 160 bit. Điều đó có nghĩa là có 2 160 luồng số ngẫu nhiên có thể đến từ nó. Đơn giản như thế. Bạn không thể nhận được nhiều hơn 2 160 giá trị của trạng thái nội bộ. Do đó, bạn không thể nhận được hơn 2 160 luồng số ngẫu nhiên duy nhất từ ​​một hạt giống, bất kể hạt giống của bạn đến từ đâu. Windows CryptGenRandom được cho là sử dụng trạng thái 40 byte, nó có 2 320 số ngẫu nhiên có thể có.

Số cách để xáo trộn một cỗ bài 52 lá tiêu chuẩn là 52!, Xấp xỉ 2 226 . Do đó, bất kể seeding, bạn không thể sử dụng Java.util.SecureRandom để xáo trộn một cỗ bài. Có khoảng 2 66 shuffles có thể mà nó không thể tạo ra. Tất nhiên, chúng tôi không biết họ là ai ...

Vì vậy, nếu tôi có một nguồn, ngẫu nhiên, 256 bit ngẫu nhiên thực sự (ví dụ: từ thẻ RNG Quantis), tôi có thể tạo một PRNG như CryptGenRandom () với hạt giống đó và sau đó sử dụng PRNG để xáo trộn một bộ bài thẻ. Nếu tôi khởi động lại với sự ngẫu nhiên thực sự mỗi lần xáo trộn, điều này sẽ ổn: không thể đoán trước và ngẫu nhiên theo thống kê. Nếu tôi đã làm điều tương tự với Java.util.SecureRandom, sẽ có những xáo trộn không thể tạo ra được, bởi vì nó không thể được tạo ra với 256 bit entropy và trạng thái bên trong của nó không thể biểu thị tất cả các xáo trộn có thể.

Lưu ý rằng kết quả java.util.SecureRandom sẽ không thể đoán trước được và ngẫu nhiên theo thống kê. Không có kiểm tra thống kê bao giờ sẽ xác định một vấn đề! Nhưng đầu ra của RNG không đủ lớn để bao gồm toàn bộ miền của tất cả các đầu ra có thể cần để mô phỏng một cỗ bài.

Và hãy nhớ, nếu bạn thêm những người thích đùa vào, đó là 54! mà bạn phải đảm bảo, đòi hỏi khoảng 2 238 khả năng.


2
Tại sao bạn quan tâm rằng một số xáo trộn không thể xảy ra? Hạn chế đó không có tác dụng quan sát được.
CodeInChaos

2
Tôi sắp xếp câu hỏi. Đối với các công ty chơi game được quản lý chặt chẽ, sự thiên vị như vậy sẽ chứng minh một cách toán học rằng cơ hội chiến thắng trò chơi bài của bạn khác với máy tính so với một cỗ bài giấy. Không quan trọng là cơ hội tốt hơn hay tồi tệ hơn. Họ KHÁC BIỆT. Máy tính không tương đương về mặt đạo đức với một bộ bài thực sự. Hơn nữa, chúng tôi không thể mô tả sự khác biệt. Các công ty chơi game phải đối mặt với tiền phạt quy định cứng sẽ quan tâm rất nhiều.
Paco Hope

1
Nhưng nó có thể được phát hiện. Tôi phát hiện ra nó bằng cách sử dụng một quy trình đã biết: xem xét mã nguồn và kiến ​​thức về miền vấn đề. Đó là những gì đáng chú ý. Tôi KHÔNG thể sử dụng phân tích thống kê tự động. Nó có thể được phát hiện như ai đó sử dụng java.util.Random hoặc Mersenne Twister. Phân tích thống kê không phải là cơ chế phát hiện hợp lệ duy nhất cho RNG / vấn đề không khớp miền. Thất bại vượt qua máy dò đó, theo định nghĩa, không thành công.
Paco Hope

1
Tôi không bao giờ không đồng ý với tuyên bố đó. Những gì tôi nói là phân tích thống kê không phải là bằng chứng không thể sai lầm rằng RNG / PRNG là chính xác. Đây là một ví dụ về một âm tính giả. Nó sẽ không chính xác, nhưng kiểm tra đầu ra thống kê sẽ vượt qua nó. Nếu tôi sử dụng SHA1 (1), SHA1 (2), SHA1 (3) ... SHA1 (n) làm "RNG" của tôi cũng sẽ vượt qua các bài kiểm tra thống kê. Nó cũng sai. Định nghĩa về chính xác mở rộng ra ngoài định nghĩa "vượt qua các bài kiểm tra thống kê." Vượt qua các bài kiểm tra thống kê là cần thiết, nhưng không đủ.
Paco Hope

4
@CodesInChaos: Lập luận "chúng tôi không biết về một cuộc tấn công có thể lợi dụng thực tế là phần lớn các xáo trộn IRL có thể sẽ không bao giờ được tạo ra" không ngụ ý rằng một cuộc tấn công như vậy là không thể, chỉ là chúng tôi không Tôi không biết nó là gì hoặc làm thế nào để bảo vệ chống lại nó. Thái độ đúng đắn trong trường hợp đó là loại bỏ khả năng tấn công bằng cách loại bỏ điều kiện: tạo ra một RNG có chất lượng đủ để nó thực sự có thể tạo ra mọi sàn có thể.
Eric Lippert

6

Số giả ngẫu nhiên được tạo bằng hàm toán học và giá trị ban đầu (được gọi là hạt giống ), trong khi số ngẫu nhiên thì không. Khả năng dự đoán của chúng làm cho chúng cực kỳ hữu ích cho phát lại trò chơi, vì bạn chỉ cần lưu hạt giống và đầu vào của người chơi - AI sẽ phản hồi theo cách chính xác "ngẫu nhiên" mỗi lần.


6

Sự khác biệt giữa số ngẫu nhiên "thật" và "giả" là khả năng dự đoán. Câu trả lời này đã được cung cấp.

Tuy nhiên, khả năng dự đoán không nhất thiết là một điều xấu như hầu hết các ví dụ đang hiển thị. Dưới đây là một ví dụ thực tế về một trong những trường hợp hiếm hoi có khả năng dự đoán tốt: Hệ thống định vị toàn cầu.

Mỗi vệ tinh sử dụng một mã PRN riêng biệt ( mã Vàng ) phù hợp với tương quan tự động hoặc tương quan chéo cần thiết cho việc đo thời gian truyền tín hiệu. Đối với các mã Vàng này, mối tương quan với nhau đặc biệt yếu, tạo ra khả năng nhận dạng không rõ ràng của vệ tinh, nhưng cho phép tính toán khoảng cách bằng tương quan giữa chuỗi phát ra và máy thu.


2

Để kiểm tra nhanh tính ngẫu nhiên, bạn lấy các điểm có tọa độ ngẫu nhiên trong [0; 1) sau đó đặt chúng vào khối k chiều. Sau đó, bạn làm thủ tục để cắt khối lập phương này thành các subcubes - mỗi thể tích của subcube (hoặc subsphere) phải được đo chính xác bằng thủ tục này với các dao động theo định lý đã biết.

Chất lượng ngẫu nhiên rất quan trọng khi bạn gặp ...

  1. mục đích an ninh. Khi bạn tạo số để sử dụng làm tham số cho thế hệ khóa của mình và rất có thể dự đoán được - kẻ thù sẽ tìm ra nó với xác suất 100% và làm cho trường tìm kiếm nhỏ hơn nhiều.

  2. mục đích khoa học. Trong khoa học, bạn không chỉ phải có trung bình trung bình trong điều kiện tốt mà còn phải loại bỏ mối tương quan giữa các số ngẫu nhiên khác nhau. Vì vậy, nếu bạn lấy (a_i - a) (a_ {i + 1} -a) và tìm phân phối của nó, nó phải tương ứng với số liệu thống kê.

Tương quan cặp được gọi là "ngẫu nhiên yếu". Nếu bạn muốn sự ngẫu nhiên thực sự, bạn phải có tương quan bậc cao với hơn 2 phương sai.

Ngày nay chỉ có máy phát điện cơ học lượng tử cung cấp sự ngẫu nhiên thực sự.


1

Tại sao sự ngẫu nhiên thực sự quan trọng?

Về cơ bản có hai lý do chính tại sao sự ngẫu nhiên thực sự là cần thiết:

  1. Nếu bạn đang sử dụng RNG cho mật mã (bao gồm cả những thứ như đánh bạc bằng tiền thật và chạy xổ số), thì PRNG sẽ khiến bạn yếu hơn nhiều so với phân tích toán học về nó (giả sử TRNG) sẽ khiến bạn tin tưởng. PRNG sẽ không thực sự ngẫu nhiên, nhưng có một mô hình - đối thủ có thể khai thác mô hình để phá vỡ một mật mã đáng lẽ không thể bị bẻ khóa.
  2. Nếu bạn đang sử dụng RNG để mô phỏng các đầu vào "ngẫu nhiên", ví dụ để kiểm tra lỗi hoặc mô phỏng, thì PRNG làm cho cách tiếp cận của bạn yếu đi. Khi bạn phát hiện ra không có lỗi, sẽ luôn có một nghi ngờ dai dẳng: Có một lỗi không đáng chú ý với mẫu PRNG của tôi, nhưng sẽ xuất hiện nếu tôi chỉ sử dụng TRNG? Phát hiện mô phỏng của tôi có mô tả chính xác thực tế không, hay hiện tượng tôi phát hiện ra chỉ đơn giản là một tạo tác của mẫu PRNG?

Bên ngoài những khu vực này, nó không thực sự quan trọng. Hãy cẩn thận: Nếu PRNG của bạn rất, rất tệ, nó có thể vẫn không phù hợp - bạn không muốn tạo ra một trò chơi Craps trong đó con súc sắc luôn xuất hiện ngay cả, người chơi của bạn sẽ không thích nó.

Làm thế nào là PRNG của Python không đủ tốt?

Rất khó có khả năng bạn sẽ có thể phát hiện ra những cạm bẫy của một PRNG thực sự bằng cách sử dụng phương pháp đơn giản như vậy. Phân tích thống kê về RNG là một lĩnh vực khoa học theo đúng nghĩa của nó và một số thử nghiệm rất tinh vi có sẵn để đánh giá "tính ngẫu nhiên" của thuật toán. Đây là những tiến bộ hơn nhiều so với nỗ lực đơn giản của bạn.

Mỗi nhà phát triển phần mềm tạo thư viện trong thế giới thực, chẳng hạn như nhà phát triển Python, sử dụng các kiểm tra thống kê này làm thước đo để xem liệu triển khai PRNG của họ có đủ tốt hay không. Vì vậy, ngoại trừ các trường hợp giám sát nhà phát triển thực tế, rất khó có khả năng bạn có thể dễ dàng phát hiện một mẫu trong PRNG trong thế giới thực. Điều đó không có nghĩa là không có mẫu - PRNG có mẫu theo định nghĩa.


0

Về cơ bản, bạn không thể chứng minh một nguồn là ngẫu nhiên bằng phân tích toán học của đầu ra, bạn cần ví dụ như một mô hình vật lý cho biết nguồn đó là ngẫu nhiên (như trong phân rã phóng xạ).

Bạn chỉ có thể chạy thử nghiệm hàng loạt để tìm mối tương quan thống kê trong dữ liệu đầu ra, trong trường hợp đó, dữ liệu được chứng minh là không ngẫu nhiên (nhưng cũng là một nguồn ngẫu nhiên có thể có đầu ra không ngẫu nhiên, hoặc nó sẽ không thực sự ngẫu nhiên nếu không thể đưa ra cụ thể đầu ra). Mặt khác, nếu các bài kiểm tra được thông qua, bạn có thể nói dữ liệu là giả ngẫu nhiên.

Vượt qua một số thử nghiệm ngẫu nhiên chỉ có nghĩa là bạn có PRNG (trình tạo số ngẫu nhiên giả) tốt, có thể hữu ích cho các ứng dụng không bảo mật.

Nếu bảo mật có liên quan (nghĩa là mã hóa, tạo ra một loại muối chính, tạo số ngẫu nhiên để đánh bạc ...) thì không đủ để có một PRNG tốt, nó cần phải có các phẩm chất bổ sung, như đầu ra chức năng không dễ đoán từ các đầu ra trước đó, chức năng cần phải có chi phí tính toán mong muốn (đủ giới hạn để có thể sử dụng được, nhưng đủ cao để đánh bại các nỗ lực cưỡng bức), phần cứng chạy chức năng - hoặc trong thiết bị, trong trường hợp kỳ lạ ngày nay, nó là một thiết bị tương tự - không nên dễ bị giả mạo, v.v.

Có một PRNG tốt có thể hữu ích trong các trò chơi để tạo ra các mẫu mới và không thể đoán trước, và trong mã hóa - quá cồng kềnh để giải thích trong một bài đăng, chỉ cần nghĩ rằng vai trò của ngón tay cái là thoát thủ tục mã hóa là giả ngẫu nhiên, không hiển thị các mẫu có thể liên kết dữ liệu được mã hóa trước đó với dữ liệu được mã hóa hoặc liên kết dữ liệu văn bản đơn giản với dữ liệu được mã hóa hoặc liên quan đến hai loại mật mã khác nhau (do đó có thể đoán được trên các văn bản đơn giản) ....


-5

Truyện ngắn:

Tạo một hạt giống ngẫu nhiên bằng cách sử dụng micro giây hiện tại của hệ thống.

Thủ thuật này khá cũ và vẫn còn hoạt động.

Không bao gồm yếu tố vũ lực, trong đó tôi có thể xác định mọi kết hợp bằng cách "đặt cược" trong tất cả các số có thể và đó không phải là điểm của câu hỏi này, đặc biệt khi hầu hết các số ngẫu nhiên được làm tròn trước khi sử dụng.

Giả sử một ví dụ, tôi có thể xác định hạt giống được sử dụng chỉ bằng 10 giá trị. Vì vậy, biết hạt giống, tôi có thể đoán giá trị tiếp theo.

Nếu tôi sử dụng seed = 1 thì tôi có thể có được chuỗi tiếp theo:

1, 2, 3, 4, 5, 6, 7, 8, 9 ... (và tôi trừ rằng hạt giống đã sử dụng id 1 và giá trị tiếp theo 10)

Nhưng, điều gì sẽ xảy ra nếu thay đổi gửi mọi giá trị "thứ n"?. Thay đổi hạt giống bằng micro giây hiện tại là một mẹo rẻ (nghĩa là nó không yêu cầu nhiều chu kỳ CPU).

Vì vậy, chuỗi bây giờ là: (seed = 1) 1, 2, 3, 4, 5, (seed = 2), 7, 9, 11, 13 ... (15?)

Trong trường hợp này:

a) Tôi không thể khấu trừ hạt giống nào đã được sử dụng.

b) Ergo, tôi không thể đoán giá trị tiếp theo.

c) Dự đoán duy nhất mà tôi có thể làm là khấu trừ rằng hạt giống tiếp theo có thể là một số chính.

Dù sao, hầu hết các thuật toán tạo ngẫu nhiên hiện đại đã sử dụng thủ thuật này dưới mui xe.

Sự thật là, chúng ta không cần một máy tính lượng tử để tạo ra một số ngẫu nhiên "thật", sự không chính xác của tinh thể thạch anh trong máy tính của chúng ta hoạt động như một máy phát ngẫu nhiên, hiệu quả ngẫu nhiên của CPU cũng thay đổi mà không cần xem xét CPU thường thực hiện một số nhiệm vụ cùng một lúc.


2
Đây là một ý tưởng khá tồi tệ và nó là một nguồn dễ bị tổn thương cho những thứ cần trình tự không thể đoán trước được. Nếu bạn mất micro giây, bạn chỉ có 10 ^ 6 khả năng hạt giống khá thấp.
HoLyVieR

@HoLyVieR: chắc chắn là một ý tưởng tồi nếu bạn quan tâm đến bảo mật, nhưng không hoàn toàn xấu như bạn nghĩ: bạn thường sử dụng micro giây kể từ khi hệ thống khởi động (hoặc unix epoch ....) làm tăng đáng kể phạm vi của các giá trị có thể.
mikera

1
@mikera Không có gì tốt hơn, thời gian mà yêu cầu được xử lý là có thể dự đoán được. Đó là một lỗ hổng bảo mật cho một số lượng lớn chức năng đặt lại mật khẩu. Các tập lệnh đó đã tạo mã thông báo "ngẫu nhiên" với kỹ thuật của bạn và kẻ tấn công có thể tìm thấy mã thông báo được tạo do việc tìm thời gian thực thi mã này khá tầm thường ... đó là cùng lúc yêu cầu đặt lại mật khẩu được gửi + 150ms.
HoLyVieR

Chắc chắn, tình hình đó là rất xấu. Nhưng tình huống mà nhà nước được gieo mầm khi khởi động hệ thống và kẻ tấn công không có cách nào tốt để đoán thời gian khởi động không hoàn toàn xấu. Bạn có thể dễ dàng có 10 ^ 12 microsocond có thể lựa chọn, điều này có thể khiến một số loại tấn công không thể thực hiện được. Để rõ ràng: tất cả các giải pháp này đều khá tệ từ góc độ tiền điện tử, nhưng hằng số là vấn đề .
mikera

Đối với các máy chủ trực tuyến, thông tin thời gian hoạt động của hệ thống đôi khi được cung cấp công khai. Hoặc bạn có thể lấy nó từ trang trạng thái "Sự cố. Máy chủ lại.". Hoặc bạn có thể ping, chờ một thời gian chết lớn và lưu ý rằng đó có thể là khởi động lại máy (sẽ cho hàng trăm triệu thời gian để kiểm tra, mức này khá thấp).
Dereckson
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.