Tecniche per scrivere algoritmi di crittografia (esclusivamente per uso personale)

18

Vorrei inserire questa domanda affermando che capisco perfettamente i pericoli insiti nella scrittura dei tuoi algoritmi di crittografia e non utilizzerei mai e poi mai la crittografia fatta in casa per proteggere i dati di nessuno, tranne me stesso.

Oggi mi è stato assegnato un progetto di semestre di informatica che riunisce tutto ciò che abbiamo appreso in un unico programma. Parte della funzionalità di questo programma è che può crittografare e decifrare le stringhe. Dobbiamo scrivere noi stessi questi metodi di crittografia, quindi non possiamo usare nulla di costruito nel linguaggio che stiamo usando (Java). Infine, dobbiamo evitare tutto ciò che utilizza una chiave per la crittografia.

Ora, dopo aver parlato con alcuni dei miei compagni di classe, sembra che quasi tutti stiano usando ROT13 o un altro metodo simile. Poiché sono un overachiever e perché non voglio essere come tutti gli altri, voglio progettare il mio metodo di crittografia. Tuttavia, sono un po 'perso nel punto di partenza. Quindi, quali tecniche di base o avanzate esistono per la crittografia?

    
posta Josh 09.12.2011 - 02:47
fonte

9 risposte

15

Se sei generalmente interessato alla crittografia oltre il tuo progetto :

Dipende dal tipo di crittografia che desideri eseguire. Avvertenza enorme: questa risposta serve solo a indicarti la giusta direzione teorica. Consiglio vivamente di leggere molto prima di saltare - più leggi, più capirai come i precedenti cifrari sono stati interrotti e non hai commesso gli stessi errori.

Chiave pubblica

Per far funzionare un sistema a chiave pubblica hai bisogno di una funzione botola . Sfortunatamente, il consiglio su wikipedia è abbastanza accurato:

Several function classes have been proposed, and it soon became obvious that trapdoor functions are harder to find than was initially thought

Le funzioni di botola sono piuttosto difficili; permutazioni trapdoor (dove i set di output e di input delle funzioni sono gli stessi e come tali la funzione "permute" l'input all'interno del set) sono ancora più difficili. In parole povere, il problema della fattorizzazione primaria e il problema del logaritmo discreto sono due "grandi". Le probabilità sono in questo campo, l'utilizzo di uno esistente sarà di gran lunga l'approccio più semplice.

Chiave simmetrica

Gli algoritmi delle chiavi simmetriche sono deliberatamente reversibili, ma senza uno degli input (la chiave) sono progettati per essere molto difficili da invertire. L'idea alla base è il principio di confusione / diffusione . Le tecniche comuni nei codici moderni includono reti di permutazione di sostituzione e reti feistel . Dovresti anche prendere in considerazione la lettura di modalità di funzionamento a blocchi di crittografia .

Giusto, ottimo, dove dovrei iniziare?

Leggendo, il più possibile. Non mi piace il consiglio standard "non progettare la tua cripto". Penso che le persone dovrebbero provare se vogliono. Ma non posso sottolineare abbastanza quanto sia difficile ottenere il giusto. Poiché hai un tempo limitato per il tuo progetto, una tecnica potrebbe essere quella di utilizzare un semplice esempio di un codice esistente, quindi:

Per il tuo progetto

Come esercizio educativo RC4 è molto facile da implementare. C'era una volta (non molto tempo fa) usato per proteggere il traffico SSL / WEP - a volte è ancora usato, quindi dovresti usare un vero codice. Ha alcuni problemi di sicurezza - capire questi ti aiuterà anche nella tua cripto-educazione generale. Tuttavia, poiché la tua esigenza è meno assoluta sicurezza e più apprendimento, avrei pensato che sarebbe stato l'ideale.

Se ti senti abbastanza ambizioso e conosci bene la tua lingua, AES non è poi così difficile da implementare in modalità ECB. FIPS-197 è abbastanza leggibile e in genere spiega l'algoritmo in modo abbastanza accessibile.

