Tại sao chúng ta không kết hợp máy tạo số ngẫu nhiên?


60

Có nhiều ứng dụng sử dụng trình tạo số ngẫu nhiên giả. Vì vậy, mọi người thực hiện một thứ mà họ nghĩ là tuyệt vời chỉ để tìm thấy sau đó nó còn thiếu sót. Gần đây, điều này đã xảy ra với trình tạo số ngẫu nhiên Javascript. RandU sớm hơn nhiều. Cũng có những vấn đề về gieo hạt ban đầu không phù hợp cho một cái gì đó như Twister.

Tôi không thể tìm thấy ví dụ về bất kỳ ai kết hợp hai hoặc nhiều họ máy phát điện với toán tử xor thông thường. Nếu có đủ sức mạnh máy tính để chạy những thứ như java.SecureRandom hoặc Twister, tại sao mọi người không kết hợp chúng? ISAAC xor XORShift xor RandU phải là một ví dụ khá hay và nơi bạn có thể thấy điểm yếu của một trình tạo duy nhất đang được giảm nhẹ bởi những người khác. Nó cũng sẽ giúp phân phối số thành các chiều cao hơn vì các thuật toán nội tại hoàn toàn khác nhau. Có một số nguyên tắc cơ bản mà chúng không nên được kết hợp?

Nếu bạn xây dựng một trình tạo số ngẫu nhiên thực sự, mọi người có thể sẽ khuyên bạn nên kết hợp hai hoặc nhiều nguồn entropy. Là ví dụ của tôi khác nhau?

Tôi đang loại trừ ví dụ phổ biến của một số thanh ghi dịch chuyển phản hồi tuyến tính làm việc cùng nhau vì chúng cùng họ.


Câu trả lời có thể phụ thuộc vào ứng dụng. Bạn muốn sử dụng chuỗi giả ngẫu nhiên để làm gì?
Yuval Filmus

1
Bạn đã tìm thấy Fortuna ( en.wikipedia.org/wiki/Fortuna_%28PRNG%29 ) nghe có vẻ gần giống với những gì bạn mô tả rằng nó tổng hợp các nguồn ngẫu nhiên khác nhau thành một.
Mã nhỏ

1
@LittleCode Thật ra nó nghe có vẻ khác nhau. Fortuna xuất dữ liệu từ một hàm băm duy nhất. Nó chỉ gây rối với rất nhiều cơ chế thu thập entropy yếu trước khi (băm) nó mặc dù một hàm đầu ra duy nhất. Câu hỏi của tôi liên quan đến đầu ra từ một số chức năng (tại sao không phải là 10 trong số đó)? Nếu đây là một thiết bị điền, tốc độ không liên quan.
Paul Uszak

1
George Marsaglia, một nhà nghiên cứu nổi tiếng trong lĩnh vực PRNG đã phát minh ra nhiều loại PRNG mới như nhân đôi với mang và xor-shift, đã làm chính xác điều này khi ông đề xuất máy phát điện KISS vào những năm 1990, là sự kết hợp của ba PRNG thuộc loại khác nhau. Tôi đã sử dụng KISS thành công trong hai mươi năm qua, không phải cho mật mã, tất nhiên. Một nguồn thứ cấp hữu ích liên quan đến KISS là bài viết năm 2011 của Greg Rose, trong đó ông chỉ ra một vấn đề với một trong những PRNG cấu thành, không làm mất hiệu lực khái niệm kết hợp
njuffa

4
Knuth liên quan đến kết quả của việc kết hợp các trình tạo số giả ngẫu nhiên (sử dụng một số ngẫu nhiên để chọn trình tạo nào sẽ sử dụng) dẫn đến một hàm hội tụ đến một giá trị cố định! Vì vậy, trở lại những ngày trước cuộc cách mạng máy vi tính, ông cảnh báo chúng tôi không bao giờ trộn lẫn các máy phát ngẫu nhiên.
JDługosz

Câu trả lời:


7

IIRC (và đây là từ bộ nhớ), cuốn sách bán chạy nhất năm 1955 của Rand Một triệu chữ số ngẫu nhiên đã làm một cái gì đó như thế này. Trước khi máy tính rẻ, mọi người chọn số ngẫu nhiên trong cuốn sách này.

Các tác giả đã tạo ra các bit ngẫu nhiên với nhiễu điện tử, nhưng điều đó hóa ra là được xử lý (thật khó để tạo ra một flipflop dành thời gian chính xác bằng nhau cho lần lật và flop). Tuy nhiên, kết hợp các bit làm cho phân phối đồng đều hơn nhiều.


45

Chắc chắn, bạn có thể kết hợp PRNG như thế này, nếu bạn muốn, giả sử chúng được gieo hạt độc lập. Tuy nhiên, nó sẽ chậm hơn và có lẽ nó sẽ không giải quyết được những vấn đề cấp bách nhất mà mọi người gặp phải.

