Immaginate un ambiente altamente distopico, in cui i MITM del governo opprimente maltrattano su tutte le connessioni e usano DPI per contrastare qualsiasi tentativo di usare TLS / SSL, TOR, I2P ecc. Per stabilire una connessione, questi protocolli devono prima comunicare un po 'in chiaro, e se DPI è in grado di identificare il pacchetto di handshake, la connessione verrà chiusa. L'utilizzo di protocolli personalizzati o modifiche del protocollo per combattere questo meccanismo non è un'opzione praticabile, perché i funzionari controllano tutto ciò che passa attraverso il filtro di rete e quasi immediatamente adattano le regole DPI alle nuove versioni.
Avevo pensato a un'idea per creare un protocollo che sarebbe praticamente impossibile da creare contro una regola. Qualcosa che può essere usato per creare dati in chiaro (versioni di protocollo, elenco di cifre, impronte digitali della chiave pubblica, scambi di DH) appare casuale e uniforme, ma può essere facilmente reversibile.
Potrei pensare alla seguente opzione:
Codice di sostituzione hash dell'alfabeto infinito
Ogni ottetto di stringa di testo in chiaro viene mappato su una grande porzione di dati completamente casuali. Il primo ottetto dell'hash di quei dati corrisponde all'ottetto desiderato.
Procedura di codifica in quasi Python:
pool = {}
stegotext = ''
for octet in cleartext:
while octet not in pool:
chunk = generate_randomness(bytes=32)
digest = calculate_hash(chunk)
hash_octet = digest[0]
if hash_octet not in pool:
pool[hash_octet] = []
pool[hash_octet].append(chunk)
chunk = draw_and_remove_random_element(pool[octet])
stegotext += chunk
Dati N byte di input, il risultato sarà N * H byte, dove H è la dimensione della funzione hash.
Procedura di decodifica:
plaintext = ''
for group in split_in_groups(stegotext, group_length=H):
digest = calculate_hash(group)
octet = digest[0]
plaintext += octet
Tuttavia, nel caso in cui venga utilizzata una funzione di hash computazionalmente semplice, non è difficile per MITM aggiungere una regola che calcoli la funzione di hash su ogni pacchetto e filtri sui risultati. Per proteggersi da questo, si potrebbe usare PBKDF2 o scrypt, quindi per la parte legittima non ci vogliono molte risorse per accettare o avviare la connessione, tuttavia il MITM sarà sopraffatto.
La domanda è: ha senso? È meglio che usare solo lo scritio senza intestazione con un valore r
elevato e una chiave inviata pubblicamente?