Hai ragione a considerare ROT13 un cattivo esempio. Anche non sapendo che l'offset di ciascun personaggio era di 13 posti, supponendo che si usi ASCII, si provano solo ciascuno degli offset 127 (o 255 per ASCII esteso) del testo cifrato fino a quando non viene eliminato quello giusto. Decrittarlo è quindi piuttosto banale, anche senza la chiave.

    
risposta data 09.12.2011 - 12:30
fonte
8

Devi evitare tutto ciò che usa una chiave? Personalmente, non riesco a vedere come puoi chiamare un algoritmo "crittografia" se non usa una chiave.

Potresti considerare di scrivere la tua implementazione del DES semplificato. Come suggerisce il nome, il DES semplificato (o S-DES) è una versione notevolmente semplificata del DES. Usa una chiave da 10 bit, ed è abbastanza semplice da risolvere con carta e penna.

Questo documento è il primo hit di Google per "DES semplificato". C'è anche un simulatore visivo su link .

    
risposta data 09.12.2011 - 14:33
fonte
4

Non voglio rovinare il tuo divertimento, ma vuoi pensare a quanto segue:

  1. Che cosa, intrinsecamente, è la crittografia, comunque? Quali sono le proprietà delle cose che crittografano e decodificano e perché lo facciamo come società? Vuoi pensare alle caratteristiche e al processo.
  2. Che cos'è una chiave? In base alla tua ricerca, potresti chiedere di chiarire questo punto al tuo istruttore.
  3. Crea un sistema di classificazione di tutte le famiglie di tecniche di crittografia. Facendo questa ricerca potresti trovare una risposta interessante o due.

Questo è un progetto basato sul semestre, quindi non è qualcosa che puoi (o dovresti) rispondere durante la notte. Il codice stesso può richiedere solo un giorno o due. Il vero apprendimento consiste nel trovare soluzioni basate sui vincoli dati.

    
risposta data 09.12.2011 - 03:20
fonte
2

Dovresti leggere The Handbook Of Applied Crypgoraphy . Questo libro è anche conosciuto come "The Handbook". È gratuito e ben scritto. Tuttavia, il capitolo 2, "Background matematico" è piuttosto rigido, molti di questi concetti non sono insegnati nella mia università pubblica locale (ho guardato).

    
risposta data 09.12.2011 - 03:05
fonte
2

Se vuoi vedere una versione semplificata di "confusione" e "diffusione" complesse, William Stallings ha scritto un eccellente Implementazione semplificata del DES .

È abbastanza facile che l'ho disegnato (e fatto le trasposizioni) su carta millimetrata. Ma ti porterà attraverso tutte le funzioni di base che DES usa e ti guida attraverso un singolo giro del processo di codifica-decifrazione.

    
risposta data 11.12.2011 - 05:49
fonte
1

Per la crittografia bidirezionale, la maggior parte degli algoritmi utilizza un operatore x o, confrontando il codice binario di una chiave e i dati binari dell'input, questo potrebbe non essere adatto a te allora, dato che non puoi usare una chiave ... tuttavia , questo è come funziona:

Dati di input: 10011101101001 Chiave: 123 = 1111011

La chiave è più piccola dell'input, quindi deve essere ripetuta:

Dati di input: 10011101101001 Chiave: 123 = 11110111111011

