Puncte:1

Există modalități on-line de a folosi un cifru bloc pentru a genera $n$ biți unici care garantează lipsa de coliziune de $2^n$ ori?

drapel in

$n$ este o variabilă de rulare aleasă de fiecare dată când utilizatorul rulează implementarea.

Un mod în care mă pot gândi este să folosesc orice cifru bloc, să zicem AES, ca un CSPRNG seminat pentru a amesteca aleatoriu lista de numere $0, 1, \ldots, 2^n-1$. În acest fel garantez lipsa de coliziune până la $2^n$ numere. Dar această abordare este prea costisitoare, deoarece va necesita să schimb $2^n$ numere.

Un alt mod la care mă gândesc este să folosesc cifrul bloc pentru a genera text cifrat $c = \mathrm{enc}(\mathrm{0x000}\ldots, \mathrm{key})$, Unde $\mathrm{len}(c) \ge n$. Apoi ia-l pe primul $n$ multe bucăți de $c$; hai să-i spunem $c_n$. Atunci fa: $c_n \oplus 0, c_n \oplus 1, \ldots, c_n \oplus 2^n-1$. Acest lucru este eficient, dar problema este că, cred, succesiunea nu este aleatorie. De exemplu. $c_n \oplus 0$ va fi în general mai aproape de $c_n \oplus 1$ decât, să zicem, $c_n \oplus 100$.

Intrebarea: Este vreo abordare mai rapidă, în care pot folosi orice cifru bloc pentru aproximativ o singură dată, pentru a genera următorul număr, astfel încât, pe măsură ce repet procesul, primesc $2^n$ multe numere unice fără ciocniri?

Într-un fel, cred că o pot numi: o versiune online a amestecării numerelor $0, 1, \ldots, 2^n-1$, fără a fi nevoie să menținem o listă în memorie, adică $2^n$ lung.

În mod ideal, dacă se găsește shuffle-ul online perfect, acesta trebuie să aibă această distribuție (unde $i$ este orice număr în $\{0, 1, \ldots, 2^n-1\}$ și $N_j$ este o variabilă aleatorie care va lua valoarea unui număr din acel set din $j^{th}$ apelul shuffler-ului ideal online):

$$\begin{split} \Pr(N_0 = i) &= 1/2^n \ \Pr(N_1 = i) &= 1/(2^n - 1) \ \Pr(N_2 = i) &= 1/(2^n - 2) \ \vdots & \ \Pr(N_{2^n-1} = i) &= 1/(2^n - (2^n-1)) = 1\ \end{divizat}$$

fgrieu avatar
drapel ng
Există o cerință care nu este satisfăcută de metoda clasică: criptarea unui număr de $n$-biți cu un cifru bloc de $n$-biți? Dacă da, vă rugăm să precizați.
caveman avatar
drapel in
@fgrieu - Nu sunt sigur (presupun că este doar ignoranță). $n$ în cazul meu este variabil (definit în timpul rulării de către utilizator). Nu m-am gândit la asta. Este ChaCha20 unul dintre astfel de algoritmi, unde pot specifica dimensiunea blocurilor arbitrare în timpul rulării și să aibă efectul de mai sus?
Maarten Bodewes avatar
drapel in
Da, cred că fluxul de chei generat de modul contor s-ar potrivi perfect cu această problemă. Dacă aveți doar criptare, atunci aceasta este definită de criptarea în modul CTR a blocurilor cu zero.
caveman avatar
drapel in
@MaartenBodewes - Interesant. Deoarece ChaCha20 are în interior blocuri de 512 octeți (cel puțin cât de implementat de obicei, de ex.`libsodium`'s), este posibilă optimizarea implementării pentru $n
fgrieu avatar
drapel ng
Ah, deci cerința lipsă este $n$ variabilă în timpul execuției, ceea ce obligă să utilizați tehnici de criptare cu rezervare de format. Vă rugăm să adăugați că în întrebare, un interval pentru $n$ ($n$ prea mare nu are sens, deoarece coliziunile între valorile independente aleatoare uniform de $n\ge256$ bit nu sunt oricum observabile); și poate orice limită ar putea exista pentru numărul de valori $n$-biți pe care un adversar le poate obține pentru o anumită secvență/cheie. Notă: ChaCha20 nu este un cifr de bloc, cu atât mai puțin de lățime variabilă a blocului după cum este necesar, dar ar putea fi folosit ca un bloc de construcție pentru unul.
caveman avatar
drapel in
@fgrieu - Mulțumesc! Un fel de off-topic: dacă merg cu ChaCha20, 512 va fi reductibil fără a schimba rezultatul (dacă $n
Puncte:3
drapel my

Există modalități on-line de a utiliza un cifru bloc pentru a genera unic $n$ biți care garantează lipsa de coliziune pt $2^n$ ori?

Modul evident de a face acest lucru este selectarea a Format Păstrarea criptării modul de cifrare bloc, să zicem, FF1. Acesta este un mod care ia un bloc de lungime arbitrară (în cazul dvs., $n$ biți); ai introduce cheia și ai cripta un contor. Cu o cheie fixă ​​(și nonce), criptarea este inversabilă și are o ieșire exact de aceeași lungime ca și intrarea - care vă oferă exact ceea ce cereți.

Singurul dezavantaj pe care îl pot vedea este că FF1 poate avea probleme de securitate pentru blocurile cu adevărat mici (în cazul dvs., $n \le 6$). Desigur, dacă utilizatorul cere acel mic de un $n$, puteți reveni la „permutați valorile de la 0 la $2^n-1$ strategie...)

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.