Máy tính là cỗ máy được lập trình
Theo thiết kế, máy tính là những cỗ máy được định trước. Mọi thao tác chúng thực hiện đều tuân theo một bộ hướng dẫn cụ thể, dẫn đến kết quả có thể đoán trước và tái tạo được. Khả năng dự đoán được này là yếu tố cần thiết cho độ tin cậy và nhất quán trong quá trình hoạt động của máy tính, nhưng cũng là điều khiến máy tính khó đạt được sự ngẫu nhiên thực sự. Sự ngẫu nhiên thực sự khi nào không có quy luật hoặc không thể dự đoán, trong khi máy tính được cấu tạo để thực hiện các thuật toán logic và chính xác nên không có chỗ cho sự bất ngờ xuất hiện.
Các thuật toán mà máy tính sử dụng để tạo sự ngẫu nhiên được gọi là pseudo-random number generators – những trình tạo số giả ngẫu nhiên. Chúng hoạt động dựa trên các giá trị đầu vào ban đầu, còn gọi là các seed. Với cùng một seed, bộ tạo số giả ngẫu nhiên sẽ luôn tạo ra chuỗi số giống hệt nhau. Tất nhiên, đối với các tác vụ đòi hỏi sự bảo mật cao, như mật mã học, thì tỷ lệ có thể đoán được dù nhỏ cũng không thể chấp nhận. Tuy nhiên bộ tạo mã ngẫu nhiên giả, kết hợp seed với một số thông tin khác sẽ tạo ra các giá trị “đủ ngẫu nhiên” để đáp ứng tốt các nhu cầu hiện tại hàng ngày.
Tuy nhiên đối với những yêu cầu bảo mật cao hơn, những nguồn ngẫu nhiên này vẫn có thể không đủ ngẫu nhiên và đôi khi yêu cầu xử lý hậu kỳ để làm cho chúng ngẫu nhiên nhất có thể.
Tính toán sự ngẫu nhiên
Một trong những thuật toán đơn giản nhất để tạo sự ngẫu nhiên là Linear Congruential Generator (LCG). Công thức của LCG là sự kết hợp giữa hằng và một biến số seed khởi đầu: X(n+1) = aXn + c mod m. Trong đó, Xn là số hiện tại, a, c, và m là các hằng số, còn X0 là giá trị khởi đầu (seed). Nếu dùng cùng seed và hằng số, chuỗi số tạo ra sẽ giống nhau và lặp lại sau một thời gian. Vì tính chất này, LCG không phù hợp cho các ứng dụng bảo mật, nhưng lại rất hiệu quả trong các trò chơi điện tử.
Lấy ví dụ về trò chơi Pokemon. Các game Pokémon Stadium, Pokémon Colosseum và các phiên bản Gen III và IV đều sử dụng LCG 32-bit để tạo ra các sự kiện “ngẫu nhiên” như tỉ lệ bắt Pokémon hay sát thương chí mạng. Dù không thực sự ngẫu nhiên, kết quả vẫn đủ để tạo cảm giác bất ngờ cho người chơi. Từ thế hệ V, Pokemon chuyển sang dùng một thuật toán có khả năng tạo ra chuỗi số dài hơn và có tính ngẫu nhiên thống kê cao hơn là Mersenne Twister. Tuy nhiên, nó vẫn là giả ngẫu nhiên và không đủ an toàn cho các ứng dụng như mã hóa.
Để tăng thêm tính bảo mật cho các nhu cầu cao hơn, người ta sẽ đưa vào thêm một lớp nữa chính là các entropy đề cập bên trên. Entropy có thể đến từ các nguồn như chuyển động chuột, thời gian gõ phím hoặc các thiết bị phần cứng chuyên dụng thu noise điện tử. Entropy này sau đó được kết hợp với đầu ra của thuật toán để làm cho kết quả khó đoán trước hơn, đạt được cái gọi là “bộ tạo số ngẫu nhiên thực sự”. Tuy nhiên, sự ngẫu nhiên thực sự rất khó nắm bắt, ngay cả với các phương pháp dựa trên entropy vì chúng vẫn yêu cầu xử lý để đảm bảo chất lượng và tính nhất quán.
Nếu bạn đã từng tạo khóa RSA trên máy tính của mình bằng một chương trình như PuttyGen, nó có thể đã yêu cầu bạn di chuyển chuột xung quanh màn hình để tạo khóa. Đây chính là cách để tạo ra entropy để nó có thể sử dụng để tạo cặp khóa công khai và riêng tư một cách an toàn.
Trên đây chỉ là một thí dụ về cách mà người ta tìm cách tạo ra sự ngẫu nhiên trong máy tính. Nếu bạn thường xuyên chơi game, nhiều khả năng các sự kiện “ngẫu nhiên” mà bạn đối mặt không thực sự ngẫu nhiên, mà chỉ là ngẫu nhiên “có thể cảm nhận được”. Điều này đặt ra một thách thức cho các nhà phát triển cần đầu ra ngẫu nhiên và giải pháp là tạo ra các thuật toán khiến nó trông có vẻ ngẫu nhiên. Bạn có thể không nhận ra sự khác biệt, nhưng nếu bạn muốn thao túng một thứ gì đó “ngẫu nhiên” trên máy tính thì rất có thể, điều đó là khả thi.
Quảng cáo
Nguồn: Tinhte.vn