Làm thế nào có thể phát hiện ra rằng một trình tạo số không thực sự ngẫu nhiên?


20

Tôi nghe nói rằng việc tạo số ngẫu nhiên trong máy tính không thực sự ngẫu nhiên, nhưng không có thuật toán hiệu quả để phát hiện ra nó. Làm thế nào nó có thể được phát hiện ở tất cả?


1
Bài đăng này có thể giúp bạn.
Anton

6
Có nguy cơ âm thanh mang tính mô phạm, thực sự không thể nói chắc chắn rằng một nguồn nhất định không phải là ngẫu nhiên, nếu tất cả những gì bạn làm là kiểm tra kết quả đầu ra của nó. Bạn có thể lật một đồng xu công bằng lần liên tiếp và nhận được đầu mỗi lần, và cơ hội bạn nhận được đuôi trên lần ném 10 100 + 1 vẫn là 50%. Bằng cách kiểm tra nguồn, chúng ta thường có thể xác định những thứ không ngẫu nhiên (ví dụ: trình tạo số giả ngẫu nhiên ... chúng ta có thể dự đoán chuỗi từ hạt giống và thuật toán). Nhiều nguồn ngẫu nhiên rõ ràng có thể không được hiểu đủ để dự đoán một cách đáng tin cậy. Đây là triết lý, mặc dù. 1010010100+1
Patrick87

@ Patrick87 Nếu với "sự chắc chắn", bạn có nghĩa là về mặt toán học, điều đó đúng. Tuy nhiên, có các kiểm tra thống kê có thể mang lại cho bạn ý nghĩa tùy ý (miễn là dữ liệu là "tốt").
Raphael

@ Patrick87 Lúc nguy cơ sounding trần tục ... bạn nói "Bạn có thể lật một đồng xu bằng lần liên tiếp và có được người đứng đầu mỗi lần" ... không, tôi không thể. Bất kỳ mô hình nào cho phép tôi nhìn thấy thậm chí 10 3 đầu liên tiếp và vẫn tin rằng đó là một đồng tiền công bằng không nắm bắt được thực tế rất tốt. Điều này thực sự là triết học, mặc dù. ;-)10100103
Don nở

Câu trả lời:


15

Máy tính thực sự ngẫu nhiên:

Tính ngẫu nhiên thực sự là không thể đối với Turing Machines theo nghĩa lý thuyết và hầu hết các máy tính không thể tạo ra đầu ra thực sự ngẫu nhiên. Do đó, một số máy tính hiện đại bao gồm phần cứng cho phép máy tính truy cập vào nguồn bên ngoài, hy vọng sẽ bao gồm một số ngẫu nhiên. Một ví dụ về cách thực hiện điều này là theo dõi những dao động nhỏ về nhiệt độ bên trong máy tính. Tính ngẫu nhiên cũng có thể được lấy từ một nguồn bên ngoài. Nhưng từ giai điệu của bài đăng của bạn, tôi không nghĩ rằng các nguồn ngẫu nhiên bên ngoài là những gì bạn quan tâm.

Hạt giống:

Không có sự bổ sung bên ngoài, mọi thứ máy tính làm đều mang tính quyết định. Điều này dẫn đến một vấn đề lớn: nếu bạn gọi một chương trình tạo số ngẫu nhiên, nó sẽ cho bạn kết quả tương tự mỗi lần nếu bạn đưa ra cùng một đầu vào. Rõ ràng, chúng ta cần một chương trình đưa ra một số ngẫu nhiên để thay đổi hành vi của nó mỗi khi nó chạy (nếu không chúng ta sẽ tiếp tục nhận được cùng một số "ngẫu nhiên", điều này không đặc biệt hữu ích). Một ý tưởng là cung cấp cho chương trình một số đầu vào, thay đổi mỗi khi chương trình được chạy, để một số khác sẽ được xuất ra. Chúng tôi gọi đầu vào này là "hạt giống." Trình tạo số ngẫu nhiên cần lấy một hạt giống, thực hiện một số thao tác và cung cấp cho chúng tôi một số ngẫu nhiên.

