Un punct cheie aici este că, în transformarea Fiat-Shamir, trebuie să faceți o distincție între ceea ce înseamnă securitatea în implementarea reală și ceea ce înseamnă aceasta în teoria designului dvs. Este adevărat că în practică folosim funcții hash pentru a implementa transformarea Fiat-Shamir, dar așa cum ați menționat, nu pare ușor să simulăm dovada în acest caz. În teorie, însă, folosim un obiect ideal numit „oracol aleatoriu” și în funcție de proprietățile pe care le asumăm pentru acest oracol aleatoriu, putem efectua simularea. Mai precis, un oracol aleatoriu poate fi fie programabil, fie neprogramabil. Prin programabilitate, înseamnă că simulatorului i se permite să aleagă răspunsurile la interogările oracol. În contextul dovezilor non-interactive zero-knowledge (NIZK), de exemplu, acest lucru face ca simulatorul să poată crea o dovadă convingătoare, dar falsă.Pe de altă parte, modelul oracol aleatoriu neprogramabil (NPRO) restricționează simulatorul astfel încât să nu mai poată alege răspunsurile pentru interogări. În schimb, simulatorul este împuternicit doar prin vizualizarea tuturor perechilor de interogare/răspuns, realizate de părți în timpul protocolului. Această restricție asupra simulatorului (sau, mai general, reducerea securității) face ca dovezile de bază să fie preferate, deoarece se bazează pe mai puține proprietăți ale oracolului aleatoriu și, prin urmare, pot fi considerate un pas către scăparea de el. Dar, în unele dovezi NIZK, cum ar fi transformarea Fiat-Shamir a protocolului lui Schnorr, programarea oracolului aleatoriu pare crucială pentru a oferi proprietatea ZK.