I. Introduction II. L`algorithme RSA III. Un peu de mathématiques IV
Transcription
I. Introduction II. L`algorithme RSA III. Un peu de mathématiques IV
Tutorial sur la Cryptographie et le système de cryptage à clef publique RSA I. II. III. IV. V. VI. VII. VIII. Introduction L’algorithme RSA Un peu de mathématiques RSA tool² Application sur un Crackme Factorisation supérieure à 512 bits Outroduction Greetings I. Introduction Ce tutorial à pour but d’expliquer le fonctionnement du système de cryptage a clef publique RSA, de ses créateurs: Rivest, Shamir et Addleman. Je n’y expliquerais pas l’histoire de l’algorithme étant donné qu’une recherche sur google vous fournirait tous ces renseignements. J’ai choisi d’écrire ce tutorial car il existe certes de nombreux autres tutoriaux sur RSA mais très peu sont en français et la plupart sont peu adaptés aux débutants en la matière. Ce tutorial a été écrit dans le but d’apprendre aux novices le fonctionnement de l’algorithme RSA, et ensuite d’être capable de mettre en pratique ces connaissances nouvelles en attaquant plusieurs Crackmes utilisant RSA avec différentes implémentations. J’espère donc que vous y trouverez les réponses à vos questions, et que cet algorithme assez utilisé dans les « crypto-crackmes » ne vous laissera plus perplexe ! Bonne lecture II. L’algorithme RSA Nous allons maintenant étudier le fonctionnement de RSA dans les grandes lignes, nous verrons les calculs de plus près dans la partie suivante. RSA est un algorithme de cryptage a clef publique, il utilise deux clefs publiques (n et e) pour crypter les données ; et une clef privée (d), qui avec (n), permet de décrypter les données. Cela fonctionne selon le modèle suivant : Donc la force d’RSA réside dans le fait que tous les destinataires peuvent crypter un message avec n et e publiques, mais seul l’émetteur peut décrypter avec la clef d qui elle, est privée. III. Un peu de mathématiques L’algorithme RSA repose sur l’opération modulaire d’élévation à la puissance. On va utiliser les éléments suivants : e= clef de cryptage (publique) d= clef de décryptage (privée) n= produit de p et q (public) n est le produit de deux nombres premiers p et q. n= p.q C= message crypté M= message décrypté Les deux formules à retenir sont : C= M ^ e mod n (cryptage) M= C ^ d mod n (décryptage) Concrètement, cela veut dire quoi ? Cela veut dire que quand vous allez vous attaquer à un binaire utilisant RSA, vous allez rechercher n et e, car comme il sont publiques, ils sont utilisés pour crypter les données que vous aller rentrer dans le binaire ; mais vous ce qui vous intéresse, ce n’est pas de crypter, mais de décrypter donc vous aimeriez bien trouver d, et la nous allons avoir besoin d’un outil spécifique : RSA tool² de tE ! Cet outil va nous permettre à partir de n et e, de retrouver les deux premiers p et q en factorisant n, avec lesquels il va calculer la clef privée d. A partir du moment ou vous possédez n et d, vous pouvez décrypter les informations qui vous intéressent dans le binaire (serial par exemple…). Mais comme nous allons le voir par la suite, RSA est basé sur le fait qu’il est facile de calculer le produit de p et q, Mais qu’il est beaucoup moins aisé de factoriser n, surtout si n a été choisi très grand. IV. RSA tool² RSA tool est très simple d’utilisation, vous avez récupéré n et e et vous souhaitez retrouver d, prenons par exemple : n= CDF391132F17ED0D1D8A13E282EE39B9 e= 10001 Vous rentrez n et e et vous pressez « Factor N », désormais vous avez p et q, il ne vous reste plus qu’a presser « Calc.D » : V. Application sur un Crackme Maintenant le moment tant attendu, après la théorie, la pratique ! Nous allons nous attaquer à un crypto-keygenme pour débutants : Small RSA keygenme for newbies by Lutin Noir Il utilise une implementation de RSA trés simple; RSA-190 bits + MD5 Un petit scan sous PEiD nous indique qu’il est packé avec ASPack 2.1, je vous fais confiance pour l’unpacking ;- ) On ouvre avec Olly, ctrl-n, GetDlgItemTextA, entrée, et on tombe sur cette portion de code : Soit, nous sommes en présence de deux bignums : e=10001 n= 2F774486FD3B97FFA559687F7F9D5335CA3D16FBB60C0019 Ils vont être utilisés pour crypter notre serial. Et si l’on continue on tombe sur ceci en 0x40115F : Soit, on compare la String2 qui est le résultat du cryptage de notre serial, et la String1 qui est le résultat du cryptage de notre nom. Il faut donc verifier : Serial(crypté)=Nom(crypté) Vous l’aurez sans doute reconnu, la String1 est le Hash Md5 de votre nom, quand vous tomberez sur d’autres types de hash, utilisez le hash calculator présent dans l’archive. Donc a ce stade nous avons presque tous les éléments en main pour récupérer notre serial : e, n, Hash Md5 de notre nom. Pour utiliser notre formule de decryptage ; M= C ^ d mod n Il ne nous manque plus que d. Ouvrons donc RSA tool, on rentre n et e, on factorise, ce qui nous donne : P=69EF193F0EC20A9E57B455DB Q=72B4BF519A43852C9F9C761B D=2312552808E487A2F561E2BBEF5FB7275C2BD350491DB9A1 Désormais nous pouvons résoudre mathématiquement le problème du décryptage : On doit vérifier : Serial(crypté)=hash md5(nom) Souvenez-vous des deux formules : C= M ^ e mod n (cryptage) M= C ^ d mod n (décryptage) Donc : Serial ^ e mod n = hash md5(nom) Serial= hash md5(nom) ^ d mod n Serial= hash md5(nom) ^ 2312552808E487A2F561E2BBEF5FB7275C2BD350491DB9A1 mod 2F774486FD3B97FFA559687F7F9D5335CA3D16FBB60C0019 Cette opération se calcule aisément avec un soft tel que maple ou mathematica, ou la bigcalto. Donc pour moi : Serial= 5F9EF826E36403F76EB7CE6C22F4F4D9 ^ 2312552808E487A2F561E2BBEF5FB7275C2BD350491DB9A1 mod 2F774486FD3B97FFA559687F7F9D5335CA3D16FBB60C0019 Nom= Gu3tt@ Serial= 19E90FDA309ECE57C29FE9BA1A0A0BC82F2C76D428C5A807 VI. Factorisation supérieure à 512 bits Vous êtes normalement capable à présent d’attaquer un binaire utilisant RSA en factorisant n, mais comment ferez-vous si n est trop grand pour être factorisé avec RSA tool ? Et bien c’est ce que nous allons voir brièvement dans cette partie, avec RSA tool vous pourrez factoriser n dans un temps raisonnable jusqu'à 512 bits. Cela dépend de nombreux facteurs, et une clef bien choisie de cette taille là est incassable avec nos moyens, néanmoins il existe des failles et certaines clefs supérieures à 512 bits peuvent être cassées en utilisant un autre outil : Rsa Attacking Toolkit (RAT) Cet outil utilise plusieurs méthodes d’attaque pour de très grandes clefs. Nous allons voir deux d’entres elles sur deux clef de 1024 bits ; les attaques Weger & Wiener. Première méthode d’attaque : Weger n=9BE29093439A7855DFF27D74C7BCAC60FECA520AE10F82EB749 3BEE6D100C501C0D10088593098FCBFD476B2F3EA27961AB362076 F3640B91B761CD664A5115D38C391D6671CE9E0E1C05785A85C477 F171FE3B32359D74F599A46381974D20A5C6F873C2FCDA0BB0A573 0C5D3925FA1FF2FA8D7FDDBBF84F860D5531EADB66D e=10001 A priori n est inattaquable car 1024 bits, mais le choix des clefs pour RSA comporte ici une faille, que l’attaque Weger permet d’exploiter. Cette attaque fonctionne quand p et q sont proche l’un de l’autre, ce qui est le cas ici comme nous allons pouvoir le constater. Ouvrez RAT, sélectionnez « Weger Attack », Rentrez n et e et pressez « compute ». Le résultat s’affiche en quelques secondes : p=C7C42A9E37786E981D9F58A16FB17EF082F588903B49D3F51E63 B285E3388B41202E8136B1D86C2CA3FBBF2D04B646B3D5FFB2A33 47C23ABA64B5BB235B9F5C7 q=C7C42A9E37786E981D9F58A16FB17EF082F588903B49D3F51E63 B285E3388B41202E8136B1D86C2CA3FBBF2D00FE7316A68E649429 009018D96A5C1477CB222B d=2625CDC79C15A33930B2C0ECE12C54EAEFAF47608E2F2394C75 498B517949EA18D341873459055001559C32A8BF25379B2530FBC4E 04F2D5D9D88FBA0FAB2D9246D9CE3CC7B4CFEE32F12B64D095E0 E423C5CF7A4179C6837208513E6D9A4E3C42D26D59C62D8D040F73 27D0A5F285F13570A098B4664E13EDF3C2296A4FCC69 Deuxième méthode d’attaque : Wiener n=7D4C538A3766CA67C73534105AB812817E0E3C5F1CC3853136AA C8279D501EB51572226C060D420A70331348B6E0F1974DFB969B7B E30E31F8128EAF3A0CBE4D5C134528AD61E707AC3E6233BF5755D A4FDB63E48AC053A00D227C3A9B031FC282157CB3071ECA940131 40ABC1F886DE9EBF6ED1C39965ECF46846BF74BFC681 e=44D7A0FD047CA62C70DF9C4E4B77D22CDC7A07FF325E4302CA C6EC7F79321E325338EDFCB86F56F8E67D5458559446F9840F69E2 20326AA75FFDF60679B1A7E1EF8ABBC3DC873B3C19ED7C0A59667 AF746E4877907AB2FF9C85BBFEAF3AF8013676E05EA735EDF6AE8 D5FE8B130D7B805CC28844B921C3100FA7282DA359DBA7 Avec l’attaque Wiener nous pouvons étudier une autre faille, l’importance de la taille de d. Cette attaque fonctionne quand d est relativement petit par rapport à n, p et q. Ouvrez RAT, sélectionnez « Wiener Attack », Rentrez n et e et pressez « compute ». Le résultat s’affiche en quelques secondes : p=C107516C875698ED29319A7C8C45ADECB0A7C9A0D0616E7B2BE EF408216BD645C039EABB81615AEDA9C54636D14A83814A219705C 4B37E1403F872757396E883 q=A62C893E3DDBEEB366239A1EDBADECEC3F3D953E43D90C1206 B80B54C88B2AC203455EEB427C6ED31F5683D014E16E37D207A250 0EA436FF3D5E438C25E3FDAB d= EB192BBCF26A8C61E7B8BEBB7D7A3C6B Vous venez d’attaquer et de factoriser deux clefs RSA de 1024 bits ! VII. Outroduction Voila ce Tutorial touche à sa fin, au final il m’aura pris un certain temps à rédiger ainsi j’espère que vous l’apprécierez et qu’il vous aura appris ou aidé a comprendre les base de la RSA. Si vous avez des commentaires, des suggestions ou des questions, n’hésitez pas à m’en faire part par mail : [email protected] VIII. Greetings Tous les membres actifs de FC, Ceux à qui je dois mes connaissances en crypto : BigBang, black-eye, jB, Kerberos… Ceux que je vois sur msn : Skiller, jige, haiklr(n’oublie pas le twix^^)… Tout ceux que j’ai oubliés ! Et vous bien sûr pour avoir lu jusqu’ ici ! Gu3tt@