2010-10-27 16 views
10

Ho bisogno di alcuni puntatori o di un esempio pratico su come crittografare un int su un altro int, e una chiave segreta sarebbe necessaria per decodificare il valore.Codice intero simmetrico per la crittografia dei numeri interi

Qualcosa di simile:

encrypt(1, "secret key") == 67123571122 
decrypt(67123571122, "secret key") == 1 

Questo ragazzo chiede più o meno la stessa domanda: Symmetric Bijective Algorithm for Integers
però me di essere un sistema di crittografia totale "n00b" Vorrei alcuni esempi più pratici, in python, se possibile.

ho capito che ho bisogno di utilizzare una sorta di cifrario a blocchi, ma sono abbastanza perso nella parte su come mantenere il risultato cifrato ancora essere numerico e un po 'breve (forse un lungo, invece di un int)

Qualsiasi puntatori? Grazie

UPDATE- Perché voglio farlo?
Ho un servizio web in cui ogni "oggetto" ottiene un URL, ad es .: example.com/thing/123456/

In questo momento, gli ID sono sequenziali. Voglio nascondere il fatto che sono sequenziali (ID database).

Le cose su quelle pagine non sono "top secret" o qualcosa del genere, ma non dovrebbe essere così facile per qualcuno curiosare in qualche altro oggetto casuale come semplicemente incrementando quell'ID nell'URL.

Quindi con una sorta di crittografia numerica bidirezionale, gli ID URL non saranno affatto sequenziali e ci vorrebbe un po 'di tempo per trovare più di questi oggetti. (Inoltre, le richieste sono limitate)

E l'unica ragione per cui voglio mantenere questo valore numerico invece di una stringa arbitraria è che la modifica è una sostituzione drop-in totale e le cose funzioneranno senza altre modifiche al codice.

Inoltre, non riesco a generare nuovi ID di database casuali. Devo gestire questa crittografia/decrittografia nell'applicazione.

+2

Perché stai facendo questo? Qual è l'obiettivo? È molto pericoloso creare la tua crittografia. Anche cose ingannevolmente semplici come "basta usare la cifratura X" possono avere conseguenze inaspettate sulla sicurezza. –

+0

Buon punto. Ho aggiornato la domanda – adamJLev

+0

[Format Preserving Encryption] (http://en.wikipedia.org/wiki/Format-preserving_encryption) –

risposta

3

Dipende da come crittograficamente sicuro si desidera essere. Per non-molto-sicuro (nel senso criptato - probabilmente va bene per l'uso quotidiano se non si prevedono realmente attacchi gravi) allora funzionerà XOR con una chiave segreta fissa. Basta essere consapevoli che sarà vulnerabile ad alcune crittanalisi abbastanza semplici.

Se si desidera una vera crittografia, probabilmente sarà necessario utilizzare un codice di flusso come RC4. Puoi prendere 32 bit di keystream e XOR con il tuo valore per crittografarlo. Finché avrai un nuovo 32 bits di keystream per ogni valore, starai bene.

RC4 ha alcuni avvertimenti, tuttavia, è necessario leggerlo prima.

I codici a blocchi non saranno tuoi amici in questo caso poiché hanno blocchi di dimensioni pari o superiori a 64 bit. Ciò significa che è necessario eseguire il pad del numero intero a 32 bit a 64 bit e si ottengono 64 bit di nuovo ... ma non è possibile scegliere quale 32 mantenere. Non sarai in grado di decodificarlo con solo metà dei bit. Se sei felice di passare a long, allora puoi usare 3DES o Blowfish.

Tutto dipende esattamente da ciò che si sta crittografando e perché, quindi è difficile dare una risposta definitiva. Spero che questo dia un'idea di dove cominciare, almeno.

+1

+1 per cifratura a 64 bit. Ne ho un esempio di codice qui: http://stackoverflow.com/questions/3569783/query-string-parameter-obfuscation/3571165#3571165 Anche un numero intero a 64 bit rappresentato da esadecimale ha una lunghezza di soli 16 caratteri e dovrebbe essere perfetto per l'uso in un URL. –

0

Si desidera crittografare solo un singolo 'int' cioè q numero 32/64 bit?
Quindi il modo più semplice è solo XOR con una chiave segreta a 32/64 bit.

+0

In alternativa, XOR con una chiave più piccola, ripetuta sull'intervallo del numero. –

+0

Quale sarebbe il codice per questo aspetto, più o meno? – adamJLev

+0

fai attenzione con xor dritta perché con solo 64 esempi c'è la possibilità che l'utente possa capire la chiave. –

1

È possibile consultare questo documento: Perfect Block Ciphers with Small Blocks e the slides della presentazione alla conferenza FSE 2007.

Il documento spiega come selezionare in modo casuale una permutazione di n elementi (ad esempio il numero intero compreso tra 0 e n-1) che può essere visualizzato come un codice per questo insieme di n elementi.

1

La risposta che ho inviato a questa domanda si applica anche al vostro: utilizzare un codice a blocchi breve. Supponendo che i tuoi identificatori siano a 64 bit, infatti, puoi semplicemente usare il codice XTEA così com'è, con un numero intero a 64 bit come blocco dati.

+0

Sembra abbastanza buono, e il codice per XTEA sembra abbastanza semplice da essere facilmente portato su python. Grazie darò un colpo – adamJLev

0

Semplice XOR non può essere chiamato crittografia. L'offuscamento è una parola più appropriata per questo. Ho sviluppato un algoritmo compatto, veloce e fiducioso che lo chiamo Ayden. È di dominio pubblico e can be downloaded from Github. Spero che sia utile

Problemi correlati