Din 4.1 Reprezentarea șirurilor de caractere ale specificațiile preliminare NIST SP 800 38G Rev 1 asta a fost menționat în comentarii:
Intrările și ieșirile de date către funcțiile de criptare 286 și de decriptare FF1 și FF3-1 trebuie să fie secvențe finite de numere, adică șiruri de cifre. Dacă datele de criptat sunt formatate într-un alfabet care nu este deja setul de numere de bază, atunci fiecare caracter trebuie să fie reprezentat printr-un număr distinct pentru a aplica FF1 sau FF3-1.
...
Alegerea și implementarea unei corespondențe unu-la-unu între un alfabet dat și setul de numere de bază de bază care reprezintă alfabetul este în afara domeniului de aplicare al acestei publicații.
Acest lucru nu este încă atât de clar, dar, practic, trebuie să mapați canonic datele de intrare la un interval [0, N) și înapoi din nou în timpul ambelor criptări. și decriptare. Această mapare este în afara domeniului de aplicare, deoarece este desigur specifică specificației de intrare a datelor.
Dacă datele tale constau din mai multe intervale, atunci lucrurile devin puțin mai complicate. În principiu, comandați mai întâi datele (de obicei de la stânga la dreapta), apoi determinați baza pentru fiecare set separat de intervale de intrare. Apoi valoarea din interval este creată prin înmulțirea intervalului de intrare cu bazele de capăt inferioare.
Îți voi arăta mai întâi cum acestea $\text{encode}$ și $\text{decodificare}$ funcțiile ar funcționa:
Să presupunem că intervalele de intrare sunt pentru o cifră - excluzând zero - urmată de un caracter în ABC majuscule, adică. [1-9][A-Z]
. Baza cifrelor - excluzând zero - este $9$, baza alfabetului este desigur $26$.
Acum să încercăm să calculăm valoarea pentru 7Z
. Dacă urmați aceste reguli, atunci valoarea pe care o obțineți este $6 \cdot 26 + 25 = 181$, Unde $6$ este indicele de 7
în $[1, 9]$, $26$ este baza (numărul de caractere) din ABC și $25$ este indicele de Z
în acel ABC.
Pentru a-l mapa înapoi, mai întâi executați 181 $ \bmod 26 $, care ar trebui să vă ofere $25$ din nou, care îți dă Z
după de-indexare. Apoi împărțiți: $\big\lceil 181 / 26 \big\rceil$, și întoarce-te $6$ care este indicele de 7
în intervalul $[1, 9]$.
Acum trebuie să includem criptarea și decriptarea:
Acum puteți efectua FF1 sau FF3 pe rezultat, $181$ și obține o valoare diferită. Puteți utiliza pur și simplu regulile pentru a codifica acest lucru în reprezentarea dorită.
Deci spune că ai $\text{encode}(\text{"7Z"}) = 181$ și $\text{enc}_k(181) = 26$, atunci aceasta vă va oferi
$\text{decode}(26) = "1A"$ pe care le puteți stoca. Apoi inversezi astfel: $\text{decode}(\text{dec}_k(\text{encode}(\text{"1A"}))) = "7Z"$. Parametrii de codificare și decodare sunt specifici [1-9][A-Z]
.
Trucurile de mai sus pot fi extinse cu ușurință la orice format pentru care intervalele sunt clare și, atunci când sunt codificate corect, pentru codificare sunt necesare doar înmulțirea și adăugarea și numai împărțirea cu restul este necesară pentru decodare.Codificarea/decodificarea ar trebui să dureze mai puțin de o microsecundă atunci când este implementată corect (pentru dimensiuni de intrare relativ mici, pentru care FPE este utilizat în mod obișnuit).