Molte lune fa, stavo lavorando con un team che stava costruendo un sito web pubblico. Inizialmente, il sistema è stato creato utilizzando le chiavi primarie numeriche a incremento automatico come identificatore pubblico per ogni parte di contenuto che è stata raccolta. La parola è venuta dall'alto in basso che esporre questo numero era un rischio: rivelerebbe quanti oggetti il sistema possedeva e il delta tra qualsiasi ID di due oggetti e le loro date di post rivelerebbe un tasso di crescita / adozione.
Un collega anziano ha dichiarato che l'uso di una cifratura XOR risolverebbe questo problema. Prenderemmo gli ID oggetto come sempre e li abbiamo XOR con una chiave numerica strettamente sorvegliata per creare un identificatore pubblico. Invertire la procedura per ottenere il nostro numero originale.
Nel nostro caso, gli ID privati e la chiave erano entrambi interi a 32 bit senza segno. E, come ci si potrebbe aspettare, due elementi creati uno vicino all'altro hanno mostrato cambiamenti nei loro bit meno significativi, ma nessuna modifica nei bit più significativi. All'epoca pensavo che sarebbe stato banalmente facile per un avversario pubblicare alcuni oggetti in successione, notare che gli LSB cambiavano mentre gli MSB rimanevano statici e concludevamo che stavamo semplicemente facendo un numero intero incrementale. Ma mi sono sempre chiesto cosa ci sarebbe voluto per loro per ricavare la chiave e abbattere tutta la facciata.
È possibile, se un utente malintenzionato può ragionare che il testo in chiaro è un numero intero monotonicamente crescente, per derivare l'intera chiave?