web-dev-qa-db-fra.com

Défaut dans le cryptage via le flux de numéros pseudorandom (de la documentation PGP)

Je lisais - PGP Docs et je suis venu à une partie écrite par Phil Zimmermann (créateur de PGP) qui a piqué ma curiosité:

Quand j'étais à l'université au début des années 70, j'ai conçu ce que je croyais être un système de cryptage brillant. Un flux de numéros pseudo-pseudorandom simple a été ajouté au flux de plainte pour créer CIPHERText. Cela tromprait apparemment toute analyse de fréquence du chiffretext et serait irrécupérable même aux agences de renseignement gouvernementales les plus débrouillantes. Je me sentais tellement suffisant sur ma réussite.

Des années plus tard, j'ai découvert ce même plan dans plusieurs textes et papiers de tutoriels de cryptographie introductifs. Comme c'est gentil. D'autres cryptographes avaient pensé au même schéma. Malheureusement, le schéma a été présenté comme une simple affectation des devoirs sur la manière d'utiliser des techniques typanalytiques élémentaires pour le craquer trivialement. Voilà pour mon programme brillant. De cette expérience humiliante, j'ai appris à quel point il est facile de tomber dans un faux sentiment de sécurité lors de la conception d'un algorithme de cryptage.

Quelles techniques seraient capables de décrypter de manière triviale le texte codé de cette manière? Il semble presque équivalent à un coussinet ponctuel (qui est incassable sans le pad), à condition que le pseudo-rng soit suffisamment compliqué (période beaucoup plus longue que le texte crypté; taille moyenne ajoutée à chaque caractère significativement plus grand que la taille des caractères) et une graine convenablement compliquée (vous ne pouvez donc pas brute la force toutes les graines).

Par exemple, en utilisant une mersenne-twister (avec une période de 2 ^ 19937 -1 ~ 4.3x10 ^ 6001) et une phrase secrète qui génère une graine aléatoire de 256 bits; Cela semble irrécupérable sans avoir à la graine.