Trong thực tế, nếu bạn có yêu cầu về một PRNG chất lượng rất cao, bạn sử dụng một PRNG có sức mạnh mã hóa được kiểm duyệt tốt và bạn gieo nó với entropy thực sự. Nếu bạn làm điều này, chế độ thất bại rất có thể của bạn không phải là vấn đề với chính thuật toán PRNG; chế độ thất bại rất có thể là thiếu entropy đầy đủ (hoặc có thể lỗi thực thi). Xor-ing nhiều PRNG không giúp được với chế độ thất bại này. Vì vậy, nếu bạn muốn có một PRNG chất lượng rất cao, có lẽ có rất ít điểm trong việc xor-ing chúng.

Ngoài ra, nếu bạn muốn PRNG thống kê đủ tốt cho mục đích mô phỏng, thông thường, mối quan tâm số 1 là tốc độ (tạo số giả ngẫu nhiên rất nhanh) hoặc đơn giản (không muốn dành nhiều thời gian phát triển cho nghiên cứu hoặc triển khai nó). Xor-ing làm chậm PRNG và làm cho nó phức tạp hơn, do đó, nó cũng không giải quyết được các nhu cầu chính trong bối cảnh đó.

Miễn là bạn thể hiện sự chăm sóc và năng lực hợp lý, PRNG tiêu chuẩn là quá đủ tốt, vì vậy thực sự không có lý do gì chúng ta cần bất cứ thứ gì lạ hơn (không cần xor-ing). Nếu bạn không có mức độ chăm sóc hoặc năng lực tối thiểu, có lẽ bạn sẽ không chọn thứ gì đó phức tạp như xor-ing, và cách tốt nhất để cải thiện mọi thứ là tập trung vào sự chăm sóc và năng lực hơn trong việc lựa chọn PRNG thay vì trên xor-ing.

Điểm mấu chốt : Về cơ bản, thủ thuật xor không giải quyết được các vấn đề mà mọi người thường thực sự gặp phải khi sử dụng PRNG.


3
"thiếu entropy đầy đủ ... Xending nhiều PRNG không giúp ích gì cho việc này" - thực sự nó có thể cản trở, vì bạn tăng lượng entropy cần thiết để gieo mầm PRNG của bạn. Đó là lý do tại sao bạn không muốn tạo thói quen thường xuyên để kết hợp các PRNG được kiểm duyệt tốt, mặc dù nó thực sự bảo vệ bạn trước một trong những PRNG được kiểm duyệt tốt đó hóa ra là rác hoàn toàn (trong quá trình triển khai bạn đang sử dụng) .
Steve Jessop

Một lý do khác là các lỗi thực hiện là rất xa, rất xa, phổ biến hơn nhiều so với các vấn đề cơ bản với thuật toán, vì vậy càng đơn giản càng tốt. Một thuật toán tiêu chuẩn ít nhất có thể được kiểm tra đối với các giá trị tham chiếu hoặc triển khai khác, một xor tùy chỉnh không thể.
Gilles 'SO- ngừng trở nên xấu xa'

1
@DW Tại sao "gieo hạt độc lập?" Vì câu hỏi của tôi liên quan đến sự kết hợp của các họ máy phát điện khác nhau, mỗi gia đình nên tạo ra một chuỗi đầu ra duy nhất từ ​​các hạt giống hệt nhau. Ví dụ: java.SecureRandom và RC4 có thể dễ dàng được tạo từ cùng một khóa, sau đó kết hợp.
Paul Uszak

1
@DW Giả định lớn mà bạn nêu "sử dụng một PRNG sức mạnh mã hóa được kiểm duyệt tốt". Thực tế là điều này thực tế là không thể xác định được như với hầu hết các mật mã, băm và vân vân - những điểm yếu được tìm thấy theo thời gian. Họ đã được "xem xét kỹ lưỡng" về kiến ​​thức của ngày hôm qua hoặc năm qua.
Shiv

1
@PaulUszak, tôi không nghĩ rằng mình từng tranh cãi rằng xor-ing hai máy phát điện khiến nó dễ bị lỗi hơn. Tôi đang nói rằng, nếu bạn chọn một PRNG tốt (chỉ một), một trong những chế độ thất bại rất có thể là thất bại trong việc gieo hạt hoặc thất bại khi thực hiện và hai trình tạo xor-ing không giúp được gì cả. (Tất nhiên, nếu PRNG đơn lẻ không thành công, thì hai máy phát điện cũng không hữu ích.) Vì vậy, về cơ bản, nó đã giải quyết vấn đề sai. Nói cách khác, các trình tạo xor-ing không làm tăng sự chắc chắn nhiều, vì nó không giải quyết được các nguyên nhân quan trọng nhất của sự không chắc chắn.
DW