Thời gian hệ thống hiện tại là một ví dụ cổ điển của một hạt giống. Điều này mang lại một chuỗi dài với entropy cao và nếu thời gian được theo dõi theo kiểu đủ chi tiết (nghĩa là nếu đồng hồ hệ thống của bạn sử dụng giờ thì "thời gian" là một hạt giống khá kém), bạn không thể cung cấp số giả ngẫu nhiên máy phát điện cùng số hai lần.

Các thuật toán đủ ngẫu nhiên:

Bây giờ chúng ta có một thuật toán mà ít nhất có một số cách để khác nhau mỗi khi nó chạy. Chúng tôi cung cấp cho nó một hạt giống và trong khi thuật toán đưa ra cùng một số khi được nhắc với cùng một hạt giống, chúng tôi muốn các số mà nó tạo ra là ngẫu nhiên. Điều này hoạt động giống như ở trên - bạn nhận một số đầu vào và nó tạo ra một số (hy vọng đủ khác với đầu vào là đầu ra "ngẫu nhiên").

Bây giờ, giả sử bạn đã đưa ra thuật toán của riêng mình để thực hiện điều này và bạn cho rằng các số bạn đưa ra khá gần với ngẫu nhiên khi bạn đưa cho nó một loạt các hạt giống khác nhau. Làm thế nào chúng ta sẽ kiểm tra nó tốt như thế nào?

Bây giờ chúng tôi muốn một số thuật toán sẽ lấy một hạt giống, thực hiện một số thao tác và tạo ra một số ngẫu nhiên. Đơn giản nhất, thuật toán có thể chỉ xuất ra hạt giống - nó không cho chúng ta cùng một số mỗi lần và các hạt ngẫu nhiên cho chúng ta kết quả ngẫu nhiên. Nhưng rõ ràng đó không phải là những gì chúng ta muốn. Mặt khác, một thuật toán có thể khá phức tạp, giống như nhiều trình tạo giả ngẫu nhiên thực tế. Làm thế nào chúng ta có thể biết thuật toán nào cung cấp cho chúng ta số "ngẫu nhiên" từ các hạt không nhất thiết phải ngẫu nhiên của chúng ta? Nếu chúng ta không thể có được nó một cách chính xác, làm thế nào chúng ta có thể biết cái nào là tốt nhất?

1n

Đủ ngẫu nhiên để đánh lừa kẻ tấn công:

Bây giờ, những gì bạn có thể đề cập đến là Trình tạo Pseudorandom bảo mật bằng mật mã. Tôi nghĩ cách tốt nhất để giải thích điều này là trong bối cảnh ở trên - ở đây, chúng tôi đang sử dụng tính ngẫu nhiên của chúng tôi cho mật mã, vì vậy khi chúng tôi thiết kế thử nghiệm điều chúng tôi thực sự quan tâm là ai đó sẽ không thể phá vỡ bảo mật của chúng tôi bằng cách dự đoán số ngẫu nhiên chúng tôi đã chọn. Tôi không biết mức độ quen thuộc của bạn với mật mã, nhưng hãy tưởng tượng chúng ta đang thực hiện một cypher thay thế đơn giản --- mỗi chữ cái được thay thế bằng một số chữ cái khác. Chúng tôi muốn chọn những sự thay thế này một cách ngẫu nhiên, vì vậy chúng rất khó để kẻ tấn công đoán ra. Nhưng nếu anh ta có thể tìm ra cách trình tạo số ngẫu nhiên của tôi hoạt động, anh ta sẽ có thể giải được toàn bộ mật mã! Do đó, các thuật toán mật mã yêu cầu các trình tạo số ngẫu nhiên đặc biệt khó đoán.