Ou ont-ils généré un générateur de nombres aléatoires simple avec une période de 2 ^ 32 - 1 ~ 4,3 milliards (c'était les années 70; la Twister Mersenne n'était même pas inventée jusqu'au milieu des années 90); Où vous pourriez la force brute, essayez chacune des graines aléatoires de 4,3 milliards d'aléatoires avec une vérification rapide du texte de chiffrement pour voir si des mots de dictionnaire apparaissent ou une analyse de fréquence simple (beaucoup d'espaces et e)?

27
dr jimbob

Un PRNG étant "bon" (avoir une forte aléatoire statistique garantit, disons, plus une longue période) ne dit rien de sa sécurité. Voir par exemple Discussion dans ce fil .

Le fil aborde la différence entre:

  • un peu de temps (incassable en principe tant qu'ils ne sont ni fuites ni réutilisées, mais généralement irréalistes)
  • chiffres de flux (qui peut être fait aussi sécurisé que nécessaire et peut être assez pratique)
  • Les PRNG (qui n'ont pas été conçus pour être cryptographiquement) utilisés comme chiffres de flux (généralement facilement cassés)

Ce que Phil aurait dû être utilisé était un chiffre d'écoute non seulement un vieux PRNG. MT (et les PRNG antérieures) ne conviennent pas à une utilisation en tant que chiffre d'écriture. salsa20/chacha (par Dan Bernstein) et [~ # ~] Isaac [~ # ~ ~] sont deux chiffres de flux spécifiques. Isaac est utilisé par shred . Salsa20 fait partie du programme UE Estream/Ecrypt . Bien sûr, Phil peut être pardonné de ne pas utiliser de chiffrement de cours d'eau: RC4 (qui est considéré comme brisé - sa faiblesse fait partie de ce qui rend la WeP Sous-sécurité - mais quelle est la base d'ISAAC) n'a été inventée que en 1987.

Les faiblesses cryptographiques des PRND normaux (y compris MT et Wichmann-Hill) ont conduit à des vulnérabilités par ex. TCP Attaques de numéro de séquence. Ces vulnérabilités sont parfois abordées à l'aide d'une sorte de CSPRNG différente, qui parcourt l'entropie "telle qu'elle va" (par exemple de la gigue de souris/chronométrée). Pour être approprié pour une utilisation en tant que chiffre d'écoute, un CSprngs doit disposer de toute l'entropie d'entrée disponible au début, plutôt que de le rassembler comme cela se passe. Voir les pages Wikipedia sur CSprngs et sur / dev/[u] aléatoire .

12
Misha

Je n'ai aucune idée de la méthode Phil Zimmerman à l'origine pour son cryptage, je ne peux donc rien dire à ce sujet.

Cependant, Mersenne-Twister peut être fabriqué dans un chiffre de flux "sécurisé", par exemple Cryptmt . Cryptmt a été brisé par la suite, cependant: Distinguing attaque de cryptmt . Lecture de ce document donne probablement une très bonne idée sur la façon d'attaquer Mersenne-Twister et son ILK.


En fait, j'ai fait une autre enquête. Tout d'abord, le papier que j'ai cité a été ultérieurement expurgé par les auteurs, voir la discussion ici , et C'était contre Cryptmtv1, pas cryptmtv3 qui est la version actuelle. Il n'y a pas d'attaques connues contre CryptMTv3. Le plus proche d'une attaque que j'ai trouvée est sur la sécurité du flux Cipher Cryptmt v , qui dit explicitement:

Cependant, nous n'avons trouvé aucun aléatoire sur la sortie KeysTream.

En outre, le rapport final Estream pour Cryptmt dit:

Cryptmt v3. Le Cipher Cryptmt a une conception très inhabituelle qui offre une performance très raisonnable. Bien qu'il n'y ait eu aucun résultat cryptanalytique négatif contre le chiffrement de la dernière phase d'Estream, nous sommes quelque peu préoccupés par la sécurité de la sécurité du chiffre, en particulier de la composante filtrante non linéaire, pourrait ne pas encore être aussi bien comprise que certaines des autres finalistes. Nous prévoyons que les éléments de Cryptmt continueront d'intéresser la communauté cryptographique et nous espérons que les avantages complètes de l'approche incorporée dans CryptMT V3 peuvent être évalués. Cependant, nous ne sommes actuellement pas suffisamment confiants dans la conception et la sécurité de cet algorithme pour que nous l'incluons dans le portefeuille final.

À peine un mérite négatif!

En outre, en regardant la "performance très raisonnable" mentionnée ci-dessus à eBash , il semble que CryptMTV3 offre une performance étonnante pour les messages longs (par exemple, 1,82 cycles par octet pour les messages longs), souvent seulement mieux élevé par la salsa20/8, lorsque SALSA20/8 a déjà été brisé (à peine et la salsa20/12 est toujours très sécurisé).

Je dirais donc que Cryptmt est définitivement un concurrent dans des chiffres de flux, même s'il n'a pas encore été analysé!

4
Nakedible

Je pense que la meilleure façon d'aborder cette question en tant que layperson cryptographique consiste à se détourner de la cryptographie moderne et à considérer des chiffres classiques, de papier et de crayon. Dans ce cas, le meilleur exemple à considérer est le fichier Clé de clé en cours d'exécution :

Dans la cryptographie classique, le chiffre d'exécution de la clé de course est un type de chiffrement de substitution polyalphabéphabétique dans lequel un texte, typiquement d'un livre, est utilisé pour fournir un très long keystream.

Fondamentalement, un tel chiffre prend un texte en clair et un texte de langage naturel tout aussi long (par exemple, un passage d'un roman) et crypte chaque lettre du plaintre en le déplaçant par une quantité dépendant de sa lettre de frappe correspondante.

De tels chiffres sont facilement apaisables:

[I] F (comme d'habitude) La clé de course est un bloc de texte dans une langue naturelle, la sécurité devient réellement assez médiocre, car ce texte aura des caractéristiques non aléatoires pouvant être utilisées pour aider la cryptualyse. En conséquence, l'entropie par caractère de la clé en plainte et en cours d'exécution est faible et l'opération de combinaison est facilement inversée.

Pour attaquer le chiffre, un cryptanalyste gère devinué plaintes probables le long du cipostext, soustrayez-les de chaque position possible. Lorsque le résultat est un morceau de quelque chose d'intelligible, il existe une probabilité élevée que le texte brut clair est correct pour cette position (en tant que texte actuel, ou une partie de la clé de course). Le "morceau de quelque chose d'intelligible" peut alors souvent être étendu à l'une ou l'autre extrémité, offrant ainsi un texte plus probable plus probable - qui peut à son tour être prolongé, etc. Finalement, il est probable que la source de la clé de course soit identifiée et que le gabarit est en place.

La raison pour laquelle ces attaques fonctionnent est parce que:

  1. L'attaquant a normalement des informations partielles sur le plainte. Dans la cryptographie classique, ce serait les langues et des sujets ci-dessous (qui impliquaient des fréquences de lettre et de mots et des dépendances entre lettres et mots consécutifs). Dans la cryptographie moderne, ce serait des choses comme le protocole de communication qui est crypté (par exemple, http sur SSL), les points de terminaison de la connexion (par exemple, Google), etc.
  2. Un frappe de langue naturelle a des schémas tels que, compte tenu de quelques lettres du Keystream, vous devinez les prochaines lettres avec une probabilité très élevée. Maintenant, la principale chose à observer est que Les PRNG non cryptographiques ont également cette propriété , et ils admettent donc des attaques similaires.

Cette série de blogs Décrit comment briser de simples rngs congrandentiels linéaires et la Twister Mersenne. Pour le Java.util.Random RNG, si vous avez deux résultats consécutifs ints sorties du PRNG, c'est suffisant pour reconstruire son état et prédire le reste du flux de pseudorandom (avant et vers l'avant). Par conséquent, si vous avez utilisé cela PRNG Pour générer votre clé de frappe, un attaquant qui sait ou devine huit octets consécutifs du CIPHERText peut alors appliquer une variante de l'attaque de chiffrement en cours d'exécution et la série de blogs 'PRNG - techniques de détente pour déchiffrer le reste du message.

Partie 3 de la série de blogs décrit comment vous pouvez prédire la même manière à prédire la sortie A Mersenne Twister si vous pouvez obtenir 624 mots de sortie consécutifs. Il est donc plus difficile que le générateur confistant linéaire, mais toujours vulnérable.

0
Luis Casillas

Tout simple chiffrement XOR/PRNG où la clé est utilisée pour initialiser le PRNG est vulnérable à une attaque connue en clair à la complexité 1:

  1. Crypter un clairtext au moins aussi longtemps que le ciphertext inconnu.
  2. Xor le texte annoncé avec son chiffontext. Cela vous donne le Keystream .
  3. Xor The Keystream avec l'inconnu CIPHERText: cela vous donne le texte original.

Si vous pouvez crypter un plainte constitué de tous les "0", vous pouvez sauter l'étape 2: la sortie du processus de cryptage est la touche.

Peu importe ce que PRNG vous utilisez: tout de [~ # ~ # ~] randu [~ # ~] to Fortuna est vulnérable à ce type d'attaque de récupération de frappe à clé.

Notez qu'il y a des chiffres qui utilisent "Xor le plaintext avec le frappe de frappe" comme au cœur de leur fonctionnement. Cependant, ils prennent des précautions pour empêcher cette attaque: patins uniques Ne jamais réutiliser le mot de passe, Ciphers de flux besoin de touches à usage unique ou de Utilisez des valeurs appelées Nonces , et Modes de fonctionnement de la réaction de sortie et COPHER CIPHER-CIPHER-CIPHER Utilisez la clé et une deuxième valeur à usage unique appelé A Initialiser vecteur Pour que la RNG ne soit jamais ensemencée de la même manière deux fois.

0
Mark