A Bibliographie Bibliographie 1. SIMON SINGH, Histoire des codes secrets, Livre de Poche, 2001 2. DIDIER MULLER, Les codes secrets décryptés, City Editions, 2007 3. DIDIER MULLER, Les 9 couronnes, Société jurassienne d’Emulation, 2009 Sur le WEB 1. Le site compagnon du polycopié : http://www.javmath.ch 2. Ars Cryptographica : http://www.apprendre-en-ligne.net/crypto/menu/index.html 3. La Cryptogr@phie expliquée : http://www.bibmath.net/crypto/index.php A propos de SageMath et Python 1. SageMathCloud, l’interface que nous utilisons : https://cloud.sagemath.com/ 2. SageMath, le site de référence en français (tutoriels,. . .) : http://www.sagemath.org/fr/ 3. Calcul mathématique avec Sage (un mode d’emploi en pdf) http://dl.lateralis.org/public/sagebook/sagebook-web-20130530.pdf 71 A Quelques éléments de solutions A.1 Un doigt d’algorithmique avec SageMath Exercice 1.1: factorielle (40) |815915283247897734345611269596115894272000000000 factorielle (100) | 9 3 3 2 6 2 1 5 4 4 3 9 4 4 1 5 2 6 8 1 6 9 9 2 3 8 8 5 6 2 6 6 7 0 0 4 9 0 7 1 5 9 6 8 2 6 (...) Exercice 1.2: Pas de corrigé Exercice 1.3: def successeur ( n ): n = n +1 return n Exercice 1.4: a) Il permute les 2 valeurs a et b. b) Il s’agit de : def mystere (a , b ): a=a+b b =a - b a =a - b return a , b Exercice 1.5: L1 =[]; L2 =[]; L3 =[]; L4 =[]; for i in [ -3..3]: L1 = L1 +[ i ] print L1 for i in [ -2..4]: L2 = L2 +[ i ^2] print L2 L3 = L1 + L2 print L3 for i in [0..6]: L4 = L4 +[ L1 [ i ]+ L2 [ i ]] print L4 I II ANNEXE A. QUELQUES ÉLÉMENTS DE SOLUTIONS Exercice 1.6: a) Le pseudo-code : M ult7 – liste vide k–1 tant que 7 ¨ k † 60 : ajouter 7 ¨ k dans M ult7 k “k`1 afficher M ult7 Exercice 1.7: a) Il s’agit à nouveau de calculer la factorielle : n! b) def mystere ( n ): p =1 k =1 while k < n +1: p=p*k k = k +1 return p Exercice 1.8: a) Cette fonction permet de calculer le quotient et le reste de la division de n par p b) def divmod (n , p ): j =0 while n >= p : n =n - p j = j +1 return j , n Exercice 1.9: On peut par exemple proposer : def tableau ( min , max ): for x in [ min .. max ]: print " si x = " ,x , " alors f ( " ,x , " )= " ,x ^3 - x ^2+2 Ce qui donnera : tableau ( -3 ,3) | si x = -3 alors f ( -3 )= -34 | si x = -2 alors f ( -2 )= -10 | si x = -1 alors f ( -1 )= 0 | si x = 0 alors f ( 0 )= 2 | si x = 1 alors f ( 1 )= 2 | si x = 2 alors f ( 2 )= 6 | si x = 3 alors f ( 3 )= 20 ANNEXE A. QUELQUES ÉLÉMENTS DE SOLUTIONS Exercice 1.10: c) Elle permet de calculer d) III n ÿ 1 k! k“0 def sommefacto ( n ): somme =0 for k in [0.. n ]: somme = somme +1/ factorielle ( k ) return ( somme ) e) Vous obtiendrez l’approximation d’un nombre bien connu . . . : N ( sommefacto (6)) |2.7 1805555555556 N ( sommefacto (100)) |2.718281828459 05 Exercice 1.11: a) On considère une première fonction monlog : def monlog ( n ): return log (3* n +1) qui sera ensuite appelé dans une deuxième fonction pour donner le résultat : def masomme ( min , max ): somme =0 for i in [ min .. max ]: somme = somme +1/ monlog ( i ) return N ( somme ) masomme (3 ,7) |1.84797821242055 i a – 15.859914 2i ´ 1 i“5 b) Démarche comparable. On obtient : Exercice 1.12: a) 12 ÿ def facto ( n ): if n ==0: return 1 else : return n * facto (n -1) b) Cette troisième façon d’obtenir n! est certainement la plus subtile, car à l’intérieur de la fonction elle-même, la commande factorielle est appelée. On appelle ceci une fonction récursive. c) def combi (n , p ): c = facto ( n )/( facto ( p )* facto (n - p )) return c IV ANNEXE A. QUELQUES ÉLÉMENTS DE SOLUTIONS Exercice 1.13: a) b) def syra ( n ): if n %2==0: return ( n /2) else : return (3* n +1) def suitesyra (N , nbre ): Liste =[ N ] for k in [1.. nbre ]: Liste = Liste +[ syra ( Liste [k -1])] return Liste c) Pas de corrigé proposé. . . Exercice Défi ANNEXE A. QUELQUES ÉLÉMENTS DE SOLUTIONS A.2 V Nombres premiers Exercice 2.1: a) Non b) ‚ On peut affirmer que le nombre 301 031 “ 2 ¨ 3 ¨ 5 ¨ 7 ¨ 11 ¨ 13 ` 1 ne contient pas dans sa décomposition en nombres premiers les nombres 2, 3, 5, 7, 11, 13 en reproduisant le raisonnement du théorème précédent. ‚ On ne peut par contre pas exclure que ce nombre puisse être composé de nombres premiers plus grands que 13. Et ici 301 031 “ 59 ¨ 509. Pour aller un petit peu plus loin dans cet exercice : Supposons que nous connaissions comme nombres premiers les seuls nombres 2, 3 et 5. Le procédé nous permet de calculer le nombre 2 ¨ 3 ¨ 5 ` 1 “ 31 qui est premier. On trouve d’autres nombres premiers en répétant le processus : 2 ¨ 3 ¨ 5 ¨ 31 ` 1 “ 931. Le nombre obtenu est cette fois composé : 931 “ 72 ¨ 19 et les facteurs 7 et 19 sont premiers. Notre liste est alors 2, 3, 5, 7, 19 et 31, et l’on peut recommencer autant de fois que l’on veut. Va-t-on ainsi pouvoir générer la liste de tous les nombres premiers ? Dans l’état des connaissances actuelles, on ne sait pas si cette liste contiendra effectivement tous les nombres premiers. Exercice 2.2: n “ 41 nous fournit un contre-exemple, car n2 ´ n ` 41 sera alors forcément un multiple de 41. Exercice 2.3: fonction est_premier pnq : pour k P r2 , n ´ 1s : si n mod k ““ 0 : retourner False retourner True def est_premier ( n ): for k in [2.. n -1]: if n % k ==0: return False return True Exercice 2.4: fonction est_premier2 pnq : si n ““ 0 ou n ““ 1 : retourner False sinon: si n ““ 2 : retourner True sinon: ? maxi – r n ` 1s pour k P r2 , maxis : si n mod k ““ 0 : retourner False retourner True VI ANNEXE A. QUELQUES ÉLÉMENTS DE SOLUTIONS def est_premier2 ( n ): if n ==0 or n ==1: return False else : if n ==2: return True else : maxi = int ( sqrt ( n ))+1 for k in [2.. maxi ]: if n % k ==0: return False return True Exercice 2.5: a) def euler ( n ): f = n ^2 - n +41 print est_premier2 ( f ) b) Ce qui donne euler (2) | True euler (40) | True euler (41) | False euler (42) | False c) + d) Nouvelle fonction : def euler2 ( n ): L =[] for i in [0.. n ]: f = i ^2 - i +41 if est_premier2 ( f )== False : L = L +[ i ] print ( L ) val =100*(101 - len ( L ))/101 print " Il y a donc " ,(101 - len ( L )) , " nombres premiers , soit dans : " , N ( val , digits =3) , " % des cas " Ce qui donne : euler2 (100) |[41 , 42 , 45 , 50 , 57 , 66 , 77 , 82 , 83 , 85 , 88 , 90 , 92 , 97] | Il y a donc 87 nombres premiers , soit dans : 86.1 % des cas ANNEXE A. QUELQUES ÉLÉMENTS DE SOLUTIONS VII Exercice 2.6: a) + b) On obtient (extrait) : crible (1000) | [2 , 3 , 5 , 7 , 11 , 13 , ... , 983 , 991 , 997] crible (100000) | [2 , 3 , 5 , 7 , 11 , 13 , ... , 99971 , 99989 , 99991] Exercice 2.7: fonction criblepnq : L – r0..ns Lr1s – 0 i–2 tant que i § n : j –i`i tant que j § n : Lrjs – 0 j –j`i i–i`1 tant que i † n et Lris “ 0 : i–i`1 M – rs pour j de 0 jusqu’à n : si Lrjs ‰ 0 : M – M ` rLrjss retourner M Exercice 2.8: fonction decomppnq : Div – rs P – criblepnq pour j de 0 jusqu’à card pP q ´ 1 1 : tant que n mod P rjs “ 0 : Div – Div ` rP rjss n – n{P rjs retourner Div 1. card(P), c’est à dire cardinalité de l’ensemble P exprime, en mathématiques, le nombre d’éléments de l’ensemble P . La commande SageMath correspondante est donc Len(P). VIII Exercice 2.9: ANNEXE A. QUELQUES ÉLÉMENTS DE SOLUTIONS decomp (168399) |[3 , 3 , 3 , 3 , 3 , 3 , 3 , 7 , 11] factor (168399) |3^7 * 7 * 11 Exercice 2.10: is_prime (2027651281); factor (2027651281) | False |44021 * 46061 Pierre de Fermat a réussi à obtenir cette factorisation en 1643. Ce résultat, qui est déjà impressionnant pour un ordinateur, l’est encore plus pour Fermat ! Exercice 2.11: Cette fonction permet de déterminer les n premiers nombres premiers. Par exemple : mystere (14) |[2 , 3 , 5 , 7 , 11 , 13 , 17 , 19 , 23 , 29 , 31 , 37 , 41 , 43] Exercice 2.12: Vous obtiendrez (par exemple) : | Fer (0)=3 est premier | Fer (1)=5 est premier | Fer (2)=17 est premier | Fer (3)=257 est premier | Fer (4)=65537 est premier | Fer (5)=4294967297 n ’ est pas premier | Fer ( 6 ) = 1 8 4 4 6 7 4 4 0 7 3 7 0 9 5 5 1 6 1 7 n ’ est pas premier Actuellement, on ne connaît que 5 nombres de Fermat premiers, ceux cités ci-dessus p0 § n § 4q. Un exemple possible de programmation SageMath : def Fer ( n ): for i in [0.. n ]: k =2^(2^( i ))+1 if is_prime ( k ): print " Fer ( " ,i , " )= " ,k , " est premier " else : print " Fer ( " ,i , " )= " ,k , " n ’ est pas premier " ANNEXE A. QUELQUES ÉLÉMENTS DE SOLUTIONS IX Exercice 2.13: Vous obtiendrez (par exemple) : | La | La | La | La | La | La conjecture conjecture conjecture conjecture conjecture conjecture de de de de de de Pagnol Pagnol Pagnol Pagnol Pagnol Pagnol est est est est est est vraie pour 1 vraie pour 3 vraie pour 5 vraie pour 7 fausse pour 9 vraie pour 11 Un exemple possible de programmation SageMath : def Pagnol ( n ): for i in [0.. n ]: impair =2* i +1 pagnol = impair +( impair +2)+ impair *( impair +2) if is_prime ( pagnol ): print " La conjecture de Pagnol est vraie pour " , impair else : print " La conjecture de Pagnol est fausse pour " , impair Exercice 2.14: Vous obtiendrez : | p et p +100 premiers : [3 , 7 , 13 , 31 , 37 , 67 , 73 , 79 , 97] |p , p +100 et p +200 premiers : liste vide Un exemple possible de programmation SageMath : def possible ( n ): L =[] , M =[] for i in [2.. n ]: if is_prime ( i ): if is_prime ( i +100): L = L +[ i ] if is_prime ( i +200): M = M +[ i ] if len ( L )==0: print " p et p +100 premiers : liste vide " else : print " p et p +100 premiers : " ,L if len ( M )==0: print "p , p +100 et p +200 premiers : liste vide " else : print "p , p +100 et p +200 premiers : " ,L Exercice 2.15: Je vous met au défi. . . Et si on faisait un petit concours. J’attends votre réponse par mail ;-) Exercice 2.16: Pas de réponse proposée. . . X ANNEXE A. QUELQUES ÉLÉMENTS DE SOLUTIONS A.3 Codage de César et congruence Exercice d’intro : ‚ En 2009, le 6 décembre sera un dimanche et en 2010, un lundi. Sans tenir compte des années bissextiles, on constate que 365 “ 7 ¨ 52 ` 1 Ainsi donc, la date du 6 décembre est décalée d’un jour par année. ‚ Les réponses se trouvent à la suite de la donnée. ‚ Il faut imaginer la partie « à l’envers ». Quelle doit être la configuration pour être sûr de gagner au prochain coup ? et on remonte ainsi chronologiquement jusqu’à la position de départ. (utilisez des allumettes pour vous convaincre de cette stratégie) Exercice 3.1: ‚ Oui 17 ” 5 pmod 6q car 17 “ 2 ¨ 6 ` 5 5“0¨6`5 24 “ 4 ¨ 6 ` 0 14 “ 2 ¨ 6 ` 2 ‚ Non 24 ı 14 pmod 6q car Exercice 3.2: Tous les entiers sont coloriés selon la séquence : . . . – rouge – bleu – vert – rouge – bleu – vert – rouge – . . . On partitionne ainsi les entiers en 3 familles : t. . . , ´3, 0, 3, 6, . . . u ; t. . . , ´2, 1, 4, 7, . . . u ; t. . . , ´4, ´1, 2, 5, . . . u Ce résultat se généralise quelque soit n l’entier modulo. Exercice 3.3: Par exemple, observons la situation modulo 3 : … 0 1 2 … 3a +0 3a +1 3a +2 3(a +1 )+ 3(a 0 +1 )+ 3(a 1 … +1 )+ 2 Lors d’une division par n, le reste de celle-ci est forcément un nombre compris entre 0 et n ´ 1. Ainsi quelque soit le nombre choisit, il sera congru à un nombre entier compris entre 0 et n ´ 1. Exercice 3.4: a) Non car 80 “ 4 ¨ 17 ` 12 b) Non car 103 “ 6 ¨ 17 ` 1 c) Oui car ´29 “ ´2 ¨ 17 ` 5 d) Non car ´122 “ ´8 ¨ 17 ` 14 ñ 80 ” 12 pmod 17q ñ ´29 ” 5 pmod 17q ñ ñ 103 ” 1 pmod 17q ´122 ” 14 pmod 17q ANNEXE A. QUELQUES ÉLÉMENTS DE SOLUTIONS XI Exercice 3.5: a) 1 b) 3 Exercice 3.6: a) Il suffit de comparer 18ˆ(9)%7 c) 2 avec d) 9 9ˆ(18)%7 b) Une fonction comme par exemple : def equation ( n ): for i in [0.. n ]: if 18^( i )%7== i ^(18)%7: print " n = " ,i , " verifie bien l ’ equation " permet de se convaincre que n semble devoir être un multiple de 3, non multiple de 7. Exercice 3.7: WXTXRTXHPLILOL “Toi aussi, mon fils !”, ou les derniers mots de César mourant, criant à Brutus, qu’il aimait comme son propre fils, sa douloureuse surprise de le voir parmi ses assassins : quoi de plus connu ? Si connu, en fait, que nombre d’entre nous sont encore capables de le dire en latin : tu quoque, mi fili... Dessin de John Leech dans :“The Comic History of Rome” Exercice 3.8: AVE CAESAR MORITURI TE SALUTANT Exercice 3.9: def cesar ( message_clair ): message_code =[] for lettre in message_clair : ascii = ord ( lettre ) -65 ascii_crypt =( ascii +3)%26 lettre_crypt = chr ( ascii_crypt +65) message_code = message_code +[ lettre_crypt ] message_crypt = " " . join ( message_code ) return ( message_crypt ) XII ANNEXE A. QUELQUES ÉLÉMENTS DE SOLUTIONS Exercice 3.10: À l’aide de la fonction cesar, on obtient : cesar ( " L E C R Y P T A G E E S T L A R T D E C O D E R U N M E S S A G E " ) | " OHFUBSWDJHHVWODUWGHFRGHUXQPHVVDJH " Exercice 3.11: “Il est temps de passer à autre chose” Exercice 3.12: def transl ( texte_clair , k ): message_code =[] for lettre in texte_clair : ascii = ord ( lettre ) -65 ascii_crypt =( ascii + k )%26 lettre_crypt = chr ( ascii_crypt +65) message_code = message_code +[ lettre_crypt ] message_crypt = " " . join ( message_code ) return ( message_crypt ) Exercice 3.13: “Les hommes croient en ce qu’ils désirent” (phase attribuée à César) Exercice 3.14: Pour résoudre cet exercice, vous avez deux possibilités : soit repérer les lettres les plus fréquentes, qui correspondent aux lettres les plus fréquentes de la langue française (E, A puis S), soit tenter une attaque exhaustive, c’est-à-dire essayer toutes les clés, ce qui n’est pas long ici, puisqu’il y en a que 25. Vous obtiendrez pour la clé k “ 17 : “J’aimerais mieux être le premier dans un village que le second à Rome” (phase attribuée à César) Malgré (ou à cause de) sa simplicité, cette méthode de cryptage fut encore employée par des officiers sudistes pendant la guerre de Sécession et par l’armée russe en 1915. Exercice 3.15: a) Vrai car 471 – 11 = 460 qui est bien un multiple de 23. b) Faux car 370 – 17 = 353 qui n’est pas un multiple de 13. c) Vrai car 29 – (-121) = 150 qui est bien un multiple de 5. d) Vrai. e) Vrai. (cf. exercice 3.2) f) Vrai, voici le début de la preuve que je vous laisse compléter : a ” b pmod nq ñ a “ k ¨ n ` . . . b ” c pmod nq ñ b “ k 1 ¨ . . . ` . . . * ùñ a “ k ¨ n ` pk 1 ¨ . . . ` . . . q a “ p. . . ` . . . q ¨ n ` . . . ñ a ” . . . pmod . . . q g) Vrai dans les 2 cas, il s’agit d’effectuer deux preuves très semblables à celle de la question précédente. ANNEXE A. QUELQUES ÉLÉMENTS DE SOLUTIONS XIII Exercice 3.16: a) 73 ` 231 525 ” 3 pmod 5q car : 73 ” 3 pmod 5q et 231 525 ” 0 pmod 5q b) 212 ´ 414 ” 3 pmod 5q car : 212 ” 2 pmod 5q et 414 ” ´1 pmod 5q c) 21 342 ¨ 59 ” 3 pmod 5q car : d) 26 ” 4 pmod 5q 21 342 ” 2 pmod 5q et 59 ” 4 pmod 5q e) 176 ” 26 pmod 5q ” 4 pmod 5q Exercice 3.17: a) 3527 ” 027 pmod 7q car 35 ” 0 pmod 7q ; b) 89 35 ”1 35 pmod 11q car 89 ” 1 pmod 11q ; le reste de la division par 7 est de 0. le reste de la division par 11 est de 1. c) 7720 ” p´1q20 pmod 13q car 77 ” ´1 pmod 13q ; le reste de la division par 13 est de 1. Exercice 3.18: a) 35228 ` 84501 ” 1228 ` p´1q501 pmod 17q ” 0 pmod 17q b) 2 ¨ 352009 ´ 3 ¨ 842010 ” 2 ¨ 12009 ´ 3 ¨ p´1q2010 pmod 17q ” 2 ´ 3 pmod 17q ” 16 pmod 17q Exercice 3.19: Le chiffre des unités d’un entier n est le reste de la division de n par 10. 41 5687 ” 87 pmod 10q ” 643 ¨ 8 pmod 10q ” 43 ¨ 8 pmod 10q ” 4 ¨ 8 pmod 10q ” 2 pmod 10q Le chiffre des unités est donc 2. Efficace comme démarche. . . non ? Exercice 3.20: a) x ” 3 pmod 5q b) x ” 2 pmod 5q Exercice 3.21: l’inverse de 4 pmod 5q est 4 pmod 5q car 4 ¨ 4 “ 16 – 1 pmod 5q. XIV ANNEXE A. QUELQUES ÉLÉMENTS DE SOLUTIONS Exercice 3.22: Les tables de multiplications : •Pour n “ 2 •Pour n “ 4 ¨ 0 1 2 3 ¨ 0 1 0 0 0 0 0 0 0 0 1 0 1 2 3 •Pour n “ 3 1 0 1 2 0 2 0 2 •Pour n “ 6 3 0 3 2 1 0 0 0 0 0 0 0 ¨ 0 1 2 3 4 5 0 0 0 0 ¨ 0 1 2 1 0 1 2 3 4 5 1 0 1 2 2 0 2 4 0 2 4 2 0 2 1 3 0 3 0 3 0 3 4 0 4 2 0 4 2 5 0 5 4 3 2 1 Exercice 3.23: 1) 2) 3) a) x ” 0 pmod 3q b) x ” 2 pmod 4q a) pas de solution b) pas de solution si n “ 4 : ‚ 2 ¨ 2 ” 0 pmod 4q si n “ 6 : ‚ 3 ¨ 2 ” 0 pmod 6q ‚ 2 ¨ 3 ” 0 pmod 6q ‚ 3 ¨ 4 ” 0 pmod 6q ‚ 4 ¨ 3 ” 0 pmod 6q c) x ” 4 pmod 6q c) x ” 0 ou x ” 3 pmod 6q 4) Il s’agit de la ligne 2 grisée, elle ne contient pas de 1 (inverse modulo) et pas de 3. Pour n “ 6, les 3 lignes correspondantes à 2, 3 et 4 sont également “incomplètes”. Pour n “ 8, les lignes 2, 4 et 6 seront probablement “incomplètes”. Devinez-vous pourquoi ? Vérifiez-le en constituant le tableau. 5) a) x ” 3 pmod 4q c) x ” 5 pmod 6q 1) Il s’agit de l’observer dans la table de multiplication correspondante. b) x ” 0 pmod 7q c) x ” 4 pmod 7q 1 0 1 2 3 2 0 2 0 2 3 0 3 2 1 b) pas d’inverse d) pas d’inverse Exercice 3.24: 2) a) x ” 6 pmod 7q 0 0 0 0 0 ¨ 0 1 2 3 ¨ 0 1 2 3 4 5 6 0 0 0 0 0 0 0 0 1 0 1 2 3 4 5 6 2 0 2 4 6 1 3 5 3 0 3 6 2 5 1 4 4 0 4 1 5 2 6 3 5 0 5 3 1 6 4 2 6 0 6 5 4 3 2 1 ANNEXE A. QUELQUES ÉLÉMENTS DE SOLUTIONS XV Exercice 3.25: 3 est bien l’inverse de 6 modulo 17 car 6 ¨ 3 “ 18 ” 1 pmod 17q 6 ¨ x ” 9 pmod 17q 3 ¨ 6 ¨ x ” 3 ¨ 9 pmod 17q 1 ¨ x ” 27 pmod 17q x ” 10 pmod 17q 6 ¨ x ” 11 pmod 17q 3 ¨ 6 ¨ x ” 3 ¨ 11 pmod 17q 1 ¨ x ” 33 pmod 17q x ” 16 pmod 17q Exercice 3.26: 2) a) x ” 4 pmod 6q b) x ” 3 pmod 6q 3) Ce type d’équations se manipule “naturellement” par une soustraction des deux côtés du égal. 4) a) x ” 3 pmod 6q b) pas de solution c) x ” 2 ou x ” 5 pmod 6q Table d’addition : ` 0 1 2 3 4 5 0 0 1 2 3 4 5 1 1 2 3 4 5 0 2 2 3 4 5 0 1 3 3 4 5 0 1 2 4 4 5 0 1 2 3 5 5 0 1 2 3 4 XVI ANNEXE A. QUELQUES ÉLÉMENTS DE SOLUTIONS A.4 Codage affine, algorithmes d’Euclide et Bézout Exercice 4.1: En effet, Le chiffre correspondant à C est 2. Comme 2 ¨ 3 ` 5 ” 11 pmod 26q ce dernier chiffre correspond bien à la lettre L. Exercice 4.2: a) Cette clé n’est pas bijective (one-to-one en anglais), c’est-à-dire qu’à 2 lettres différentes (par exemple A et N) correspondent une unique lettre de codage (A). Comment pourra-t-on alors définir la fonction réciproque permettant de revenir au message clair ? b) Cette clé est bijective, il n’y a pas de risque d’ambiguïté dans la correspondance des lettres en clairs et celles codées. c) À nouveau, cette clé n’est pas bijective. À éviter donc. . . d) Tableau de conversion : en clair codé 0 2 1 2 3 12 22 6 4 5 16 0 6 7 8 10 20 4 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 14 24 8 18 2 12 22 6 16 0 10 20 4 14 24 8 18 En SageMath, en considérant les clés b “ 0 et a variant de 1 à 26, on peut proposer def tableau ( clefa ): Liste =[] for a in [1.. clefa ]: for i in [0..25]: Liste = Liste +[ a * i %26] print " On obtient " , Liste , " pour a = " ,a Liste =[] e) a P t1 ; 3 ; 5 ; 7 ; 9 ; 11 ; 15 ; 17 ; 19 ; 21 ; 23 ; 25u. Contrairement aux autres, ces 12 nombres n’ont pas de facteur commun avec 26. f) Le nombre b agissant comme une translation, on peut toujours « revenir en arrière » par une translation de ´b. g) Il y a 12 possibilités de choix pour a et 26 pour b. Ceci donne donc 12 ¨ 26 “ 312 possibilités auxquelles il est judicieux d’enlever les clés a “ 1, b “ 0. Exercice 4.3: “DCFDODRGDFZG” ANNEXE A. QUELQUES ÉLÉMENTS DE SOLUTIONS XVII Exercice 4.4: Une fonction possible : def affine ( message_clair ,a , b ): message_code =[] for lettre in message_clair : ascii = ord ( lettre ) -65 ascii_crypt =( a * ascii + b )%26 lettre_crypt = chr ( ascii_crypt +65) message_code = message_code +[ lettre_crypt ] message_crypt = " " . join ( message_code ) return ( message_crypt ) Exercice 4.5: “HVPWDGWINDOVKVIODIVNDHQTGWVDGVIXKXVIV” Exercice 4.6: Dans l’état de nos connaissances en programmation, il n’y a pas d’autres manières que de tenter une attaque exhaustive (appelé aussi attaque par force brute) en testant les 12 ¨ 26 possibilités. Il reste à trouver visuellement parmi les 312 résultats affichés, celui qui correspond à une phrase cohérente. Il s’agissait de la clé de décryptage a “ 3 et b “ 21 pour la phrase : “BRAVOCENESTPASFACILE” Une fonction SageMath possible : def attaque ( message ): for a in [1 ,3 ,5 ,7 ,9 ,11 ,15 ,17 ,19 ,21 ,23 ,25]: for b in [0..25]: print affine ( message ,a , b ) , " avec a = " ,a , " et b = " ,b Cette fonction attaque appelle donc la fonction affine que vous avez programmé et utilisé dans les exercices précédents. Exercice 4.7: a) 7 b) 13 c) 6 d) 15 Exercice 4.8: a) Oui, car le PGDC(122, 49) = 1 b) Non car le PGDC(352, 33) = 11 Exercice 4.9: PGDC(4539, 1958) = 89. La méthode par décomposition en facteurs premiers montre déjà ici ses limites. Les calculs sont relativement longs et fastidieux. La suite des éléments théoriques nous fournira un moyen beaucoup plus élégant : L’algorithme d’Euclide. XVIII ANNEXE A. QUELQUES ÉLÉMENTS DE SOLUTIONS Exercice 4.10: a) 21 b) 167 c) 1 les nombres 1600 et 259 sont donc premiers entre eux. Exercice 4.11: Oui, car le PGDC(5617, 1515) = 1 Exercice 4.12: def reste (a , b ): Liste =[] reste = a % b while reste < >0: a=b b = reste Liste = Liste +[ reste ] reste = a % b Liste = Liste +[0] return Liste Exercice 4.13: def euclide (a , b ): reste = a % b while reste < >0: quotient = a // b reste = a % b print a , " = " , quotient , " * " ,b , " + " , reste a=b b = reste print " le PGDC vaut donc " ,a Exercice 4.14: Il s’agit d’une fonction récursive, c’est-à-dire qu’à l’intérieur de sa programmation, elle contient un appel à elle-même. On obtient alors : mystere (4539 ,1958) |89 qui correspond au PGDC des 2 nombres. Programmé dans SageMath : def mystere (a , b ): if b ==0: resultat = a else : r=a%b resultat = mystere (b , r ) return ( resultat ) ANNEXE A. QUELQUES ÉLÉMENTS DE SOLUTIONS XIX Exercice 4.15: a) algorithme d’Euclide : 383 “ 3 ¨ 127 ` 2 127 “ 63 ¨ 2 ` 1 (1) (2) 2“2¨1`0 Le dernier reste non nul vaut bien 1 ‚ D’après l’égalité (2), on peut écrire : 1 “ 127 ´ 63 ¨ 2 (3) ‚ D’après l’égalité (1), on peut écrire : 2 “ 383 ´ 3 ¨ 127 que l’on substitue dans (3) Ainsi 1 “ 127 ´ 63 ¨ p383 ´ 3 ¨ 127q “ ´63 ¨ 383 ` 190 ¨ 127. On obtient alors : u “ ´63 et v “ 190. b) Les valeurs proposées vérifient également 383u ` 127v “ 1. c) Le couple pu , vq obtenu à l’aide de l’algorithme d’Euclide fournit une solution de l’équation, mais cette solution n’est pas unique. Exercice 4.16: a) u “ 7 et v “ ´30 b) u “ ´9 et v “ 13 puis c) u “ 8 et v “ ´23 u1 “ ´9 ¨ 5 “ ´45 et v 1 “ 13 ¨ 5 “ 65 Exercice 4.17: b) On utilise le même type de tableau que la partie a) • Initialisation : 1534 “ 1 ¨ 1534 ` 0 ¨ 180 180 “ 0 ¨ 1534 ` 1 ¨ 180 Euclide p1 ; 0q p0 ; 1q Reste • 1534 “ 8 ¨ 180 ` 94 94 “ 1534 ´ 8 ¨ 180 • 180 “ 1 ¨ 94 ` 86 86 “ 180 ´ 1 ¨ 94 • 86 “ 10 ¨ 8 ` 6 6 “ 86 ´ 10 ¨ 8 • 94 “ 1 ¨ 86 ` 8 • 8“1¨6`2 • 6“3¨2`0 8 “ 94 ´ 1 ¨ 86 2“8´1¨6 reste de zéro (1 ; 0q ´ 8p0 ; 1q p1 ; ´8q p1 ; ´8q ´ 1p´1 ; 9q p2 ; ´17q p0 ; 1q ´ 1p1 ; ´8q p´1 ; 9q ´ 10p2 ; ´17q p´1 ; 9q p´21 ; 179q p2 ; ´17q ´ 1p´21 ; 179q p23 ; ´196q Ainsi u “ 23 et v “ ´196 c) u “ ´20 et v “ 121 d) Voici une programmation SageMath. Mais ne le regardez pas trop vite. . . Le but est que vous programmiez vous-même cette fonction !! XX ANNEXE A. QUELQUES ÉLÉMENTS DE SOLUTIONS def bezout (a , b ): U =[1 ,0] V =[0 ,1] i =1 reste = a % b while reste < >0: quotient = a // b i = i +1 newu = U [i -2] - quotient * U [i -1] newv = V [i -2] - quotient * V [i -1] U = U +[ newu ] V = V +[ newv ] a=b b = reste reste = a % b print " u = " ,U [ i ] , " et v = " ,V [ i ] Exercice 4.18: a) PGDC(322,17) = 1 b) PGDC(512,28) = 4 c) PGDC(1321,314) = 1 p´1q ¨ 322 ` 19 ¨ 17 “ 1 p´3q ¨ 512 ` 55 ¨ 28 “ 4 29 ¨ 1321 ` p´122q ¨ 314 “ 1 Exercice 4.19: Soit P “ 2k l’équivalent numérique pair d’une première lettre et P 1 “ 2k 1 l’équivalent numérique pair d’une deuxième lettre. On obtient : Mais aussi : C ” 13 ¨ p2kq ` b pmod 26q c’est-à-dire C ” b pmod 26q C 1 ” 13 ¨ p2k 1 q ` b pmod 26q c’est-à-dire C 1 ” b pmod 26q Ces deux lettres seront donc codées de la même façon. Et ceci sera toujours vrai quelque soit le choix de ces lettres à équivalent numérique pair. Exercice 4.20: a) Il suffit de montrer que a ¨ a1 ” 1 pmod 26q. Ce qui est bien le cas ici. b) b1 “ ´a1 ¨ b “ ´19 ¨ 22 “ ´418 ” 24 pmod 26q c) 11 ¨ 2 ` 22 “ 44 ” 18 pmod 26q 19 ¨ 18 ` 24 “ 366 ” 2 pmod 26q Exercice 4.21: a) a1 “ 11 et b1 “ 19 b) Il s’agit de la lettre I. c) “IMUSTBEGONEANDLIVEORSTAYANDDIE” Roméo et Juliette : Act 3, Scene 5 de William Shakespeare ANNEXE A. QUELQUES ÉLÉMENTS DE SOLUTIONS Exercice 4.22: Il s’agit de : XXI “ETSIONNECONNAITPASLACLEF” avec les clés a1 “ 17 et b1 “ 25. Exercice 4.23: Il s’agit de résoudre le système : # 12 ” 4a ` b 6 ” 18a ` b pmod 26q pmod 26q Vous obtiendrez les clés a “ 7 et b “ 10. Exercice 4.24: Il s’agissait des clés de décryptage : a1 “ 19 et b1 “ 9. Sur la tombe de Diophante, on pouvait lire : Diophante d’Alexandrie Mathématicien grec (200 – 284 env.) Passant, c’est ici le tombeau de Diophante C’est lui qui t’apprend le nombre d’années qu’il a vécu Sa jeunesse en a occupé la sixième partie Puis sa joue se couvrit d’un premier duvet pendant la douzième Il passa encore le septième de sa vie avant de prendre une épouse et, cinq ans plus tard, il eut un bel enfant qui après avoir atteint la moitié de l’âge final de son père, périt d’une mort malheureuse Son père lui survécut quatre années De tout ceci, déduis son âge Pourrez-vous résoudre cette énigme célèbre, c’est-à-dire l’âge de sa mort ? XXII ANNEXE A. QUELQUES ÉLÉMENTS DE SOLUTIONS Exercice 4.25: a) Au moins 9 fois (c’est-à-dire r17{2s ` 1) b) Au moins rm{ns ` 1 fois c) def vigenere ( message , cle ): message_code =[] cle_code =[] new_cle =[] new_message =[] # liste ascii du message for lettre in message : ascii = ord ( lettre ) -65 message_code = message_code +[ ascii ] # liste ascii de la cle for lettre in cle : ascii = ord ( lettre ) -65 cle_code = cle_code +[ ascii ] # adapter la taille de la cle for i in [1.. int ( len ( message_code )/ len ( cle ))+1]: new_cle = new_cle + cle_code # ajouter les 2 listes et conv . en ascii for i in [0.. len ( message_code ) -1]: ascii =( message_code [ i ]+ new_cle [ i ])%26+65 new_message = new_message +[ chr ( ascii )] # conversion en chaine de caracteres Message_crypt = " " . join ( new_message ) return Message_crypt Exercice 4.26: Il suffit de remplacer un + par un – dans la fonction précédente. Pour rappel : vous trouverez le lien de cet excellent site directement sur : www.javmath.ch ANNEXE A. QUELQUES ÉLÉMENTS DE SOLUTIONS A.5 XXIII La cryptographie à clé publique : RSA Exercice 5.1: def invmod (d , n ): if gcd (d , n ) < >1: return " doivent etre premiers entre eux !! " else : e =0; i =1 while e ==0: if i * d % n ==1: e=i i = i +1 return ( e ) Exercice 5.2: a) 8 Exercice 5.3: a) 69 car b) 3336670 5^51%97 |69 b) 7 c) Le calcul de 123456789ˆ987654321%11 risque bien de vous faire perdre patience. . .. N’hésitez pas à l’interrompre avec le bouton : ⌅ Stop XXIV ANNEXE A. QUELQUES ÉLÉMENTS DE SOLUTIONS Exercice 5.4: On peut proposer par exemple : def controle (p ,q ,e , M ): if is_prime ( p ) and is_prime ( q ): print " p et q premiers : OUI " else : print " p et q premiers : NON " n=p*q print " n : " ,n phi_n =( p -1)*( q -1) print " phi ( n ): " , phi_n if gcd (e , phi_n ): print " e et phi ( n ) premiers entre eux : OUI " else : print " e et phi ( n ) premiers entre eux : NON " d = inverse_mod (e , phi_n ) print " cl é priv é e : " ,d M_prime = power_mod (M ,e , n ) print " message code : " , M_prime new_M = power_mod ( M_prime ,d , n ) print " message decode : " , new_M if new_M == M : print " Tout est en ordre ; -) " else : print " Il y a comme un probleme : -/ " qui fournira : controle (9760959751111112041 886431 ,8345523998678341256491111 , 45879256903 ,12345678909876540106) | p et q premiers : OUI |n: 81460323853031154412157864943449033559900223014841 | phi ( n ): 8 1 4 6 0 3 2 3 8 5 3 0 3 1 1 5 4 4 1 2 1 5 7 8 4 6 8 3 6 9 6 5 2 8 3 7 7 0 4 4 6 9 2 4 6 3 7 3 0 0 | e et phi ( n ) premiers entre eux : OUI | cl é priv é e : 6 1 4 2 4 9 3 1 6 5 1 8 6 6 1 7 1 4 5 0 2 6 7 5 8 9 9 9 2 1 8 0 1 7 5 6 1 2 1 6 7 4 7 5 7 4 0 1 6 7 | message code : 6 2 5 1 7 6 5 1 0 6 2 6 0 5 9 1 1 0 9 7 9 4 0 7 4 6 0 3 6 1 9 9 0 0 2 3 4 5 5 5 2 6 6 9 4 6 4 8 5 | message decode : 12 3 4 56 78 90 9876540106 | Tout est en ordre ; -)} Exercice 5.5: a) M 1 ” M e pmod nq “ 8341481710297804401 b) pM 1 qd pmod nq “ 12345678909876540106. (Ok ! !) ANNEXE A. QUELQUES ÉLÉMENTS DE SOLUTIONS XXV Exercice 5.6: ‚ p “ 11, q “ 23, Ïpnq “ 220, d “ 147 ‚ 214147 ” 14 pmod 253q Ñ O ‚ 157147 ” 20 pmod 253q Ñ U ‚ 6147 ” 8 pmod 253q Ñ I Exercice 5.7: a) 1420083 ” 124 pmod 253q. La clé d, obtenue dans l’exercice précédent étant de 147, on obtient : 124147 ” 75 pmod 253q qui ne correspond pas à ce qui est attendu ! b) On obtient les valeurs suivantes : ‚ n “ 5147 ¨ 7351 “ 37835597 ; ‚ Ïpnq “ 5146 ¨ 7350 “ 37823100 ; ‚ PGDC(37823100 ; 307) = 1 ; ‚ 142008307 ” 36481808 pmod 37835597q. c) d “ 34743043 est l’inverse de e modulo Ïpnq et on obtient : 3648180834743043 ” 142008 pmod 37835597q. Exercice 5.8: a) Il s’agit de 1377 1565 508 1913 M M 1 “ M 19 pmod 2077q JE 238 1377 TA 494 1565 IM 220 508 EA 104 1913 b) En factorisant 2077, on obtient p “ 31 et q “ 67 donc Ïpnq “ 1980 et finalement d “ 1459. M1 M “ pM 1 q1459 pmod 2077q 3 43 1 ¨ 26 ` 17 BR 261 21 0 ¨ 26 ` 21 AV 833 364 14 ¨ 26 ` 0 O(A) BRAVO !! Exercice 5.9: Pas de corrigé. Exercice 5.10: Votre moyenne est 5 car : p “ 5, q “ 11, Ïpnq “ 40, d “ 23 et finalement 2523 ” 5 pmod 55q. XXVI ANNEXE A. QUELQUES ÉLÉMENTS DE SOLUTIONS Exercice 5.11: a) 42510 d) 252210 b) 901910 e) 195810 c) 12410 b) 1107 c) 158A11 Exercice 5.12: a) 111111112 Exercice 5.13: a) 1010002 b) 207 Exercice 5.14: Pas de réponse proposée Exercice 5.15: a) OUI26 b) 916510 Exercice 5.16: a) 2110123 ñ 59910 c) B2612 ñ 161410 b) 110111012 ñ 22110 d) 119911 ñ 156010