web-dev-qa-db-fra.com

Qu'est-ce qu'un oracle cryptographique?

Je suis tombé sur le terme "Oracle cryptographique" et malgré un peu de recherche sur Google, je n'ai pas pu trouver de définition claire et concise. Qu'est-ce qu'un Oracle cryptographique et que fait-il? Quelqu'un peut-il donner un exemple?

35
josh-cain

Un Oracle est un individu qui connaît le numéro de téléphone portable d'un dieu. Cela lui permet d'obtenir des informations qui sont généralement considérées comme hors de portée de simples mortels, comme des aperçus de l'avenir. En cryptographie, c'est la même chose, sauf qu'aucune divinité n'est impliquée: un Oracle est un système qui peut donner des informations supplémentaires sur un système, qui autrement ne seraient pas disponibles.

Par exemple, envisagez le chiffrement asymétrique avec RSA . La norme que je lie à indique comment un élément de données doit être chiffré avec une clé publique. En particulier, le chiffrement commence par une opération de remplissage , dans laquelle l'élément de données est d'abord développé en ajoutant un en-tête, de sorte que la longueur des données remplies correspond la longueur de la clé publique RSA. L'en-tête doit commencer par les deux octets 0x00 0x02, suivi d'au moins huit octets aléatoires non nuls, puis d'un autre 0x00. Une fois les données complétées, il est temps d'appliquer l'opération mathématique qui est au cœur de l'opération RSA (exponentiation modulaire). Les détails du rembourrage sont importants pour la sécurité.

Le résultat du chiffrement est un module entier le module RSA , un grand entier qui fait partie de la clé publique. Pour une clé RSA 1024 bits, le module n est une valeur entière supérieure à 21023, mais plus petit que 21024. Un bloc de données correctement chiffré, avec RSA, donne une valeur entière entre 1 et n-1 . Cependant, le remplissage implique une structure , comme indiqué ci-dessus. La partie déchiffrante DOIT trouver, lors du déchiffrement, un en-tête PKCS # 1 correctement formé, commençant par 0x00 0x02 octets, suivis d'au moins huit octets non nuls, et il doit y avoir un 0x00 qui marque la fin de l'en-tête. Par conséquent, tous les entiers compris entre 1 et n-1 ne sont pas des RSA valides -message crypté (moins de 1 sur 65 000 de ces entiers donnerait un remplissage correct lors du décryptage).

Savoir si un module entier donné n donnerait, lors du décryptage, un une structure de remplissage valide, est censée être impossible pour quiconque ne connaît pas la clé privée. Le propriétaire de la clé privée (la divinité) obtient ces informations, et bien plus encore: si le décryptage fonctionne, le propriétaire de la clé privée reçoit en fait le message, qui est le point de décryptage. Supposons qu'il existe une entité, quelque part, qui peut vous dire si un entier donné modulo n est une donnée valablement chiffrée avec RSA; cette entité ne vous donnerait pas le résultat de décryptage complet, elle vous dirait simplement si le décryptage fonctionnerait ou non. C'est une information d'un bit, un aperçu réduit de ce que la divinité obtiendrait. L'entité est votre Oracle: elle renvoie des parties des informations qui ne sont normalement disponibles que pour le propriétaire de la clé privée.

Il s'avère que, étant donné l'accès à un tel Oracle, il est possible de reconstruire la clé privée, en envoyant des entiers spécialement conçus modulo n (il faut environ un million de ces valeurs, et pas mal de mathématiques, mais cela peut être fait). Il s'avère également que la plupart des implémentations SSL/TLS de cette époque (c'était en 1999) agissaient involontairement comme des oracles: si vous envoyiez, en tant que client, un message ClientKeyExchange crypté RSA, le serveur répondait avec un message d'erreur spécifique ("duh, votre message ClientKeyExchange pue"), alors que si le décryptage fonctionnait, le serveur suivait le protocole, en utilisant la valeur décryptée (généralement inconnue du client si le client a envoyé une valeur aléatoire , donc le protocole a échoué plus tard, mais le client a pu voir la différence entre un remplissage valide et non valide). Par conséquent, avec une telle implémentation, un attaquant pourrait (après un million de connexions échouées) reconstruire la clé privée du serveur, ce qui est généralement considéré comme une mauvaise chose.

Voilà ce que sont les oracles: une description mathématique d'une fuite de données, à utiliser dans les preuves de sécurité. Dans le cas de RSA, cela démontre que savoir si une valeur a un remplissage correct ou non est en quelque sorte équivalent à l'apprentissage de la clé privée (si vous connaissez la clé privée, vous pouvez essayer le déchiffrement et voir le remplissage par vous-même; l'attaque de Bleichenbacher montre que cela fonctionne aussi dans l'autre sens).

67
Thomas Pornin

Un Oracle est quelque chose qui peut immédiatement (O(1)) vous donner la réponse à un problème, généralement un problème irréalisable ou impossible. Par exemple, un "Oracle à problème d'arrêt" pourrait vous dire immédiatement si un certain programme sur une certaine entrée s'arrête ou non, même si le problème d'arrêt est non calculable à nous de simples mortels. Cependant, nous pouvons parfois prouver certaines propriétés utiles en prétendant que certains oracles existent.

Dans les documents cryptographiques, par exemple, les oracles sont le plus souvent utilisés pour montrer que, même si nos attaquants avaient accès à un Oracle apparemment impossibile, ils encore n'aurait aucun avantage (significatif) à briser notre sécurité. Par exemple, une propriété importante des algorithmes de chiffrement (appelée résistance à attaques en clair connues ) est que si un attaquant reçoit un message chiffré avec votre clé m' et ils veulent connaître le message d'origine m (ou comprendre votre clé), puis leur donner un autre message n et son cryptage avec votre clé n' ne devrait pas les aider à le faire de quelque façon que ce soit.

Pousser cela à l'extrême ( attaque en texte clair choisie ): donner à un attaquant un Oracle qui peut crypter ou décrypter n'importe quel message avec votre sauf pour m et m'. Même dans ces conditions extrêmes, nous voudrions montrer pour notre cryptage que l'attaquant avec Oracle n'aura aucun avantage à trouver m (ou votre clé) que l'attaquant sans Oracle. Cela signifierait que notre cryptage est à l'abri des attaques de texte en clair choisi.


[Modifier]
Voici un autre exemple pratique. Dans la question n programme pourrait-il jamais dire si un autre programme joue aux échecs , nous montrons qu'aucun tel programme n'existe en supposant d'abord qu'il y a est un Oracle de détection d'échecs, puis montrer son existence conduit à une impossibilité logique.

Les oracles cryptographiques sont une méthode d'entrée/sortie de boîte noire.

Il répondra à toute entrée avec une réponse pseudo-aléatoire mais donnera toujours la même sortie pour une entrée spécifique.

Ils sont généralement utilisés pour les fonctions de hachage où le caractère aléatoire est important pour une plus grande sécurité.

Évidemment, il y aura toujours des problèmes de sécurité car ce n'est qu'une fonction mathématique qui renvoie des nombres apparemment pseudo-aléatoires, mais ils sont évidemment plus forts que certains de leurs homologues moins aléatoires.

Voici un document solide sur eux et leur conception - http://cseweb.ucsd.edu/users/mihir/papers/ro.pdf

1
doyler