Ecco un problema per cui sto cercando di creare la soluzione migliore. Ho un insieme finito di numeri interi non negativi nell'intervallo [0 ... N]. Devo essere in grado di rappresentare ogni numero in questo set come una stringa ed essere in grado di convertire tale stringa all'indietro al numero originale. Quindi questa dovrebbe essere una funzione biettiva.Bijective "Integer <-> String" function
Ulteriori requisiti sono:
- rappresentazione String di un numero dovrebbe offuscare numero originale, almeno in una certa misura. Una soluzione così primitiva come f (x) = x.toString() non funzionerà.
- La lunghezza della stringa è importante: minore è, meglio è.
- Se si conosce la rappresentazione di stringa di K, vorrei che fosse non banale (in una certa misura) di indovinare la rappresentazione di stringa di K + 1.
Per p.1 & p.2 la soluzione ovvia è utilizzare qualcosa come Base64 (o qualunque BaseXXX per adattarsi a tutti i valori) notazione. Ma possiamo inserirci in p.3 con uno sforzo minimo aggiuntivo? Il buon senso mi dice che ho anche bisogno di una funzione "String < -> String" bijective per i valori BaseXXX. Eventuali suggerimenti? O forse c'è qualcosa di meglio di BaseXXX da utilizzare per soddisfare tutti e 3 i requisiti?
L'elenco "Correlato" sulla destra ha un numero di q simili, sembra che – AakashM
Per definizione, una funzione di offuscamento reversibile è un "cifrario". Non essere in grado di calcolare 'enc (k + 1)' da 'enc (k)' è praticamente necessario per un buon cifrario, dal momento che se si potesse allora una coppia di testo in chiaro noto fornirebbe il maggior numero di testi cifrati dei testi in chiaro vicini come hai avuto il tempo di calcolare. Penso che la domanda, quindi, sia come si accetta un codice "cattivo" (o costoso da calcolare) per ottenere brevi testi cifrati, se si intende usare sale o meno, e se si ha bisogno di un modalità streaming. –
I modi di streaming sono importanti e non del tutto banali, perché anche se il tuo cifrario rende impossibile invertire la rappresentazione di un singolo numero, un attaccante che può vedere una lunga serie di numeri e conosce un po 'la probabile distribuzione dei dati in chiaro potrebbe essere in grado di eseguire analisi di frequenza, analisi della catena di Markov ecc. per identificare i valori cifrati di specifici valori di testo in chiaro comuni. Vedi http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Electronic_codebook_.28ECB.29 per un esempio di malfunzionamento della modalità streaming. –