Am nevoie de o modalitate de a mapa un text imprimabil cu un alt text imprimabil. De exemplu.:
Ian Boyd
â Kcp Zbas
Observați câteva dintre cerințele importante:
- majuscule este majuscule în ieșire
- litere mici în intrare sunt litere mici în intrare
- spațiile (și orice altceva în afara A-Z0-9) sunt lăsate singure
Cerința suplimentară este să fie determinat, aceeași intrare dă întotdeauna aceeași ieșire:
Ian Boyd
â Kcp Xbas
Ian Boyd
â Kcp Xbas
Ian Boyd
â Kcp Xbas
Cealaltă cerință se extinde asupra determinismului și nu știu cum să o numesc, cu excepția faptului că cuvintele cu prefixe comune trebuie să aibă aceeași ieșire pentru același prefix comun:
eu
â K
In absenta
â Kc
Ian
â Kcp
Ian
â Kcp
Ian B
â Kcp X
Ian Bo
â Kcp Xb
Ian Boy
â Kcp Xba
Ian Boyd
â Kcp Xbap
Soluția mea
Am creat o soluție la aceste cerințe tehnice în urmă cu 15 ani; dar încerc să revăd ceva "mai bine".
Soluția mea a fost a „un cifru Caesar în flux cu înlănțuire”.
Creați o substituție caesar simplă:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
F H U D I R Y E K C Z N S A B G J P V O W T L M Q X
Dar mai degrabă decât o simplă înlocuire:
în schimb am folosit înlănțuirea:
Previous State Current Character Sum (mod) Următorul caracter de ieșire
-------------- ----------------- ---------- --------- ----- --------------------
0 I (9) 9 K K
9 a (1) 10 c Kc
10 n (14) 24 p Kcp
24 B (2) 26 X Kcp X
26 o (15) 15 b Kcp Xb
15 y (25) 14 a Kcp Xba
14 d (4) 18 m Kcp Xbap
Soluție mai bună cu hashing?
Aceste valori nu sunt ceva de care am nevoie (sau vreau). "decripta", iar utilizarea unui cifru caesar implică capacitatea de a decripta (care știm cu toții că nu este atât de greu).
Deci conceptual îmi doresc foarte mult un "funcție unidirecțională": ceva care:
- convertește intrarea
- la o ieșire imprevizibilă
- în mod determinist
M-am gândit: ce se întâmplă dacă aș folosi un algoritm hash, adăugând litere câte una și obținând curentul "stat"și convertiți acel rezumat parțial într-un caracter (majuscule/minuscule/cifră, după caz, pentru a se potrivi cu intrarea):
String FrobTheGrobber (Intrare șir)
{
//dovada de concept pseudocod care se ocupă doar de majuscule
HashAlgorithm hash = nou SHA256();
hash.AddBytes(SECRET_KEY);
String res = "";
pentru Char ch în intrare
{
hash.Add(ch);
int charCode = (hash.Hash[0] % 26) + 1; //folosește primul octet, mod 26 pentru a obține o valoare de la 0..25
res += Char(Ord('A') + charCode;
}
}
Știu; îl urăști pe cerințe.
Poate cineva să facă ceva mai bun?