De fapt, aveți nevoie de o familie de funcții unidirecționale rezistente la a doua preimagine, nedetectabile. În general, orice funcție hash criptografică sigură (SHA2, SHA3, ...) ar trebui să funcționeze cu o mică modificare pentru a face cheia. Nu aveți nevoie ca acesta să fie un PRF, iar funcția este de lungime fixă. Prin urmare, dacă fixați și lungimea cheii, folosind
SHA3(K || M)
este bine (și apoi luați cantitatea de biți de ieșire necesară). Pentru SHA2 (sau orice construcție Merkle-Damgard) obțineți un argument de securitate mai frumos, dacă absorbiți mai întâi cheia într-un apel de funcție de compresie și apoi mesajul. Adică ai
SHA2-256( pad(K, 512) || M ),
unde pad(K, 512) aplică o umplutură injectivă pentru a transforma K într-un șir de 512 biți. Presupunând că lungimea fixă pentru K, adăugarea suficient de multe 0 funcționează bine. Aici am ținut cont de faptul că lungimea blocului SHA2-256 este de 512 biți. Pentru diferite lungimi de bloc, trebuie să ajustați lungimea în consecință. Din cauza întăririi Merkle-Damgard (care necesită aplicarea umpluturii de lungime), acest lucru nu crește numărul de apeluri la funcția de compresie. În același timp, vă puteți gândi la acest lucru ca la prima calculare a unui IV pseudoaleatoriu din K, care este apoi folosit pentru hash M.