Vì lý do này, các CSPRG được định nghĩa theo cách các thuật toán khác giải quyết chúng tốt như thế nào (đó là nơi cuối cùng chúng tôi đến câu hỏi của bạn). Cụ thể, giả sử tôi có CSPRG mà tôi sẽ gọi R. R là CSPRG nếu và chỉ khi KHÔNG có thuật toán khả thi nào có thể đoán được bit nào sẽ xuất ra tiếp theo. Điều này đúng ngay cả khi bạn biết tất cả các bit trước đó.

Vì vậy, giả sử rằng năm bit đầu tiên CSPRG của tôi có đầu ra là 10100. Bạn không biết đầu vào tôi đã sử dụng cho chương trình, nhưng bạn có quyền truy cập vào mã tôi đã sử dụng để viết CSPRG của mình. Sau đó, yêu cầu là bạn không thể viết chương trình để quyết định xem đầu ra bit tiếp theo sẽ là 101000 hay 101001.

Vì vậy, vì lý do của mật mã, đôi khi một trình tạo số giả ngẫu nhiên được xác định tốt như thế nào về khả năng dự đoán của nó đối với các chương trình khác. Lưu ý rằng điều này vẫn mang lại nhiều trực giác về "tính ngẫu nhiên", như (nói) nếu bạn biết tất cả các đầu ra ngẫu nhiên sẽ là số lẻ, nó không an toàn về mặt mật mã cũng như không vượt qua bài kiểm tra ngẫu nhiên thông thường.


7
Đây là một câu trả lời tốt (nhưng không đầy đủ) về tổng thể, nhưng một vài điểm sai. Sự ngẫu nhiên thật sự là không thể đối với máy tính, vì mọi thứ chúng làm đều mang tính quyết định. Không phải lúc nào cũng đúng, một số bộ xử lý bao gồm RNG phần cứng. Máy tính cũng có thể phản ứng với đầu vào bên ngoài có thể là ngẫu nhiên. Về cơ bản đối với tiền mã hóa, vì vậy chúng tôi không thực sự quan tâm đến mức độ "ngẫu nhiên" của chúng về mặt phân phối: thực ra đôi khi phân phối thống nhất rất quan trọng trong tiền điện tử, ví dụ IV cho CBC và tham số k trong DSA.
Gilles 'SO- ngừng trở nên xấu xa'

Ông đã viết "Không có sự bổ sung bên ngoài, mọi thứ máy tính làm đều mang tính quyết định". Bổ sung bên ngoài là một tham chiếu đến các thiết bị như RNG như bạn đề cập. Không có những bổ sung này, khả năng tính toán của chúng tôi tương đương với khả năng của TM mà không thể có sự ngẫu nhiên thực sự.
Kent Munthe Caspersen

Nếu tôi nhớ lại chính xác, tôi đã thêm nó sau bình luận của Gilles.
SamM

4

Gần đây tôi tìm thấy một bài viết hay về tính ngẫu nhiên trong tính toán trên blog của MIT CSAIL Theory of Computing Group: Bạn có thể biết nếu một chút là ngẫu nhiên không?

Bài đăng bắt đầu với một số ý tưởng được trích từ bài nói tuyệt vời của Avi Wigderson về sức mạnh và những hạn chế của tính ngẫu nhiên, khảo sát khu vực đẹp của các thuật toán ngẫu nhiên và mối liên hệ đáng ngạc nhiên giữa tính giả ngẫu nhiên và tính hấp dẫn tính toán .

Sau đó, nó tóm tắt một số kết quả gần đây về mật mã học lượng tử; đặc biệt là cách để kiểm tra hiệu quả nếu đầu ra của một loại thiết bị nào đó thực sự ngẫu nhiên (giao thức mở rộng ngẫu nhiên).

Ví dụ, xem công trình gần đây của Umesh Vazirani, Thomas Vidick, Dice Quantum Dice (Hoặc, mở rộng ngẫu nhiên theo cấp số nhân có thể kiểm chứng)