19

Trong thực tế, một cái gì đó của một bước đột phá vừa được công bố bằng cách làm chính xác điều này.

Giáo sư khoa học máy tính của Đại học Texas David Zuckerman và nghiên cứu sinh E Sơn Hayopadhyay nhận thấy rằng một số ngẫu nhiên "chất lượng cao" có thể được tạo ra bằng cách kết hợp hai nguồn ngẫu nhiên "chất lượng thấp".

Đây là bài viết của họ: Trình trích xuất hai nguồn rõ ràng và các chức năng phục hồi


8
Đây là một bài viết lý thuyết hoàn toàn về một chủ đề khác hoàn toàn không có liên quan thực tế, bất chấp những nỗ lực PR của UT.
Yuval Filmus

4
@Yuval Filmus - bạn có muốn mở rộng nhận xét đó không?
NietzscheanAI

8
Có một sự phân chia lớn giữa lý thuyết và thực hành. Thông thường các học viên không quan tâm đến lý thuyết và ngược lại. Trong trường hợp này, chi nhánh PR của UT đã quyết định chốt một bài viết lý thuyết xuất sắc, mô tả nó là thực tế có liên quan, nhưng điều đó không phải. Các vấn đề được xem xét trong bài báo không quá thú vị từ góc độ thực tế và có các giải pháp đơn giản hoạt động đủ tốt, mặc dù không thể chứng minh rằng chúng làm được.
Yuval Filmus

2
Hơn nữa, bài báo đặc biệt này chỉ là một tác phẩm trong lĩnh vực lý thuyết của máy chiết. Bạn có thể lập hóa đơn cho bất kỳ giấy tờ nào khác trong khu vực theo cách tương tự. Họ là tất cả về việc kết hợp các nguồn yếu để tạo ra một nguồn mạnh. Sự khác biệt chỉ là trong các tham số.
Yuval Filmus

3
Cuối cùng, việc xây dựng trong bài báo có lẽ là quá mức cần thiết, không phải là điều bạn muốn thực hiện. Các thông số cụ thể cho loại công trình này rất khó xác định và chúng thường cực kỳ xấu, vì các giấy tờ luôn tập trung vào chế độ tiệm cận và bỏ qua các hằng số.
Yuval Filmus

9

Giả sử rằng là một chuỗi nhị phân giả ngẫu nhiên. Nghĩa là, mỗi là một biến ngẫu nhiên được hỗ trợ trên và các biến không nhất thiết phải độc lập. Chúng ta có thể nghĩ về chuỗi này được tạo theo cách sau: đầu tiên chúng ta lấy mẫu khóa ngẫu nhiên đồng nhất , sau đó sử dụng một số hàm để tạo chuỗi giả ngẫu nhiên.X1,,XnXi{0,1}X1,,XnKf(K)

Làm cách nào để chúng tôi đo lường trình tự giả ngẫu nhiên tốt như thế nào ? Mặc dù có thể đo lường mức độ nhận biết cụ thể tốt như thế nào (giả sử sử dụng độ phức tạp Kolmogorov), ở đây tôi sẽ tập trung vào các biện pháp phụ thuộc vào toàn bộ phân phối của biến ngẫu nhiên . Một ví dụ như vậy là entropy, nhưng chúng tôi sẽ chỉ yêu cầu hai thuộc tính của thước đo : ( lớn hơn có nghĩa là một chuỗi ngẫu nhiên hơn)X1,,Xn(X1,,Xn)LL()

  • Nếu là một chuỗi xác định (nghĩa là một chuỗi cố định) thì . L ( X 1y 1 , ... , X ny n ) = L ( X 1 , ... , X n )y1,,ynL(X1y1,,Xnyn)=L(X1,,Xn)

  • Nếu là hai chuỗi giả ngẫu nhiên độc lập, là một bit ngẫu nhiên độc lập và , sau đó .X0,X1T{0,1}Z=XTL(Z)min(X0,X1)

Thuộc tính đầu tiên có nghĩa là số đo là bất biến khi lật bit thứ . Thuộc tính thứ hai có nghĩa là nếu chúng ta trộn hai phân phối , thì kết quả ít nhất cũng tốt như phân phối kém hơn.iX,Y

Bất kỳ biện pháp ngẫu nhiên hợp lý sẽ đáp ứng các tài sản đầu tiên. Thuộc tính thứ hai được thỏa mãn bởi hầu hết các biện pháp phổ biến như entropy và min-entropy .HH

Bây giờ chúng ta có thể nêu và chứng minh một định lý cho thấy rằng XORing hai chuỗi giả ngẫu nhiên luôn là một ý tưởng tốt.

