Điểm mấu chốt ở đây là trong quá trình chuyển đổi Fiat-Shamir, bạn cần phân biệt giữa ý nghĩa bảo mật trong triển khai thực tế và ý nghĩa của nó trong lý thuyết thiết kế của bạn. Đúng là trong thực tế, chúng tôi sử dụng các hàm băm để thực hiện chuyển đổi Fiat-Shamir, nhưng như bạn đã đề cập, có vẻ như không dễ dàng để mô phỏng bằng chứng trong trường hợp này. Tuy nhiên, về lý thuyết, chúng tôi sử dụng một đối tượng lý tưởng được gọi là "nhà tiên tri ngẫu nhiên" và tùy thuộc vào thuộc tính mà chúng tôi giả định cho nhà tiên tri ngẫu nhiên này, chúng tôi có thể thực hiện mô phỏng. Chính xác hơn, một tiên tri ngẫu nhiên có thể lập trình được hoặc không lập trình được. Theo khả năng lập trình, điều đó có nghĩa là trình mô phỏng được phép chọn câu trả lời cho các truy vấn tiên tri. Ví dụ, trong bối cảnh bằng chứng không có kiến thức (NIZK) không tương tác, điều này làm cho trình giả lập có thể tạo ra bằng chứng thuyết phục nhưng giả mạo.Mặt khác, mô hình tiên tri ngẫu nhiên không thể lập trình (NPRO) hạn chế trình mô phỏng sao cho nó không thể chọn câu trả lời cho các truy vấn nữa. Thay vào đó, trình mô phỏng chỉ được trao quyền bằng cách xem tất cả các cặp truy vấn/câu trả lời do các bên thực hiện trong giao thức. Hạn chế này đối với trình mô phỏng (hay nói chung là giảm tính bảo mật) làm cho các bằng chứng cơ bản trở nên thích hợp hơn, vì chúng dựa vào ít thuộc tính hơn của lời tiên tri ngẫu nhiên và do đó có thể được coi là một bước để loại bỏ nó. Tuy nhiên, trong một số bằng chứng của NIZK, chẳng hạn như chuyển đổi Fiat-Shamir của giao thức Schnorr, việc lập trình tiên tri ngẫu nhiên dường như rất quan trọng để cung cấp thuộc tính ZK.