it-swarm.it

Tecniche per la scrittura di algoritmi di crittografia (esclusivamente per uso personale)

Vorrei fare una prefazione a questa domanda affermando che ho compreso appieno i pericoli legati alla scrittura dei propri algoritmi di crittografia e che non avrei mai e poi mai usato la crittografia fatta in casa per proteggere i dati di chiunque tranne me stesso.

Oggi mi è stato assegnato un progetto del semestre di informatica che riunisce tutto ciò che abbiamo imparato in un programma. Parte della funzionalità di questo programma è che può crittografare e decrittografare le stringhe. Dobbiamo scrivere noi stessi questi metodi di crittografia, quindi non possiamo usare nulla di integrato 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. Perché sono un overachiever e non voglio essere come tutti gli altri, voglio progettare il mio metodo di crittografia. Tuttavia, sono un po 'perso da dove cominciare. Quindi, quali tecniche di base o avanzate ci sono per la crittografia?

18
Josh

Se sei generalmente interessato alla crittografia oltre il tuo progetto :

Dipende dal tipo di crittografia che si desidera fare. Enorme avvertimento: questa risposta è solo indicarti la giusta direzione teorica. Consiglio vivamente di leggere molto prima di saltare: più leggi e più capirai come le cifre precedenti sono state infrante e non commettere gli stessi errori.

Chiave pubblica

Per utilizzare un sistema a chiave pubblica è necessario un funzione Trapdoor . Sfortunatamente, i consigli su Wikipedia sono piuttosto precisi:

Sono state proposte diverse classi di funzioni, e ben presto divenne evidente che le funzioni della botola sono più difficili da trovare di quanto si pensasse inizialmente