Định lý. Đặt là hai chuỗi giả ngẫu nhiên độc lập có cùng độ dài và để là thước đo ngẫu nhiên có thể chấp nhận được (một đáp ứng hai điều kiện trên). Sau đóX,YL

L(XY)max(L(X),L(Y)).

Bằng chứng. Giả sử . Sau đó, là một hỗn hợp của các bản phân phối , trộn theo sự phân bố của . Vì và hỗn hợp ít nhất là tốt như phân phối tồi tệ nhất được trộn lẫn, chúng tôi thu được . L(X)L(Y)XYXyYL(Xy)=L(X)L(XY)L(X) 

Định lý này có nghĩa là nếu bạn XOR hai chuỗi giả ngẫu nhiên được tạo bằng hai khóa độc lập , kết quả luôn luôn tốt nhất là chuỗi XOR tốt hơn, đối với bất kỳ phép đo ngẫu nhiên nào được chấp nhận.

Trong thực tế, để sử dụng hai khóa độc lập, có lẽ chúng tôi mở rộng một khóa thành hai khóa theo kiểu giả ngẫu nhiên. Hai khóa sau đó không độc lập. Tuy nhiên, nếu chúng ta sử dụng một cách "đắt tiền" để mở rộng một khóa thành hai khóa, chúng tôi hy vọng hai khóa kết quả sẽ "trông" độc lập và do đó, định lý sẽ giữ "đạo đức". Trong mật mã lý thuyết, có nhiều cách để đưa ra tuyên bố này chính xác.


Sau đó, chúng ta có nên tạo XOR hai trình tạo số giả? Nếu chúng ta không bị hạn chế bởi tốc độ, thì đó chắc chắn là một ý tưởng tốt. Nhưng trong thực tế, chúng ta có một giới hạn tốc độ. Sau đó chúng ta có thể đặt câu hỏi sau đây. Giả sử rằng chúng ta được cung cấp hai PRNG, mỗi PRNG có tham số điều khiển thời gian chạy (và do đó cường độ) của máy phát. Ví dụ: có thể là chiều dài của LFSR hoặc số vòng. Giả sử chúng ta sử dụng một PRNG với tham số , kết quả còn lại với tham số và XOR kết quả. Chúng ta có thể giả sử rằng , do đó tổng thời gian chạy là không đổi. Sự lựa chọn tốt nhất củaTTT1T2T1+T2=tT1,T2? Ở đây có một sự đánh đổi rất khó trả lời. Có thể là cài đặt kém hơn nhiều so với hoặc .(t/2,t/2)(t,0)(0,t)

Lời khuyên tốt nhất ở đây là bám vào một PRNG phổ biến được coi là mạnh mẽ. Nếu bạn có thể dành nhiều thời gian hơn để tạo chuỗi của mình, XOR một số bản sao, sử dụng các khóa độc lập (hoặc các khóa được tạo bằng cách mở rộng một khóa bằng PRNG đắt tiền).


Bình luận không dành cho thảo luận mở rộng; cuộc trò chuyện này đã được chuyển sang trò chuyện . Khi bạn đi đến kết thúc mang tính xây dựng, vui lòng chỉnh sửa câu trả lời để kết hợp các kết quả thảo luận của bạn.
Raphael

4

Tôi sẽ cho điều này một lần, vì tôi đủ băn khoăn trước lời khuyên được đưa ra trong một số câu trả lời khác.

Đặt là các chuỗi bit vô hạn được tạo bởi hai RNG (không nhất thiết là các PRNG có tính xác định khi biết trạng thái ban đầu) và chúng tôi đang xem xét khả năng sử dụng chuỗi với hy vọng cải thiện hành vi theo một nghĩa nào đó. Có rất nhiều cách khác nhau trong đó có thể được coi là tốt hơn hoặc xấu hơn so với mỗi và ; Dưới đây là một số ít mà tôi tin là có ý nghĩa, hữu ích và phù hợp với cách sử dụng thông thường của các từ "tốt hơn" và "tệ hơn":X,YXYXYXY

  • (0) Xác suất ngẫu nhiên thực sự của chuỗi tăng hoặc giảm
  • (1) Xác suất không ngẫu nhiên có thể quan sát tăng hoặc giảm (đối với một số người quan sát áp dụng một số lượng xem xét nhất định, có lẽ)
  • (2) Mức độ nghiêm trọng / rõ ràng của sự không ngẫu nhiên có thể quan sát tăng hoặc giảm.