(in Java usa una variabile per contare in un ciclo per ogni o un ciclo while attraverso tutti i bit dell'input di dati ...) Ora usa l'x o il principal per generare il ciclo di risultati enciclati (due modi di hash) attraverso ciascuno bit nei dati di input e confrontarli con il bit corrispondente nella chiave, se identici, aggiungere 0 al risultato, in caso contrario, aggiungere 1 al risultato ... Il risultato sarà:

Dati di input: 10011101101001 Chiave: 123 = 11110111111011 Risultato = 01101010010010

Per decrittografare i dati, basta eseguire il trogolo dei dati crittografati:

Dati di input: 01101010010010 Chiave: 123 = 11110111111011 Risultato = 10011101101001

Idealmente dovresti usare una funzione di hash come sha, md5, ripemd ecc ... per generare la chiave, quindi trasformarla in binario ... se non puoi usare un algoritmo premade, potresti creare il tuo algoritmo per generare la chiave da confrontare ... basta fare in modo che tutti i bit nell'input dipendano l'uno dall'altro per generare il risultato ... esempio:

password: abcdefghi abc = 123456789 (a = 1, b = 2, c = 3 ecc ...)

ora fai un ciclo ogni bit (cifra) e aggiungili insieme a un contatore, ad esempio: Numero = 0 risultato="" foreach digit in password do { risultato = risultato & (Cifre risultato + [count-1]) * count) count = count + 1 }

risultato = (1 + 0) * 1 = 1 (2 + 1) * 2 = 6 (3 + 2) * 3 = 15 (4 + 3) * 4 = 28 (5 + 4) * 5 = 45 (6 + 5) * 6 = 66 (7 + 6) * 7 = 91 (8 + 7) * 8 = 120 (9 + 8) * 9 = 153

risultato chiave = 16152845669120153 Binario: 111001011000101110110101110100001110000011100010011001 (Questo è un esempio molto povero tu ... dovresti pensare ad un buon algoritmo ... uno in cui i due input iniziali si combinano e formano il terzo, e poi il terzo e il quarto vanno insieme al risultato della prima combinazione per generare il risultato del fith ...)

ma poi di nuovo, se non puoi usare una chiave, non puoi usare questo ...

    
risposta data 07.10.2012 - 01:56
fonte
1

A seconda dei vincoli posti su di te puoi effettivamente creare una crittografia estremamente difficile da decifrare abbastanza facilmente - questa crittografia ha difetti pratici che la rendono fondamentalmente inutilizzabile nel mondo reale, ma dovresti riempire gli utenti ROT13, Caesar, ecc. facilmente: in pratica creerai un sistema di codifica entropico, che ti restituisce una volta sola

Scrivi tu stesso qualcosa per leggere tutti i file sul tuo disco - questo è piuttosto facile, google per una scansione di directory ricorsiva gerarchica, aprire tutti i file raw / binary e succhiare i loro contenuti

All'inizio dello streaming in ogni flusso di byte, crea un file master in cui cerchi una ricorrenza di sottosequenze (mi riferirò a questi come stringhe d'ora in poi, poiché ciò che sono, sono solo stringhe di testo ) nell'input: è necessario creare un algoritmo che nel tempo preferisca le sottosequenze di corrispondenza più lunghe possibili, ma può ricorsivamente suddividere l'input in stringhe più piccole - se si guarda link vedrai un particolare algoritmo per realizzare questo, ma non devi andare troppo lontano - ma le implementazioni porteranno probabilmente a frammenti di codice che ti semplificheranno la vita.

Ora, per codificare qualcosa, prendi la stringa di input e applica la stessa operazione, trovando la sottostringa di lunghezza più lunga corrispondente nel file master e sostituendo la stringa di input con l'offset e la lunghezza della sottostringa corrispondente nel file master - nota questo corrisponderà a qualsiasi stringa, perché alla fine della giornata ricorserai in cerca di singoli bit Una guardia che dovrai usare è quella di dover scorrere l'insieme di tutte le stringhe corrispondenti prima di iniziare a riutilizzare gli stessi indici - immagina un file master in cui hai alternato 1 e 0 e potresti associare solo gli input a livello di bit ( tecnicamente impossibile, ma portami con me) - se ricevessi una stringa di 5 1, la codificherai come 1: 1,3: 1,5: 1,7: 1,9: 1 (sì, un difetto è questa codifica può diventare orribilmente inefficiente in alcuni casi) (nb - se codi bit, indebolirai il codice - punti extra se muovi l'offset nel messaggio, ma questa è una brutta strategia di mappatura multidimensionale al di fuori dell'ambito di questo post)