Le funzioni della botola sono piuttosto difficili; Le permutazioni della botola (dove i set di output e input delle funzioni sono uguali e come tale la funzione "permuta" l'ingresso 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 possibilità 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 è principio di confusione/diffusione . Le tecniche comuni nelle cifre moderne includono reti di permutazione di sostituzione e reti di feistel . Dovresti anche prendere in considerazione la lettura di blocco delle modalità operative di cifratura .

Giusto, fantastico, da dove dovrei iniziare?

Leggendo il più possibile. Non mi piace il consiglio standard "non progettare la tua criptovaluta". Penso che le persone dovrebbero provare se vogliono. Ma non posso sottolineare abbastanza quanto sia difficile ottenere il giusto. Dato che 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. Un tempo (non molto tempo fa) veniva utilizzato per proteggere il traffico SSL/WEP - a volte viene ancora utilizzato, quindi si utilizzerà un codice reale. Ha alcuni problemi di sicurezza - la comprensione di questi ti aiuterà anche per la tua criptoistruzione generale. Tuttavia, poiché il tuo requisito è meno sicurezza assoluta e più apprendimento, avrei pensato che sarebbe stato l'ideale.

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

Hai ragione a considerare ROT13 un cattivo esempio. Pur non sapendo che l'offset di ogni carattere era di 13 posti, supponendo che tu usi ASCII, provi semplicemente ciascuno degli offset 127 (o 255 per ASCII esteso) del tuo testo cifrato fino a quando non scende quello giusto Per decifrarlo è quindi piuttosto banale, anche senza la chiave.

15
user2213

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

Potresti considerare di scrivere la tua implementazione di DES semplificato. Come suggerisce il nome, Semplificato DES (o S-DES) è una versione notevolmente semplificata di DES. Utilizza una chiave a 10 bit ed è abbastanza semplice da elaborare con carta e matita.

Questo documento è il primo hit di Google per "DES semplificato". C'è anche un simulatore visivo su http://edipermadi.wordpress.com/2008/01/12/simplified-des-simulator/ .

8
Jonathan

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

  1. Che cos'è, intrinsecamente, la crittografia? Quali sono le proprietà delle cose che crittografano e decifrano e perché lo facciamo come società? Vuoi pensare alle caratteristiche e al processo.
  2. Cos'è una chiave? Sulla base delle tue ricerche potresti voler chiedere chiarimenti su questo punto al tuo istruttore.
  3. Creare un sistema di classificazione di tutte le famiglie di tecniche di crittografia. Effettuando questa ricerca potresti trovare una risposta interessante o due.

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

4
logicalscope

Dovresti leggere The Handbook Of Applied Crypgoraphy . Questo libro è anche noto come "Il manuale". È gratuito e ben scritto. Tuttavia, il capitolo 2, "Background matematico" è piuttosto rigido, la maggior parte di questi concetti non viene insegnata nella mia università pubblica locale (ho guardato).

2
rook

Se vuoi vedere una versione semplificata della complessa "confusione" e "diffusione" William Stallings ha scritto un eccellente Semplificato DES implementazione .

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

2
Joseph Kern

A seconda dei vincoli posti su di te, puoi effettivamente creare una crittografia estremamente difficile da decifrare ragionevolmente facilmente - questa crittografia ha difetti pratici che la rendono fondamentalmente inutilizzabile nel mondo reale, ma dovresti riempire ROT13, gli utenti Caesar, ecc. In pratica creerai un sistema di codifica entropia, che ti fornisce un time pad

Scrivi qualcosa da leggere per leggere tutti i file sul tuo disco rigido: è abbastanza facile, cerca Google per una scansione gerarchica ricorsiva delle directory, apri tutti i file grezzi/binari e succhia i loro contenuti

Quando inizi a eseguire lo streaming in ogni flusso di byte, renditi un file principale in cui cerchi una ricorrenza di sottosequenze (d'ora in poi farò riferimento a queste come stringhe, poiché è quello che sono, non sono solo stringhe di testo) nella input: è necessario creare un algoritmo che nel tempo preferisca le sottosequenze di corrispondenza più lunghe possibili, ma può sezionare in modo ricorsivo l'input in stringhe più piccole, se si guarda http://en.wikipedia.org/wiki/Huffman_coding vedrai un particolare algoritmo per raggiungere questo obiettivo, ma non è necessario andare così lontano - ma le implementazioni probabilmente produrranno 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 corrispondente di lunghezza più lunga nel file master e sostituendo la stringa di input con l'offset e la lunghezza della sottostringa corrispondente nel file master - nota che corrisponderà a qualsiasi stringa, perché alla fine ricercherai verso il basso cercando singoli bit Una protezione che dovrai usare è che devi scorrere il set di tutte le stringhe corrispondenti prima di iniziare a riutilizzare gli stessi indici - immagina un file master dove avevi alternato 1 e 0 e potevi far corrispondere gli input solo a livello di bit (tecnicamente impossibile ma sopportabile con me) - se avessi ricevuto una stringa di 5 1, l'avresti codificato come 1: 1,3: 1,5 : 1,7: 1,9: 1 (sì, un difetto è che la codifica può diventare inefficace in alcuni casi) (nb - se codifichi bit, indebolirai il codice - punti extra se sposti solo l'offset in il 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 è quello di avere una tabella principale abbastanza grande da evitare che ciò accada - se ciò si verifica e dovessi codificare solo un messaggio, è abbastanza certo che l'universo morirà di morte mortale prima che il codice possa essere incrinato più messaggi codifichi DOVE GLI INDICI SONO RIUTILIZZATI, più il tuo codice viene compreso (analisi del linguaggio, analisi dei modelli, ecc.) Ora ecco il trucco - per utilizzare questo codice con un'altra parte - devi procurartene una copia del tabella principale: dovresti farlo solo di persona, dovresti sempre tenere sotto controllo il supporto di trasferimento e dovresti distruggerlo quando il trasferimento è completo - e se qualsiasi macchina su cui si trova la tabella principale viene compresa, il tuo codice viene tostato - fino ad allora, è abbastanza dannatamente duro

Divertiti

1
Mark Mullin

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

Dati di input: 10011101101001 Chiave: 123 = 1111011

Il tasto è più piccolo dell'input, quindi deve essere ripetuto:

Dati di input: 10011101101001 Chiave: 123 = 11110111111011

(in Java usa una variabile per contare in un ciclo a ciascuno o un po 'attraverso tutti i bit dell'input di dati ...) Ora usa x o principal per generare il risultato codificato (due hash) esegui il ciclo attraverso ogni bit nei dati di input e confrontalo con il bit corrispondente nella chiave, se identico, aggiungi 0 al risultato, in caso contrario, aggiungi 1 al risultato ... Il risultato sarà quindi:

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

Per decrittografare i dati, è sufficiente eseguire il trogolo dati crittografato:

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

Idealmente dovresti usare una funzione 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 in essere confrontato ... basta assicurarsi che tutti i bit nell'input siano dipendenti l'uno dall'altro per generare il risultato ... esempio:

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

ora esegui il ciclo di ogni bit (cifra) e aggiungili insieme a un contatore, ad esempio: count = 0 result = "" foreach digit in password do {result = result & (digit + result [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 scarso tu ... dovresti pensare attraverso un buon algoritmo ... uno in cui i due ingressi iniziali si combinano e formano il terzo, quindi il terzo e il quarto vanno insieme al risultato della prima combinazione per generare il risultato fith ...)

ma poi di nuovo, se non puoi usare un tasto, non puoi usare questo ...

1
Daniel V

Dai un'occhiata alla classe Crypto I dell'Università di Stanford a Coursera. Suddivide lo stream e blocca le cifre e la crittografia della chiave pubblica. Saresti molto più informato se guardassi solo le prime lezioni. Inoltre, il corso copre anche le vulnerabilità e i metodi per interrompere le implementazioni crittografiche.

0
Andrew