Tôi cần tạo dữ liệu ngẫu nhiên mã hóa an toàn trong C++ 11 và tôi lo rằng việc sử dụng random_device cho tất cả dữ liệu sẽ hạn chế hiệu suất nghiêm trọng (xem slide 23 của Stephan T. Lavavej "rand() Considered Harmful") thử nghiệm nó (trên hệ thống của mình), random_device là 1,93 MB/s và mt19937 là 499 MB/s) vì mã này sẽ chạy trên thiết bị di động (Android thông qua JNI và iOS) có thể chậm hơn so với các con số ở trên. Ngoài ra, tôi biết rằng mt19937 không an toàn về mặt mã hóa, từ wikipedia: "quan sát đủ số lần lặp (624 trong trường hợp của MT19937, vì đây là kích thước của vectơ trạng thái mà từ đó các lần lặp lại trong tương lai được tạo ra) cho phép người ta dự đoán tất cả các lần lặp lại trong tương lai ".Tôi có thể tạo dữ liệu ngẫu nhiên bảo mật mã hóa từ sự kết hợp của random_device và mt19937 với khả năng chèn lại không?
Lấy tất cả các thông tin trên vào tài khoản, tôi có thể tạo dữ liệu ngẫu nhiên mã hóa an toàn bằng cách tạo một hạt giống ngẫu nhiên mới từ random_device cứ 624 lần lặp lại mt19937 không? Hoặc (có thể) tốt hơn, mỗi lần lặp X mà X là một số ngẫu nhiên (từ random_device hoặc mt19937 seeded bởi random_device) giữa 1 và 624?
'random_device' thậm chí không bắt buộc phải không xác định, vì vậy tôi nghĩ đây không phải là ý tưởng hay. Nếu bạn thực sự cần dữ liệu không xác định, sử dụng bất cứ API mã hóa nào mà hệ điều hành cung cấp có lẽ là cách để đi. – Praetorian
@Praetorian Trên iOS, LLVM sử dụng/dev/urandom như là nguồn được bảo đảm an toàn về mặt mã hóa theo [this] (https://www.apple.com/br/ipad/business/docs/iOS_Security_Oct12.pdf) (Trang 7). Trên Android, gcc sử dụng/dev/random hoặc/dev/urandom như nguồn của nó, do đó tôi có thể chọn khởi tạo bằng "/ dev/random" được OpenSSl và những người khác sử dụng và đảm bảo (với khả năng tốt nhất của Android) rằng nó không xác định –
Nếu bạn biết một nguồn 'random_device' được ưu tiên phù hợp để sử dụng như một CSPRNG, thì rõ ràng đó là một lựa chọn phù hợp. Nhưng tôi vẫn sẽ cảnh giác với ý tưởng 'mt19937' của bạn. Một quy tắc đơn giản khi nói đến mật mã nên, trừ khi bạn là một chuyên gia trong lĩnh vực này, luôn luôn thích một giải pháp đã được chứng minh hiện có hơn là làm một cái gì đó có vẻ thông minh. Có một xác suất lớn hơn nhiều khi bạn vặn vẹo thứ gì đó hơn là đưa ra một ý tưởng thật sự mới lạ. Bạn đã thử nghiệm thông lượng ý tưởng của mình chưa? 'mt19937' có 19937 bit trạng thái, do đó việc tái nhập lại thường xuyên có thể không hoạt động tốt hơn' random_device' – Praetorian