Tieni traccia del conteggio degli indici riutilizzati - il tuo obiettivo è avere una tabella master abbastanza grande da non farlo mai - se questo accade e dovessi codificare un solo messaggio è abbastanza certo che l'universo sarebbe morto di morte termica prima del il codice potrebbe essere incrinato più messaggi vengono codificati DOVE SONO RIUSCITI GLI INDICI, più il codice viene comprimizzato (analisi del linguaggio, analisi del modello, ecc.) Ora ecco il trucco - per usare questo codice con un'altra parte - è necessario procurarsene una copia della tabella principale - dovresti farlo solo di persona, dovresti sempre tenere il supporto di trasferimento sotto il tuo controllo, e dovresti distruggere quando il trasferimento è completo - e se una macchina su cui è attiva la tabella principale viene comprimata, il tuo codice è bruscamente - fino ad allora, è dannatamente difficile

Buon divertimento

    
risposta data 07.10.2012 - 18:50
fonte
0

Dai un'occhiata alla classe Crypto I della Stanford University in coursera. Analizza il flusso e blocca i codici e anche la crittografia a chiave pubblica. Saresti molto più informato se guardassi solo le prime lezioni. Inoltre, il corso copre anche vulnerabilità e metodi per rompere le implementazioni crittografiche.

    
risposta data 23.01.2013 - 17:56
fonte
-2

Una volta ho ideato una crittografia sviluppata internamente: -

a) Creare un generatore di numeri pseudo-casuali (PRNG) cresciuto in casa, con un lungo periodo. Per ottenere periodi più lunghi puoi avere più generatori. Poiché il tuo PRNG è cresciuto in proprio, devi testarlo accuratamente per assicurarti che sia ragionevolmente casuale.

b) Per ogni crittografia genera un seme per il tuo PRNG cresciuto in casa. Questo non deve essere generato usando il tuo PRNG di casa! Ho usato il twister mersenne, inseminato da varie cose come il tempo in microsecondi e amp; processo-id.

c) XOR l'output dal tuo PRNG cresciuto in casa con il testo in chiaro per produrre il testo cifrato e aggiungi il seme di origine locale utilizzato nel passaggio 2.

d) L'algoritmo di decrittografia estrae semplicemente il seme dal testo cifrato, quindi inverte la crittografia utilizzando il PRNG di proprietà nazionale.

Non viene utilizzato "chiave" o "password". La chiave è essenzialmente il tuo PRNG.

Il mio PRNG ha avuto un periodo abbastanza ampio che nessuna sequenza PRNG sarebbe mai stata ripetuta / riutilizzata entro il tempo di vita previsto dei dati o del sistema stesso (cioè più di 10 anni), e l'ho testato per essere sicuro. Mi sono assicurato che il periodo fosse molto ampio avendo più PRNG (con più semi) e XORando insieme le sequenze multiple. Il periodo molto ampio significava che ogni singola chiamata al mio codice della libreria di crittografia stava usando qualcosa come una volta sola. L'unica differenza era che ogni "one-time pad" era solo pseudo-casuale e non veramente casuale. Un grande vantaggio per me era che non c'era bisogno di condivisione delle chiavi o gestione delle chiavi.

La sicurezza di questo algoritmo dipende dalla difficoltà di predire la sequenza PRNG cresciuta dal seme. Questo è il motivo per cui deve essere usato un PRNG obbligatorio ... se si utilizza un PRNG "standard", allora sarebbe facile indovinare la sequenza PRNG dal seme incorporato nel testo cifrato.

Saluti.

    
risposta data 18.07.2014 - 00:34
fonte

Leggi altre domande sui tag