Puncte:2

Cum construiesc familia de funcții Fn a WOTS+ folosind SHA3?

drapel ca

De la WOTS+ hârtie:

În plus, W-OTS+ utilizează o familie de funcții Fn : {f_k : {0, 1}^n â {0, 1}^n | k â Kn} cu spațiul tastelor Kn. Cititorul s-ar putea gândi la aceasta ca la o familie de funcții hash criptografice care nu se comprimă. Folosind Fn definim următoarea funcție de înlănțuire.

Nu înțeleg sensul acestui paragraf. Interpretarea mea este că am nevoie de o familie de n funcții pseudoaleatoare pe n biți, unde n este parametrul de securitate. Adică dacă parametrul de securitate este 128, atunci am nevoie de 128 de funcții pseudo-aleatorie diferite pe 128 de biți. Dacă această înțelegere este corectă și presupunând n=128, pot defini F(k) ca doar pe sha3 (care rezistă atacurilor de extensie de lungime) de k atașat la mesaj, apoi tăiat la 128 de biți? Adică ceva de genul:

// Generează cea de-a k-a funcție pseudo-aleatorie, cu n=128
fn kth_random_function(k: uint8) -> (octeți -> uint128):
  return λ(msg: bytes) => uint128(sha3(u8_to_byte(k) ++ msg)[0:16])
Maarten Bodewes avatar
drapel in
Binarul nu este hexazecimal; cu siguranță nu ar trebui să codificați `k` înainte de a-l folosi (și, de obicei, nici după aceea, dacă binarul este permis). În plus, dacă veți folosi un hash cu cheie, ați putea la fel de bine să utilizați KMAC. Rețineți că KMAC oferă o opțiune pentru a seta dimensiunea de ieșire cu ieșirea pe 128 și 256 de biți fiind opțiuni standardizate.
drapel ca
@MaartenBodewes Asta a fost doar pentru simplitate, presupunând că sha3 operează pe hex. Am editat pentru a îmbunătăți pseudocodul. KMAC cu ieșire pe 128 de biți nu este exact ceea ce am descris? Adică, luând primii 128 de biți din „SHA3(k || m)”?
Maarten Bodewes avatar
drapel in
Este aproape literalmente puțin diferit. Dar, în general, aș folosi algoritmii pentru care ar trebui să funcționeze. Să presupunem că aveți această funcție în hardware: în acest caz, SHA-3 ar putea să nu accepte un obiect cheie, în timp ce KMAC ar accepta.
drapel ca
Are sens, mulțumesc.
Maarten Bodewes avatar
drapel in
KMAC: 1. newX = bytepad(encode_string(K), 168) || X || cod_dreapta(L). 2. returnați cSHAKE128(newX, L, âKMACâ, S). Deci da, nu chiar SHA-3, dar foarte asemănător dacă te uiți la construcția reală a buretelui. S este de obicei gol, dar există o codificare suplimentară a mărimii de ieșire L inclusă și un indicator „KMAC”. Nu cunosc suficient de bine W-OTS ca să răspund de altfel, mi-e teamă că trec cu vederea vreo cerință w.r.t. partea de necompresiune.
Puncte:1
drapel in

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.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.