Tóm tắt: Chúng tôi giới thiệu một giao thức mà qua đó một cặp thiết bị cơ học lượng tử có thể được sử dụng để tạo ra n bit có tính ngẫu nhiên thực sự từ một hạt bit đồng nhất O (log n). Các bit được tạo ra ngẫu nhiên chỉ dựa trên một thử nghiệm thống kê đơn giản mà người dùng có thể thực hiện và dựa trên giả định rằng các thiết bị tuân theo nguyên tắc không có tín hiệu. Không có giả định nào khác được đặt vào hoạt động bên trong của thiết bị ....


3

Giả sử bạn đang nói về tính ngẫu nhiên thống kê - mật mã có những nhu cầu khác! - có một loạt các bài kiểm tra mức độ phù hợp có thể phát hiện xem một chuỗi các số có phù hợp với một phân phối nhất định hay không. Bạn có thể sử dụng những thứ này để kiểm tra xem trình tạo số ngẫu nhiên (giả) có âm thanh hay không (tùy theo chất lượng bài kiểm tra của bạn và tầm quan trọng đã chọn).

Bộ thử nghiệm Diehard kết hợp các phương pháp khác nhau.


0

Đây là một chủ đề rộng / phức tạp trong khoa học máy tính mà câu trả lời khác của SamM đề cập đến một số. Câu hỏi cụ thể của bạn dường như là về việc nếu máy tính có cái được gọi là PRNG , tức là bộ tạo số ngẫu nhiên giả, làm thế nào người ta có thể phát hiện ra điều đó?

Câu trả lời ngắn gọn là các PRNG không cần thiết được xây dựng sao cho thuật toán của chúng không thể được phát hiện (dẫn xuất). Nói chung, nếu PRNG là cái được gọi là "an toàn", ngay cả khi kẻ tấn công biết thuật toán được sử dụng để tạo chuỗi giả ngẫu nhiên, chúng không thể đoán các tham số cụ thể được sử dụng để tạo chuỗi. Theo cách này, tính giả tạo có nhiều mối quan hệ sâu sắc với mật mã, và người ta có thể nói về việc "phá vỡ" một PRNG theo cách tương tự như một thuật toán mã hóa có thể bị "phá vỡ". Có nhiều tài liệu nghiên cứu trong lĩnh vực này, đây là một lĩnh vực hoạt động đi đầu trong lĩnh vực mật mã.

Đối với các PRNG "tầm thường", ví dụ như một trình tạo đồng quy tuyến tính , nếu kẻ tấn công biết thuật toán được sử dụng để tạo ra nó và nó không được tạo bằng "bignums" , không gian tìm kiếm là "tương đối nhỏ" và về mặt lý thuyết kẻ tấn công cũng có thể tìm thấy các tham số được sử dụng bởi PRNG cụ thể về cơ bản bởi lực lượng vũ phu và thử tất cả các kết hợp.

PRNG có thể bị phá vỡ trong thực tế (một lần nữa tùy thuộc vào "bảo mật" của chúng) trong một số trường hợp bằng cách chạy một bộ lớn các thử nghiệm ngẫu nhiên thống kê chống lại chúng. ví dụ: đây là lý do của chương trình "Dieharder" (bởi Brown). Ngoài ra còn có một bộ NIST .

Khó khăn / độ cứng nội tại của việc phá vỡ PRNG chưa được chứng minh nghiêm ngặt về mặt lý thuyết nhưng về cơ bản có liên quan đến cái gọi là "cửa bẫy" hoặc "hàm một chiều" có thể được tính toán hiệu quả theo một hướng nhưng "khó" đảo ngược (đảo ngược) . Có một số vấn đề mở trong mật mã về độ cứng ngẫu nhiên. Những câu hỏi này liên quan chặt chẽ đến sự phân tách lớp phức tạp, ví dụ câu hỏi P =? NP nổi tiếng.

