IUP3 - Module M64/RISC - TD : Gordon I Attaque des générateurs congruentiels linéaires Un générateur congruentiel linéaire est une suite de la forme ( X0 Xn+1 ≡ aXn + c [m] pour X0 , a, c, m quelconques. Le générateur est dit multiplicatif si c = 0. 1. Si m est premier, quelle est la période maximale d’un MLCG ? En particulier, FishmanMoore ont étudié en 1986 les générateurs modulo 231 − 1 = 950706376 et ont déterminé que celui pour a = 2147483647 est de période maximale et présente de bonnes propriétés statistiques. Que pouvez-vous dire de 2147483647 ? 2. Pour m = pe avec p premier impair, quelle est la période maximale d’un MLCG ? Enfin, il est possible de démontrer (cf. [Knuth, TAOCP, vol.2]) que si λ(m) est la période maximale d’un MLCG modulo m, alors λ(2e ) = 2e−2 pour e > 2 et que λ(m) = ppcm(λ(pe11 ) . . . λ(pekk )) si m = pe11 . . . pekk avec p1 . . . pk premiers distincts. 3. En supposant que m est connu, comment récupérer a et c dans un LCG ? 4. Maintenant m est inconnu et l’on supposera tout d’abord que c = 0. Comment casser le MLCG ? Indication : on pourra étudier xn+1 − xn . Que se passe-t-il si c 6= 0 ? II Nombres premiers robustes Afin de resister aux factorisations diverses, les nombres premiers utilisés pour fabriquer le modulo de RSA doivent vérifier un certain nombre de propriétés : • Pour résister à la factorisation par courbes elliptiques, p et q doivent être de tailles similaires et suffisamment grands. Par exemple, pour travailler sur 1024 bits ils devraient tous les deux être de taille environ 512 bits. • Pour résister à la factorisation par racines carrées de Fermat, p−q doit être relativement grand. • Pour résister aux algorithmes p − 1 et p + 1 de Pollard, ainsi que pour résister à une attaque cyclique, p et q doivent être des nombres premiers robustes (strong primes), c’est à dire qu’ils doivent chacun vérifier : – p − 1 possède un grand facteur, noté r. – p + 1 possède un grand facteur. – r − 1 possède un grand facteur. Ainsi, l’algorithme de Gordon ci-dessous, permet de générer des nombres premiers robustes : Algorithme de Gordon 1. Générer deux nombres premiers s et t de b bits. 2. Chercher r premier de la forme 2kt + 1. 3. Calculer m = (2sr−2 mod r)s − 1. 4. Retourner p le plus petit premier de la forme m + 2hrs. 1. Montrer que la sortie de l’algorithme de Gordon est un nombre premier robuste. 2. En servant de la section précédente, écrire une procédure fournissant un nombre premier robuste. De quelle autre routine avez-vous besoin ? Qu’en déduisez-vous sur les nombres premiers générés ? 1 III III.A) GPA cryptographiquement sûrs RSA Soient n et e le modulo et l’exposant d’un code RSA. Soit k = O([loglogn] + 1) un entier. Alors, connaissant c = xe mod n, découvrir les k premiers bits de x est aussi difficile que de découvrir la clef secrète associée à n et e. 1. En utilisant les procédures précédentes, en déduire une procédure prenant k en entrée et générant une suite de bits aléatoire et cryptographiquement sûre. III.B) Blum-Blum-Shub Un autre générateur sûr est celui de Blum, Blum et Shub : en prenant p et q premiers assez grands congrus à 3 modulo 4 et en posant x0 le carré d’un entier aléatoire modulo n = pq, il calcule la suite des xi+1 ≡ x2i [n]. Or, casser la suite du bit de poid faible de xi est aussi difficile que casser la factorisation. 1. Écrire une procédure générant une suite de bits aléatoires avec le générateur BBS. 2. Comment peut-on utiliser ce générateur pour fabriquer une procédure de cryptage à clef publique d’un message supposé traduit en binaire (n seul étant public) ? 3. Quel entier faut-il reconstruire pour décrypter ? p+1 4. Vérifier que si p ≡ 3[4] et si x est un carré modulo p alors y ≡ x 4 [p] est une racine carrée de x. En déduire une méthode de décryptage du système de Blum-Golwasser à l’aide de l’algorithme d’Euclide étendu et du théorème des restes chinois. 2