Definição de problema
O objetivo da criptografia é aproximar um processo pelo qual
crypt(x)
não transmite informações sobre x, mas existe uma função decrypt
que
decrypt(crypt(x)) == x
Se a descriptografia e criptografia foram feitas apenas na mesma execução do mesmo programa, você pode implementar isso perfeitamente usando o estado oculto:
var map = {}; // A hidden hashmap.
function crypt(x) {
var k = unique_unforgeable_value();
map[k] = x;
return k;
}
function decrypt(k) { return map[k]; }
Na prática, porém, crypt
e decrypt
são chamados por programas diferentes ou execuções diferentes do mesmo programa, precisamos aproximar crypt
usando uma função determinística cuja saída é indistinguível de bits aleatórios - ela deve ser incompressível (no sentido de codificação de Shannon) não há bits de estrutura extras que possam ser usados para coletar informações sobre x.
Os algoritmos são altamente estruturados, portanto, compressíveis. Portanto, o que precisamos é de uma maneira de obter aparente aleatoriedade, mantendo o determinismo necessário parade c r yp t ∘ c r yp t = i de n t i t y.
Responda
Currying um algoritmo compressível simples com um segredo incompressível
crypt = crypt_algo(secret)
decrypt = decrypt_algo(secret)
podemos aproximar o objetivo acima. crypt
e decrypt
ter alto conteúdo de informações devido ao alto conteúdo de informações secretas crypt_algo
e ainda decrypt_algo
ter baixo conteúdo de informações.
secret
precisa ser mantido longe dos atacantes para que isso funcione, pois caso contrário, um invasor pode simplesmente fazer o curry acima. O algoritmo não precisa ser mantido em segredo, pois fornece apenas uma pequena parte do conteúdo informativo da função em curry.
Embargo
"A segurança criptográfica deve confiar em uma chave secreta em vez de em um algoritmo secreto."
Eu discordo do em vez da parte.
Você pode obter alguma medida de defesa em profundidade mantendo os dois em segredo, mas o teste crypt_algo
é difícil; portanto, historicamente, os algoritmos secretos desenvolvidos internamente por amadores tiveram um desempenho pior quando submetidos a ataques do que aqueles que foram cuidadosamente revisados por um grande número de pessoas. criptografadores profissionais. É por isso que a segurança pela obscuridade ganhou um nome merecidamente ruim. A "obscuridade" refere-se a tentativas de manter o algoritmo em segredo como um substituto para proteger adequadamente as chaves.