Trước tiên, hãy nghĩ về (0), đây là người duy nhất trong số ba người có hy vọng được làm chính xác. Lưu ý rằng, trên thực tế, một trong hai RNG đầu vào thực sự là ngẫu nhiên, không thiên vị và độc lập với nhau, thì kết quả XOR cũng sẽ thực sự ngẫu nhiên và không thiên vị. Với ý nghĩ đó, hãy xem xét trường hợp khi bạn tin rằng là các luồng bit bị cô lập không thiên vị thực sự ngẫu nhiên, nhưng bạn không hoàn toàn chắc chắn. Nếu là các xác suất tương ứng mà bạn đã sai về từng người trong số họ, thì xác suất không thực sự ngẫu nhiên là , trên thực tế ít hơn nhiều kể từ khiX,YεX,εYXYεXεY<min{εX,εY}εX,εY được giả định rất gần với 0 ("bạn tin rằng chúng là thực sự ngẫu nhiên"). Và trên thực tế, nó thậm chí còn tốt hơn thế, khi chúng ta cũng tính đến khả năng thực sự độc lập ngay cả khi không thực sự ngẫu nhiên: Do đó, chúng tôi có thể kết luận rằng theo nghĩa (0), XOR không thể làm tổn thương và có khả năng giúp ích rất nhiều.X,Y

Pr(XY not truly random)min{Pr(X not truly random),Pr(Y not truly random),Pr(X,Y dependent)}.

Tuy nhiên, (0) không thú vị đối với PRNG, vì trong trường hợp PRNG, không có trình tự nào trong câu hỏi có bất kỳ cơ hội nào thực sự ngẫu nhiên.

Do đó, đối với câu hỏi này, thực tế là về PRNG, chúng ta phải nói về một cái gì đó như (1) hoặc (2). Vì chúng thuộc về các tính chất và số lượng như "có thể quan sát được", "nghiêm trọng", "rõ ràng", "rõ ràng", giờ chúng ta đang nói về sự phức tạp của Kolmogorov, và tôi sẽ không cố gắng làm cho chính xác. Nhưng tôi sẽ đi xa hơn để đưa ra lời khẳng định không gây tranh cãi rằng, bằng một biện pháp như vậy, "01100110 ..." (period = 4) còn tệ hơn "01010101 ..." (period = 2) tệ hơn " 00000000 ... "(không đổi).

Bây giờ, người ta có thể đoán rằng (1) và (2) sẽ theo cùng một xu hướng như (0), và do đó kết luận "XOR không thể bị tổn thương" vẫn có thể giữ vững. Tuy nhiên, lưu ý khả năng quan trọng là cả và đều không ngẫu nhiên, nhưng mối tương quan giữa chúng khiến có thể quan sát được là không ngẫu nhiên. Tất nhiên, trường hợp nghiêm trọng nhất là khi (hoặc ), trong trường hợp này là hằng số, kết quả tồi tệ nhất trong tất cả các kết quả có thể xảy ra; nói chung, thật dễ dàng để thấy rằng, bất kể và tốt như thế nào ,XYXYX=YX=not(Y)XYXYXvà cần phải "gần gũi" với độc lập để xor của họ không thể quan sát được - không hợp lý. Trong thực tế, việc không phụ thuộc một cách hợp lý có thể được định nghĩa một cách hợp lý là là không quan sát được - không hợp lý.YXY

Sự phụ thuộc bất ngờ như vậy hóa ra là một vấn đề thực sự lớn.


Một ví dụ về những gì sai

Câu hỏi nêu rõ "Tôi đang loại trừ ví dụ phổ biến của một số thanh ghi dịch chuyển phản hồi tuyến tính làm việc cùng nhau vì chúng cùng họ". Nhưng tôi sẽ loại trừ sự loại trừ đó vào lúc này, để đưa ra một ví dụ thực tế rõ ràng rất đơn giản về loại điều có thể sai với XORing.

Ví dụ của tôi sẽ là một triển khai cũ của rand () trên một số phiên bản của Unix vào khoảng năm 1983. IIRC, việc triển khai hàm rand () này có các thuộc tính sau:

  • giá trị của mỗi lệnh gọi rand () là 15 bit giả ngẫu nhiên, nghĩa là một số nguyên trong phạm vi [0, 32767).
  • các giá trị trả về liên tiếp xen kẽ - lẻ - chẵn - lẻ; nghĩa là, bit có ý nghĩa nhất xen kẽ 0-1-0-1 ...
  • bit tiếp theo ít quan trọng nhất có chu kỳ 4, bit tiếp theo sau đó có chu kỳ 8, ... vì vậy bit thứ tự cao nhất có chu kỳ .215
  • do đó, chuỗi các giá trị trả về 15 bit của rand () là định kỳ với chu kỳ .215

Tôi đã không thể xác định được mã nguồn ban đầu, nhưng tôi đoán từ việc ghép một vài bài đăng từ trong https://groups.google.com/forum/#!topic/comp.os.vms/9k4W6KrRV3A rằng nó đã làm chính xác như sau (mã C), đồng ý với bộ nhớ của tôi về các thuộc tính ở trên:

