Ho familiarità con la legge di Schneier:
Any person can invent a security system so clever that he or she can't imagine a way of breaking it.
Ho letto i numerosi post su questo scambio pieni di domande su come scrivere il proprio algoritmo di sicurezza e ho letto le ovvie risposte sul motivo per cui è una pessima idea al di fuori di un esperimento mentale.
Questa domanda vuole essere diversa, anche se probabilmente sarà ugualmente ignorante come tutto il resto. Tuttavia, sono interessato a ciò che tutti voi avete da dire.
Quando penso alla crittografia, la penso più o meno così:
(data) * (algo % key) = (encrypted data)
in altre parole, prendi alcuni dati, aggiungi una password tramite un algoritmo e ottieni dati crittografati.
E se l'algoritmo stesso fosse la password? Che cosa succede se hai scritto un programma semplice e di dimensioni ridotte che modifica i dati che hai fornito, quindi distruggi il programma dopo ogni utilizzo?
Ad esempio, lo terremo molto semplice. Hai una stringa di parole come
"My name is Alice"
Supponiamo quindi di scrivere un programma molto, molto semplice che prende questa stringa e la modifica:
std::string input="My name is Alice";
std::string output;
std::string oginput;
for(char& c : input) {
output += (c + 1);
}
for(char& c : output) {
oginput+= (c - 1);
}
std::cout<<output<<std::endl;
std::cout<<oginput<<std::endl;
Output:
Nz!obnf!jt!Bmjdf
My name is Alice
L'idea è semplice: aggiungi 1 a ciascun carattere da crittografare, sottrai 1 da ciascun carattere per decrittografarlo. Questo tipo di programma è abbastanza semplice che l'idea di ciò che fa può essere ricordata, ed è abbastanza semplice da ri-implementare - anche se la sintassi o i mezzi (funziona invece) sono diversi. Anche un'idea più complessa, può essere ancora abbastanza semplice da ricordare come implementare, anche se è una pagina o due di codice per farlo.
Quindi, se prendi questo algoritmo nella tua testa, scrivi un programma che modifica in un modo un blocco di dati, quindi distruggi il programma (supponiamo che il codice, il programma compilato, i file obj, ecc. non siano memorizzati sull'HDD o salvati in qualsiasi modo - sono al 100% andati per sempre).
Ora sei seduto con un blob casuale di dati Nz!obnf!jt!Bmjdf
senza punto di partenza per inserirli, nessun algoritmo noto per decrittografarlo contro w / un mazzo di chiavi, ecc. Hai appena preso un input, lo hai trasformato in modo incomprensibile in un certo modo che solo tu sai come invertire e distrutto qualsiasi briciola di biscotti lungo la strada.
Si tratta di una forma di crittografia valida per i tecnici inclini? Ovviamente questo esempio è abbastanza semplice da decifrare, i pattern possono essere trovati, ecc. Ma una serie di piccole modifiche ai dati in un ordine segreto, e forse più iterazioni, si sommano a molta entropia molto rapidamente.