Imagine un entorno altamente distópico, donde los MITM del gobierno malvado opresivo en todas las conexiones y utiliza el DPI para frustrar cualquier intento de usar TLS / SSL, TOR, I2P, etc. Para establecer la conexión, estos protocolos primero deben comunicarse un poco en texto claro, y Si el DPI puede identificar el paquete de intercambio, la conexión se cerrará. El uso de protocolos personalizados o modificaciones de protocolos para combatir este mecanismo no es una opción viable, ya que los funcionarios supervisan todo lo que pasa a través del filtro de red y casi inmediatamente adaptan las reglas de DPI a las nuevas versiones.
Había pensado en una idea para hacer un protocolo que sería prácticamente imposible crear una regla en contra. Algo que se puede usar para hacer que los datos de texto simple (versiones de protocolo, lista de cifrados, huellas digitales de claves públicas, intercambios de DH) parezcan aleatorios y uniformes, pero a la vez sean fácilmente reversibles.
Podría pensar en la siguiente opción:
Cifrado de sustitución de hash alfabético infinito
Cada octeto de cadena de texto simple se asigna a una gran parte de datos completamente aleatorios. El primer octeto de hash de esos datos coincide con el octeto deseado.
Procedimiento de codificación en casi 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
Dados N bytes de entrada, el resultado será N * H bytes, donde H es el tamaño de la función hash.
Procedimiento de decodificación:
plaintext = ''
for group in split_in_groups(stegotext, group_length=H):
digest = calculate_hash(group)
octet = digest[0]
plaintext += octet
Sin embargo, en caso de que se use alguna función de hash computacionalmente simple, no es difícil para MITM agregar una regla que calcule la función de hash en cada paquete, y filtre los resultados. Para protegerse contra esto, se puede usar PBKDF2 o scrypt, por lo que para la parte legítima no se necesitan muchos recursos para aceptar o iniciar la conexión, pero MITM se verá abrumado.
La pregunta es: ¿tiene algún sentido? ¿Es mejor que simplemente usar scrypt sin encabezado con un gran valor de r
y una clave pública enviada previamente?