Các câu hỏi về phá vỡ PRNG cũng liên quan đến độ phức tạp Kolmogorov , một lĩnh vực nghiên cứu các Máy Turing nhỏ nhất có thể tạo ra các chuỗi. phá vỡ PRNG cũng liên quan chặt chẽ đến việc tìm ra chương trình "ngắn nhất" để tính toán chuỗi giả ngẫu nhiên. Và độ phức tạp Kolmogorov là không thể thiếu để tính toán nói chung.

Như Gilles chỉ ra trong một nhận xét, có tồn tại các RNG dựa trên phần cứng được xây dựng từ các quy trình điện tử vật lý như liên quan đến nhiễu lượng tử. những cái này nếu được thiết kế chính xác là không thể phá vỡ.


"PRNG không cần thiết được xây dựng sao cho thuật toán của chúng không thể được phát hiện (dẫn xuất)" - Tôi không nghĩ điều đó đúng. Trong thực tế, câu tiếp theo của bạn mâu thuẫn với nó. Bạn có muốn chỉnh sửa câu trả lời của bạn để khắc phục điều này?
DW

nó có thể được bổ sung chính xác hơn nhưng không tuân theo, sự phản đối cụ thể của bạn là gì? điểm quan trọng là thuật toán tạo ra chuỗi không thể chỉ được xác định từ riêng chuỗi dữ liệu, ngoại trừ bởi lực lượng vũ phu, nếu thuật toán được bảo mật và lực lượng vũ phu khó có thể thành công trong trường hợp đó.
vzn

1
Phản đối cụ thể của tôi là câu đó nghe có vẻ sai đối với tôi: có vẻ như bạn đang nói rằng PRNG được thiết kế để ai đó quan sát đầu ra của họ không thể suy ra thuật toán là gì, nhưng đó không phải là cách mọi thứ hoạt động trong cuộc sống thực. Hầu hết các PRNG không được xây dựng để ngăn người khác học thuật toán; thông thường, thuật toán là công khai. Có lẽ bạn có nghĩa là PRNG được xây dựng sao cho đầu ra của chúng không thể phân biệt được với các bit ngẫu nhiên thực?
DW

1
"Thuật toán tạo ra chuỗi không thể được xác định chỉ từ chuỗi dữ liệu, ngoại trừ bởi lực lượng vũ phu, nếu thuật toán được bảo mật" - Điều này cũng không đúng. Các thuật toán thường nào. Nó chỉ là hạt giống không công khai, và nó chỉ là hạt giống được cho là khó có được từ các đầu ra.
DW

-1

Trong thực tế, tất cả mọi thứ mà một máy tính cổ điển làm đều mang tính quyết định, theo nghĩa là khi bạn giao cho chúng một số nhiệm vụ, nó sẽ theo chúng theo một cách xác định. Do đó, nếu bạn muốn có một số ngẫu nhiên, bạn có thể tính nó theo thời gian (dựa trên thời gian nhập của người dùng), nhưng nếu bạn muốn có một bộ số ngẫu nhiên, bạn không thể sử dụng thời gian cho các số tiếp theo, bởi vì số sẽ không còn độc lập.

Những gì mọi người làm là sử dụng các trình tạo ngẫu nhiên giả có hạt, tức là một số được sử dụng để tính tất cả các số của trình tạo số giả ngẫu nhiên (trong một số trường hợp mô phỏng phức tạp hơn hoặc các tác vụ khác, có thể cần nhiều hạt hơn , nếu cần nhiều hơn một bộ số ngẫu nhiên độc lập). Hạt giống thường là 0 hoặc một số cụ thể nếu bạn muốn kết quả có thể lặp lại hoặc thời gian nếu bạn và các kết quả không thể đưa ra khác nhau.