#define RAND_MAX 32767
static unsigned int next = 1;
int rand(void)
{
    next = next * 1103515245 + 12345;
    return (next & RAND_MAX);
}
void srand(seed)
unsigned int seed;
{
    next = seed;
}

Như người ta có thể tưởng tượng, cố gắng sử dụng rand () này theo nhiều cách khác nhau đã dẫn đến một loại thất vọng.

Ví dụ, tại một thời điểm, tôi đã thử mô phỏng một chuỗi các đồng xu ngẫu nhiên lật bằng cách liên tục lấy:

rand() & 1

tức là bit ít quan trọng nhất Kết quả là những cái đầu-đuôi-đầu-đuôi-đuôi đơn giản. Điều đó thật khó tin lúc đầu (phải là một lỗi trong chương trình của tôi!), Nhưng sau khi tôi tự thuyết phục bản thân mình đó là sự thật, tôi đã thử sử dụng bit ít quan trọng nhất tiếp theo để thay thế. Điều đó không tốt hơn nhiều, như đã lưu ý trước đó - bit đó là định kỳ với giai đoạn 4. Tiếp tục khám phá các bit cao hơn liên tiếp đã tiết lộ mô hình mà tôi đã lưu ý trước đó: nghĩa là, mỗi bit bậc cao tiếp theo có gấp đôi khoảng thời gian trước đó, vì vậy trong sự tôn trọng bit thứ tự cao nhất này là hữu ích nhất trong số chúng. Tuy nhiên, xin lưu ý rằng không có ngưỡng đen trắng "bit là hữu ích, bit không hữu ích" ở đây; tất cả những gì chúng ta thực sự có thể nói là các vị trí bit được đánh số có mức độ hữu dụng / vô dụng khác nhau.ii1

Tôi cũng đã thử những thứ như xáo trộn kết quả hơn nữa hoặc XOR các giá trị cùng nhau được trả về từ nhiều lệnh gọi đến rand (). XORing các cặp giá trị rand () liên tiếp là một thảm họa, tất nhiên - nó dẫn đến tất cả các số lẻ! Đối với mục đích của tôi (cụ thể là tạo ra một chuỗi các đồng xu "rõ ràng ngẫu nhiên"), kết quả tương đương không đổi của XOR thậm chí còn tồi tệ hơn so với hành vi chẵn lẻ xen kẽ của bản gốc.

Một biến thể nhỏ đặt điều này vào khung ban đầu: đó là, hãy để là chuỗi các giá trị 15 bit được trả về bởi rand () với một hạt giống đã cho và chuỗi từ một hạt giống khác . Một lần nữa, sẽ là một chuỗi gồm các số chẵn hoặc toàn số lẻ, tệ hơn so với hành vi chẵn / lẻ xen kẽ ban đầu.XsXYsYXY

Nói cách khác, đây là một ví dụ trong đó XOR làm mọi thứ tồi tệ hơn theo nghĩa (1) và (2), bằng bất kỳ cách giải thích hợp lý nào. Nó cũng tệ hơn theo nhiều cách khác:

  • (3) Rõ ràng là bit có ý nghĩa nhất XOR bị sai lệch, nghĩa là có tần số không bằng nhau là 0 và 1, không giống như bất kỳ vị trí bit được đánh số nào trong cả hai đầu vào đều không thiên vị.
  • (4) Trên thực tế, đối với mọi vị trí bit, có các cặp hạt mà vị trí bit đó bị sai lệch trong kết quả XOR và đối với mỗi cặp hạt giống, có (ít nhất 5) vị trí bit bị sai lệch trong XOR kết quả.
  • (5) Khoảng thời gian của toàn bộ chuỗi giá trị 15 bit trong kết quả XOR là 1 hoặc , so với cho bản gốc.214215

Không ai trong số (3), (4), (5) là rõ ràng, nhưng tất cả chúng đều dễ dàng kiểm chứng.


Cuối cùng, hãy xem xét giới thiệu lại việc cấm PRNG từ cùng một gia đình. Vấn đề ở đây, tôi nghĩ, là không bao giờ thực sự rõ ràng liệu hai PRNG có "cùng một gia đình" hay không, cho đến khi / trừ khi ai đó bắt đầu sử dụng XOR và thông báo (hoặc thông báo kẻ tấn công) mọi thứ trở nên tồi tệ hơn theo nghĩa (1) và (2), tức là cho đến khi các mẫu không ngẫu nhiên trong đầu ra vượt qua ngưỡng từ không chú ý đến chú ý / lúng túng / thảm họa, và tại thời điểm đó thì đã quá muộn.

