Définition du problème
Le but de la cryptographie est d'approcher un processus par lequel
crypt(x)
ne transmet aucune information sur x mais il existe une fonction decrypt
telle que
decrypt(crypt(x)) == x
Si le déchiffrement et le chiffrement n'ont été effectués que dans la même exécution du même programme, vous pouvez parfaitement implémenter cela en utilisant l'état caché:
var map = {}; // A hidden hashmap.
function crypt(x) {
var k = unique_unforgeable_value();
map[k] = x;
return k;
}
function decrypt(k) { return map[k]; }
En pratique cependant, crypt
et decrypt
sont appelés par différents programmes ou différentes exécutions du même programme, nous devons donc approximer en crypt
utilisant une fonction déterministe dont la sortie ne peut pas être distinguée de bits aléatoires - elle doit être incompressible (au sens du codage Shannon) donc aucun bit de structure supplémentaire ne peut être utilisé pour glaner des informations sur x.
Les algorithmes sont très structurés donc compressibles. Nous avons donc besoin d'un moyen d'obtenir un caractère aléatoire apparent tout en conservant le déterminisme requis pour .rée c r yp t ∘ c r yp t = i de n t i t y
Réponse
En curry un algorithme compressible simple avec un secret incompressible
crypt = crypt_algo(secret)
decrypt = decrypt_algo(secret)
nous pouvons approximer l'objectif ci-dessus. crypt
et decrypt
ont un contenu d'informations élevé en raison du contenu d'informations élevé de secret même si crypt_algo
et decrypt_algo
ont un contenu d'informations faible.
secret
doit être tenu à l'écart des attaquants pour que cela fonctionne, car sinon un attaquant pourrait simplement faire le curry ci-dessus. L'algorithme n'a pas besoin d'être gardé secret car il ne fournit qu'une petite partie du contenu informationnel de la fonction curry.
Caveat
"La sécurité cryptographique doit reposer sur une clé secrète au lieu d'un algorithme secret."
Je suis en désaccord avec la place d'une partie.
Vous pouvez obtenir une certaine défense en profondeur en gardant les deux secrets, mais les tests crypt_algo
sont difficiles, donc historiquement, les algorithmes secrets développés en interne par des amateurs ont fait pire lorsqu'ils sont soumis à une attaque que ceux qui ont été soigneusement examinés par un grand nombre de cryptographes professionnels. C'est pourquoi la sécurité par obscurité a obtenu une mauvaise réputation à juste titre. L '"obscurité" se réfère ici aux tentatives de garder l'algorithme secret comme substitut pour protéger correctement les clés.