Tất cả các thuật toán bạn đã đề cập (HKDF và SHA-256) là giả ngẫu nhiên. Nói chung, bất kỳ cách tiếp cận nào bạn sẽ sử dụng ở đây để mở rộng một số số thực sự ngẫu nhiên thành các chuỗi khác cũng là giả ngẫu nhiên. Đó là bởi vì các thuật toán này mang tính xác định: nếu bạn đặt cùng một dữ liệu (entropy), thì bạn sẽ nhận được kết quả tương tự.
Các số ngẫu nhiên thực sự đến từ một nguồn vật lý và không mang tính quyết định. Đó có thể là sự phân rã phóng xạ, nhiễu nhiệt, bộ tạo dao động tự do hoặc các loại nguồn khác. Bởi vì những thứ này không nhất thiết tạo ra số lượng 1 và 0 bằng nhau và lỗi không phải là không xác định, nên thường có một số loại lọc và xử lý, có thể là một thuật toán mã hóa như AES-CBC-MAC hoặc SHA-256 hoặc một số loại loại bỏ hoặc giảm sai lệch như khử sai lệch XORing hoặc Von Neumann hoặc cả hai.
Nếu bạn đã sử dụng TRNG và tạo ra các bit ngẫu nhiên, bạn có thể XOR chúng với nhiều bit hơn từ TRNG và nhận được cùng mức bảo mật, nhưng điều này thật ngớ ngẩn vì bạn đang sử dụng gấp đôi số bit từ TRNG mà không đạt được mức bảo mật nào. Tương tự, bạn có thể thực hiện phép cộng mô-đun trên các byte có hai giá trị TRNG, nhưng một lần nữa, điều này có cùng giới hạn. Bitwise AND thiên vị đầu ra, do đó, nó sẽ làm suy yếu tính bảo mật.
Vì bất kỳ thuật toán nào để mở rộng đầu ra của TRNG sẽ là giả ngẫu nhiên thay vì thực sự ngẫu nhiên, nên về cơ bản, những gì bạn đang đề xuất nghe giống như mật mã luồng với khóa chia sẻ trước dựa trên TRNG. Tuy nhiên, đó là hoàn toàn tốt như một thiết kế! Miễn là bạn chọn một mật mã dòng an toàn, thì đó là một thiết kế hợp pháp và an toàn. Tuy nhiên, mật mã dòng không phải là bộ đệm dùng một lần và không được chứng minh là an toàn, nhưng chúng thuận tiện hơn rất nhiều khi sử dụng trong cuộc sống thực.
Nếu bạn chọn thực hiện phương pháp này, tôi thực sự khuyên bạn nên chọn một thư viện hiện có, được thiết kế tốt để xây dựng phương pháp này. TLS có hỗ trợ cho các khóa chia sẻ trước và tất nhiên có những thư viện khác cũng có thể thực hiện việc này cho các tin nhắn.