Tôi hoảng hốt trước những câu trả lời khác ở đây đưa ra lời khuyên không đủ tiêu chuẩn "XOR không thể làm tổn thương" trên cơ sở các biện pháp lý thuyết mà tôi thấy là làm một công việc kém về mô hình hóa mà hầu hết mọi người cho là "tốt" và "xấu" PRNG trong cuộc sống thực. Lời khuyên đó bị mâu thuẫn bởi các ví dụ rõ ràng và trắng trợn trong đó XOR làm cho mọi thứ tồi tệ hơn, ví dụ như rand () được đưa ra ở trên. Mặc dù có thể hình dung rằng các PRNG tương đối "mạnh" có thể liên tục hiển thị hành vi ngược lại khi XOR với PRNG đồ chơi đó là rand (), do đó làm cho XOR trở thành một ý tưởng tốt cho chúng, tôi đã không thấy bằng chứng nào về hướng đó, theo lý thuyết hoặc theo kinh nghiệm, nên có vẻ không hợp lý với tôi khi cho rằng điều đó xảy ra.

Cá nhân, tôi đã bị cắn bởi sự bất ngờ của XORing rand () khi còn trẻ và vô số mối tương quan bất ngờ khác trong suốt cuộc đời tôi, tôi không có nhiều lý do để nghĩ rằng kết quả sẽ khác nếu tôi thử lại chiến thuật tương tự. Đó là lý do tại sao tôi, cá nhân, sẽ rất miễn cưỡng XOR cùng với nhiều PRNG trừ khi phân tích và kiểm tra rất sâu rộng đã được thực hiện để cho tôi một sự tin tưởng rằng có thể an toàn khi làm như vậy đối với các RNG cụ thể được đề cập. Là một phương pháp chữa bệnh tiềm năng khi tôi có niềm tin thấp vào một hoặc nhiều PRNG riêng lẻ, XOR chúng không có khả năng làm tăng sự tự tin của tôi, vì vậy tôi không thể sử dụng nó cho mục đích như vậy. Tôi tưởng tượng câu trả lời cho câu hỏi của bạn là đây là một tình cảm được tổ chức rộng rãi.


Vậy làm thế nào để bạn giải thích việc sử dụng A5 / 1 theo nghĩa đen của hàng tỷ người?
Paul Uszak

@PaulUszak Mình không có ý kiến. Có phải A5 / 1 đang được sử dụng bởi hàng tỷ người mâu thuẫn với những gì tôi đã nói?
Don nở

Đó là ba prngs (thực tế là từ cùng một gia đình) đã kết hợp với nhau để tạo thành một thứ tốt hơn theo cách làm phiền và báo động cho bạn ...
Paul Uszak

Điều tôi băn khoăn và hoảng hốt là lời khuyên không đủ tiêu chuẩn "nếu bạn không chắc chắn, hãy tiếp tục và XOR cùng với một loạt các RNG; nó không thể làm mọi thứ tồi tệ hơn". Tôi không có ý nói hay ngụ ý rằng XOR là xấu trong mọi trường hợp và tôi không có ý kiến ​​gì về A5 / 1 hoặc việc sử dụng XOR trong đó. Nó có giúp ích gì không nếu tôi thay đổi tuyên bố tóm tắt ngớ ngẩn cuối cùng của mình để làm cho điều này rõ ràng hơn?
Don nở

1
Tôi đã thay thế đơn giản "chỉ nói không với XORing RNG" ở cuối bằng một cái gì đó thực tế hơn và hy vọng ít gây hiểu lầm hơn.
Don nở

0

TUYÊN BỐ TỪ CHỐI: Câu trả lời này hoàn toàn đúng về "Chúng tôi không làm việc đó" và không phải "đây là bằng chứng toán học tại sao nó có thể hoặc không thể hoạt động". Tôi không cho rằng XOR giới thiệu (hoặc không) bất kỳ lỗ hổng mã hóa nào. Quan điểm của tôi chỉ là kinh nghiệm cho chúng ta thấy rằng ngay cả những kế hoạch đơn giản nhất hầu như luôn đưa ra những hậu quả không lường trước được - và đây là lý do tại sao chúng ta tránh chúng.

"Tính ngẫu nhiên" chỉ là một phần nổi của tảng băng trôi khi nói đến RNG và PRNG. Có những phẩm chất khác rất quan trọng, ví dụ như tính đồng nhất.

Hãy tưởng tượng một con xúc xắc phổ biến có RNG khá tốt. Nhưng bây giờ hãy nói rằng bạn cần một phạm vi 1-5 thay vì 1-6. Điều đầu tiên bạn nghĩ đến là chỉ cần xóa 6 mặt và thay thế nó bằng thêm 1. "Tính ngẫu nhiên" vẫn còn (kết quả vẫn thực sự ngẫu nhiên), tuy nhiên tính đồng nhất bị ảnh hưởng rất lớn: hiện tại 1 có khả năng gấp đôi so với các kết quả khác.