Thực tế là các bộ tạo số giả ngẫu nhiên đủ tốt, nằm ở chỗ chúng tuân theo "các đặc tính cơ bản của việc tạo số giả ngẫu nhiên", để được tính toán hiệu quả và hoạt động như các số ngẫu nhiên thực:

  • các số được sản xuất phải tuân theo phân phối thống nhất (từ phân phối này, bạn có thể đạt được bất kỳ phân phối nào khác);
  • số lượng sản xuất phải độc lập thống kê;
  • trình tự có thể tái tạo (điểm này được áp đặt vì thuộc tính đó của phần cứng của máy tính cổ điển và đó là lý do tại sao chúng được gọi là "số giả ngẫu nhiên");
  • khoảng thời gian của chuỗi phải đủ lớn;
  • việc tạo số phải nhanh.

Từ mỗi số của dãy số giả ngẫu nhiên, một số mới được tính (thường chúng ta làm việc với các số nguyên). Tuy nhiên, có một khoảng thời gian, n, trong một chuỗi các bộ tạo số giả ngẫu nhiên được chuẩn bị để làm việc trong một cơ sở cụ thể với số bit hữu hạn để thể hiện các số (ví dụ: nhị phân). Nếu cái này không đủ lớn thì sẽ có vấn đề nghiêm trọng, nhưng đừng lo, các nhà khoa học máy tính chọn hạt giống và các thông số khác của máy phát ngẫu nhiên giả, để có một n tốt.

Ví dụ, một trình tạo số giả ngẫu nhiên có thể, với phương pháp đồng quy tuyến tính, là một trong những thuật toán tạo số giả ngẫu nhiên lâu đời nhất và được biết đến nhiều nhất có thể được định nghĩa theo:

nó có bốn giá trị:
- x_0 0
- a 0
- c ≥ 0
- m> x_0, trong đó:

x0 là giá trị ban đầu, a, c và m là các hằng số trong đó: m> a, m> c và nó tạo ra chuỗi với fornula:

x_ {i + 1} = (a * x_i + c) MOD m

Các giá trị cho các hằng số này phải được lựa chọn cẩn thận. Một khả năng là:

x_ {i + 1} = (1664525 * x_i + 1013904223) MOD 2 ^ 32, giới thiệu. [1-2]

Có các thuật toán khác tinh vi hơn để tạo ra các số ngẫu nhiên, giúp tránh một số vấn đề của các thuật toán trước đó, bao gồm: [3]

  • ngắn hơn thời gian dự kiến ​​đối với một số trạng thái hạt giống (trạng thái hạt giống như vậy có thể được gọi là 'yếu' trong bối cảnh này);
  • thiếu tính đồng nhất của phân phối cho số lượng lớn số lượng được tạo ra;
  • tương quan của các giá trị liên tiếp;
  • phân phối chiều kém của chuỗi đầu ra;
  • khoảng cách giữa nơi các giá trị nhất định xảy ra được phân phối khác với các giá trị trong phân phối chuỗi ngẫu nhiên.

Trong tương lai, các máy tính cổ điển có thể hợp nhất với các hệ lượng tử có thể cung cấp các số thực sự ngẫu nhiên và cung cấp chúng. [4]

tài liệu tham khảo:
[1] http://en.wikipedia.org/wiki/linear_congruential_generator
[2] William H., et al. (1992). "Công thức nấu ăn số trong fortran 77: Nghệ thuật tính toán khoa học" (tái bản lần 2). Sđt 0-521-43064-X.
[3] http://en.wikipedia.org/wiki/pseudorandom_number_generator
[4] http://www.totechreview.com/view/418445/first-evidence-that-quantum- Processes-generic-truly-merom-numbers /


Điều này không thực sự trả lời câu hỏi. Bạn giải thích cách tạo số ngẫu nhiên, không phát hiện xem RNG đã cho có ngẫu nhiên hay không. Ngay cả khi đó những lời giải thích của bạn vẫn còn thiếu một chút, các công cụ tuyến tính hầu như không phải là một trong những điều tốt nhất. RNG phần cứng tồn tại ngay bây giờ, không cần máy tính lượng tử; có một cơ hội tốt có bạn trong PC, một trong điện thoại và thậm chí một trong thẻ tín dụng của bạn.
Gilles 'SO- ngừng trở thành ác quỷ'
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.