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@