Kết hợp các kết quả từ nhiều RNG là một độ dốc trơn trượt tương tự. Ví dụ. đơn giản thêm 2 viên xúc xắc sẽ xóa sạch hoàn toàn tính đồng nhất, vì "7" hiện có khả năng gấp 6 lần so với "2" hoặc "12". Tôi đồng ý rằng XOR trông tốt hơn so với cái nhìn đầu tiên, nhưng trong PRNGs không có gì bật ra như cái nhìn đầu tiên.

Đây là lý do tại sao chúng ta có xu hướng gắn bó với các triển khai đã biết - bởi vì ai đó đã dành vô số thời gian và tiền bạc để nghiên cứu chúng và tất cả các thiếu sót đều được biết đến, hiểu và có thể được giải quyết. Khi bạn tự tung ra, bạn có khả năng tạo ra các lỗ hổng và bạn nên nỗ lực tương tự để chứng minh điều đó. Như ví dụ bổ sung xúc xắc cho thấy, việc kết hợp có thể không khác nhiều so với việc tạo một cái mới từ đầu.

Bảo mật là một chuỗi, mạnh như thành phần yếu nhất của nó. Một nguyên tắc nhỏ trong bảo mật: bất cứ khi nào bạn kết hợp 2 thứ, bạn thường nhận được một khoản tiền, không phải là tổng số điểm mạnh.


7
Mạnh mẽ phủ quyết. Nếu bạn XOR một chuỗi thực sự ngẫu nhiên với một chuỗi tùy ý, bạn vẫn nhận được một chuỗi thực sự ngẫu nhiên. Tương tự, nếu bạn XOR hai chuỗi giả ngẫu nhiên độc lập (nghĩa là được tạo bằng các khóa khác nhau), bạn sẽ nhận được thứ gì đó mạnh nhất ít nhất là từng chuỗi riêng lẻ.
Yuval Filmus

3
Điều này có vẻ sai với tôi. Trường hợp thông thường ở đây là tôi nghĩ rằng tôi có hai RNG chất lượng rất cao tạo ra các bit thực sự ngẫu nhiên, nhưng có một cơ hội rất nhỏ mà tôi có thể (có lẽ là rất nhầm) về một (hoặc rất ít khả năng cả hai). Nếu tôi xor chúng cùng nhau, miễn là tôi đúng về ít nhất một trong số chúng, kết quả sẽ thực sự ngẫu nhiên, và tôi tốt. Vì vậy, bằng cách kết hợp chúng, tôi đã giảm cơ hội có RNG xấu từ khoảng epsilon / 2 xuống còn epsilon cực nhỏ ^ 2, đây chắc chắn là một chiến thắng. Tôi nghi ngờ động lực tương tự giữ ngay cả trong các trường hợp ít cắt và thử.
Don nở

2
Tôi vẫn chưa bị thuyết phục. Khi tôi viết "thực sự ngẫu nhiên" tôi có nghĩa là "ngẫu nhiên thống nhất". Nếu bạn XOR một chuỗi ngẫu nhiên thống nhất với một chuỗi tùy ý, bạn sẽ có được một chuỗi ngẫu nhiên thống nhất.
Yuval Filmus

2
@DonHatch Chắc chắn, điều đó sẽ đủ điều kiện. Giả sử PRNG của bạn tạo ra một chuỗi có độ dài 100, sau đó là phiên bản ồn ào của cùng một chuỗi, v.v. Giả sử tương quan bitwise của bản sao thứ hai với bản đầu tiên là . Chuỗi XORed thỏa mãn . Vì, thật công bằng khi nói rằng các mối tương quan đã không được "phóng đại", mà giảm đi rất nhiều. Pr[Xi+100=Xi]=(1+ϵ)/2Zi=XiYiPr[Zi+100=Zi]=(1+ϵ2)/2ϵ2|ϵ|
Yuval Filmus

3
@YuvalFilmus Có lẽ bạn đúng rằng mối tương quan giữa mục i và mục i + 100 đã giảm đáng kể, nhưng đó không phải là vấn đề. Đối với một ví dụ rất cụ thể và thực tế: Tôi nhớ cách triển khai cũ rích () trên unix có hành vi định kỳ trong bit thứ tự thấp nhất của mỗi số nguyên 31 bit được trả về, mà hầu hết mọi người không nhận thấy. Xor chuỗi trình tự int với bản sao đã thay đổi của chính nó (đó là những gì bạn nhận được khi bạn sử dụng một hạt giống khác) có kích thước thay đổi đáng tiếc, bạn sẽ nhận được tất cả các số chẵn. Đó là nhiều tồi tệ hơn vấn đề trong chuỗi ban đầu, đối với hầu hết các mục đích.
Don nở
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.