Advertisement
xdxdxd123

Untitled

May 22nd, 2017
129
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 35.52 KB | None | 0 0
  1. www.hakin9.org hakin9 Nº 3/2007 56
  2. Fiche technique
  3. N
  4. ous allons étudier dans le présent ar-
  5. ticle les travaux internes de RSA et la
  6. possibilité de lancer des attaques dites
  7. par factorisation. Nous verrons comment les
  8. clés de l'algorithme RSA ainsi que la procédure
  9. de l'attaque permettent d'obtenir la clé privée
  10. correspondant à la clé publique attaquée.
  11. Afin de bien comprendre et réutiliser le
  12. présent article, le lecteur doit maîtriser les prin-
  13. cipes fondamentaux liés à la programmation
  14. en C et savoir manier certains concepts ma-
  15. thématiques. Vous trouverez dans le tableau
  16. des références des sources de documentation
  17. complémentaires pour de plus amples rensei-
  18. gnements sur le sujet.
  19. Tous les exemples ont été développés et
  20. testés sur un système GNU/Linux.
  21. Cryptographie à clé publique
  22. Contrairement à la cryptographie à clé privée, où
  23. une seule clé est utilisée pour crypter et décryp-
  24. ter les messages, la cryptographie à clé publique
  25. repose sur deux clés, concept également appelé
  26. biclé. Ces deux clés sont respectivement dé-
  27. nommées clé publique et clé privée. Afin de cryp-
  28. ter la communication choisie, l'utilisateur aura
  29. besoin des deux clés. Alors que la clé privée
  30. doit demeurer confidentielle, la clé publique peut
  31. être mise à la disposition de quiconque désirant
  32. envoyer des messages cryptés à l'utilisateur.
  33. Un message crypté à l'aide d'une clé publique
  34. ne peut être décrypté qu'à l'aide de la clé privée
  35. correspondante. Or, pour ce faire, il faut aborder
  36. certains problèmes d'ordre mathématique. Notre
  37. choix s'est porté sur le système RSA en raison
  38. de la décomposition en produit de facteurs pre-
  39. miers, ou factorisation, de gros chiffres.
  40. Les débuts de la cryptographie à clé publique
  41. remonte à la publication de Diffie et Hellman en
  42. 1976. Dans cette publication, les deux chercheurs
  43. ont introduit un protocole capable d'autoriser
  44. l'échange de certaines informations sur un canal
  45. Attaque par factorisation
  46. contre RSA
  47. Daniel Lerch Hostalot
  48. Degré de difficulté
  49. RSA représente sans conteste le système cryptographique à clé
  50. publique le plus utilisé de nos jours qui est parvenu à survivre
  51. aux critiques des spécialistes en cryptographie pendant plus d'un
  52. quart de siècle. La fiabilité de cet algorithme repose notamment
  53. sur la difficulté de décomposer en produit de facteurs premiers
  54. de gros chiffres, de l'ordre des nombres décimaux à 100 chiffres.
  55. Cet article explique…
  56. • Fonctionnement de RSA,
  57. • Techniques permettant de lancer des attaques
  58. par factorisation.
  59. Ce qu'il faut savoir…
  60. • Principes fondamentaux de la programmation
  61. en C.
  62. Attaque par factorisation contre RSA
  63. hakin9 Nº 3/2007 www.hakin9.org 57
  64. non sécurisé. Peu de temps après, en
  65. 1977, les chercheurs Rivest, Shamir et
  66. Adleman ont proposé leur propre sys-
  67. tème de cryptographie baptisé RSA,
  68. aujourd'hui le plus largement utilisé au
  69. monde.
  70. Toujours en 1977, des documents
  71. ont démontré que les cryptographes
  72. du British Government Group pour la
  73. Sécurité des Communications Elec-
  74. troniques (GSEC) connaissaient déjà
  75. ce type de cryptographie en 1973.
  76. Système
  77. cryptographique RSA
  78. Comme nous venons de le dire précé-
  79. demment, la sécurité du système RSA
  80. repose sur la difficulté mathématique
  81. de décomposer en produit de fac-
  82. teurs premiers, ou factoriser, de gros
  83. chiffres. Factoriser un nombre con-
  84. siste à trouver les nombres premiers
  85. (facteurs) dont le produit donne pour
  86. résultat le nombre en question. Si, par
  87. exemple, vous souhaitez factoriser le
  88. nombre 12, vous allez obtenir un résul-
  89. tat de 2·2·3. La méthode la plus simple
  90. pour trouver les facteurs premiers d'un
  91. nombre n consiste à diviser ce dernier
  92. par l'ensemble des nombres premiers
  93. inférieurs à n. Quoique extrêmement
  94. simple, cette procédure peut se révéler
  95. très fastidieuse lorsque vous souhaitez
  96. factoriser de gros chiffres.
  97. Procédons à quelques calculs pour
  98. vous donner une idée. Une clé de 256
  99. bits (à l'instar de celle que nous allons
  100. attaquer ultérieurement) comprend
  101. près de 78 chiffres décimaux (1078).
  102. Dans la mesure où sur les clés du sys-
  103. tème RSA, ce nombre ne possède en
  104. règle générale que deux facteurs pre-
  105. miers, chacun de ces facteurs auront
  106. plus ou moins 39 chiffres. Autrement
  107. dit, pour factoriser le nombre en ques-
  108. tion, il faudra le diviser par l'ensemble
  109. des nombres premiers à 39 chiffres
  110. ou moins (1039). En supposant que
  111. seul 0,1% des nombres soient des
  112. nombres premiers, il faudra procéder
  113. à près de 1036 divisions. Imaginons
  114. maintenant que vous disposiez d'un
  115. système capable de réaliser 1020
  116. divisions par seconde. Dans ce cas,
  117. vous passerez quelques 1016 secon-
  118. des à attaquer la clé, autant dire plus
  119. de 300 millions d'années, soit un mil-
  120. lion l'âge de l'univers. Heureusement,
  121. nous serons bien plus rapide grâce
  122. à l'exemple décrit ci-après.
  123. Analysons désormais le fonction-
  124. nement du système RSA. Il faut com-
  125. mencer par générer les clés publiques
  126. et privées (vous trouverez dans le
  127. tableau ci-joint quelques illustrations
  128. de concepts mathématiques particu-
  129. lièrement intéressants). Pour ce faire,
  130. il est nécessaire de bien respecter les
  131. étapes comme suit.
  132. Étape 1
  133. Il faut tout d'abord choisir deux
  134. nombres premiers p et q de manière
  135. aléatoire, puis les multiplier pour ob-
  136. tenir n : n
  137. p q = ⋅ . Si vous choisissez
  138. par exemple, p = 3 et q =11 vous
  139. obtiendrez n = 33 .
  140. Étape 2
  141. Il faut ensuite calculer l'indicateur
  142. (ou fonction indicatrice) d'Euler
  143. à l'aide de la formule suivante :
  144. Φ Φ n p q p q ( ) = ⋅ ( ) = − ( ) ⋅ − ( ) 1 1 . Dans
  145. cet exemple, vous devez obtenir
  146. Φ n ( ) = 20 .
  147. Étape 3
  148. Vous trouvez un exposant de cryp-
  149. tage (que vous allez utiliser par la
  150. suite pour le cryptage) que vous
  151. allez appeler e. Ce nombre doit être
  152. compatible avec mcd e n ,Φ ( )
  153. ( ) =1 Un
  154. excellent exemple serait : e = 3 dans
  155. Concepts mathématiques
  156. Diviseur ou facteur
  157. Un nombre entier a désigne un diviseur (ou facteur) de b lorsqu'il existe d'autres nom-
  158. bres entiers c compatibles avec b a c = ⋅ . Exemple : 21 7 3 = ⋅
  159. Nombres premiers et nombres composés
  160. Un nombre entier est dit premier si ce dernier ne peut être divisé que par un et lui-
  161. même. Un nombre entier est dit composé lorsqu'il ne rentre pas dans la catégorie des
  162. nombres premiers.
  163. Exemple : 21 7 3 = ⋅ est un nombre composé, alors que 7 et 3 sont des nombres
  164. premiers.
  165. Factorisation
  166. La factorisation d'un nombre entier n consiste à décomposer ce dernier en produit
  167. de ses facteurs premiers : n
  168. p p p
  169. e e
  170. i
  171. e i
  172. = ⋅ ⋅⋅⋅
  173. 1 2
  174. 1 2
  175. où p i représentent des nombres premiers
  176. et e i représentent des nombres entiers positifs. Exemple : 84 peut être factorisé en
  177. 21 2 3 7
  178. 2
  179. = ⋅ ⋅
  180. .
  181. Module
  182. Un module désigne et représente a b mod le reste de la division entière de a
  183. entre b .
  184. Exemple : 5 3 2 mod = , 10 7 3 mod = , 983 3 2 mod = , 1400 2 0 mod = .a et b sont des
  185. modules de n : b a n ≡ ( ) mod si leur différence (a-b) est un multiple den.
  186. Diviseur commun maximum
  187. Est désigné par diviseur commun maximum de deux nombres entiers a et b , re-
  188. présentée sous forme de mcd a b , ( ) , le nombre entier le plus élevé pouvant diviser
  189. a et b .
  190. Exemple : mcd mcd 42 35 2 3 7 5 7 7 , , ( ) = ⋅ ⋅ ⋅ ( ) = Algorithme euclidien
  191. L'algorithme euclidien permet de calculer le diviseur commun maximum de deux
  192. nombres selon mcd a b mcd b r , , ( ) = ( ) , où a b > > 0 représentent des nombres entiers,
  193. et r le reste de la division entre a et b Exemple : mcd 1470 42 , ( )
  194. (1) 1470 42 35 1470 42 42 35 mod , , = → ( ) = ( ) mcd mcd
  195. (2) 42 35 7 42 35 35 7 mod , , = → ( ) = ( ) mcd mcd
  196. (3) 35 7 0 7 0 7 mod , = → ( ) = mcd Indicateur (ou fonction indicatrice) d'Euler
  197. Soit n ≥ 0 représentant Φ n ( ) le nombre d'entiers compris dans l'intervalle 1,n
  198. [ ]
  199. étant premiers* avec n . Pour n
  200. p q = ⋅ , Φ n
  201. p q ( ) = − ( ) − ( ) 1 1 .
  202. *Deux entiers a et b représentent les nombres premiers entre eux (ou co-pre-
  203. mier) si mcd a b , ( ) =1 .
  204. hakin9 Nº 3/2007 www.hakin9.org
  205. Fiche technique
  206. 58
  207. la mesure où il ne possède aucun
  208. facteur commun avec 20 (facteurs
  209. 2 et 5).
  210. Étape 4
  211. Il faut ensuite calculer un exposant
  212. de décryptage que vous allez ap-
  213. peler d (il vous servira plus tard
  214. au décryptage). Ce nombre doit
  215. correspondre à 1< < ( ) d n Φ de sorte
  216. que e d n ⋅ ≡ ( )
  217. ( ) 1 modΦ
  218. . Autrement dit,
  219. d sera un nombre compris entre 1 et
  220. 20 qui, multiplié par 3 et divisé par 20
  221. donnera 1. L'exposant de décryptage
  222. d peut alors être le nombre 7.
  223. Clés
  224. La clé publique de l'utilisateur appar-
  225. tient au couple (n,e), soit dans notre
  226. exemple (33, 3), alors que la clé
  227. privée correspond à d, soit 7. Logi-
  228. quement, les nombres p, q et d Φ n ( )
  229. doivent demeurer confidentiels.
  230. (Dé)cryptage
  231. Arrivé à ce stade, il suffit de pro-
  232. céder au cryptage à l'aide de
  233. C M n
  234. e
  235. = mod
  236. puis au décryptage
  237. grâce à M
  238. C n
  239. d
  240. = mod
  241. . Si nous sup-
  242. posons que le message est M = 5 ,
  243. le chiffrage correspondant sera alors
  244. C = = 5 33 26
  245. 3 mod
  246. . Afin de décrypter
  247. le message, il suffira d'appliquer
  248. M = = 26 33 5
  249. 7
  250. mod
  251. .
  252. Comme nous l'avons mentionné
  253. en début d'article, et comme le
  254. démontre la procédure ci-dessus,
  255. la sécurité des systèmes cryptogra-
  256. phiques repose sur le nombre n. En
  257. d'autres termes, si un pirate capable
  258. d'accéder à la clé publique parvient
  259. à factoriser n en obtenant p et q, il lui
  260. suffit alors d'appliquer les formules
  261. précédentes pour obtenir la clé pri-
  262. vée tant convoitée.
  263. Compétition de
  264. factorisation RSA
  265. La Compétition de Factorisation
  266. RSA est un concours financé par les
  267. Laboratoires RSA au cours duquel
  268. d'importants prix sont décernés aux
  269. informaticiens capables de factoriser
  270. certains nombres particulièrement
  271. importants. Pour parvenir à connaî-
  272. tre le statut des systèmes de facto-
  273. risation, il faut savoir quelle longueur
  274. de clé va être nécessaire pour garan-
  275. tir la sécurité du système RSA.
  276. À l'heure où nous rédigeons le
  277. présent article, le record de factori-
  278. sation est RSA-640, nombre à 193
  279. chiffres décomposé en produits de
  280. facteurs premiers le 2 novembre
  281. 2005 par F. Bahr et al. La prochaine
  282. compétition portera sur RSA-704,
  283. avec un prix de 30 000 dollars.
  284. La Compétition de Factorisation
  285. RSA demeure sans aucun doute le
  286. moyen le plus pratique de se faire
  287. une idée sur l'état actuel des systè-
  288. mes de factorisation.
  289. Vous trouverez dans le tableau
  290. exposé à la fin du présent article les
  291. compétitions actuellement organi-
  292. sées en la matière.
  293. Attaque par
  294. factorisation
  295. Nous allons présenter ci-après un
  296. exemple d'attaque par factorisation
  297. dirigée contre une clé du système
  298. RSA. Afin de rendre les calculs plus
  299. rapides, nous utiliserons une clé
  300. bien plus courte que les clés norma-
  301. lement utilisées, afin d'en simplifier la
  302. décomposition en facteurs premiers.
  303. Même si cet exemple ne se conforme
  304. pas à la réalité, il permettra toutefois
  305. d'analyser les éléments constituant
  306. une attaque complète.
  307. Il faut commencer par créer un
  308. environnement de travail au moyen
  309. de l'outil OpenSSL, chargé de géné-
  310. rer les clés nécessaires et de crypter
  311. le message que vous allez ensuite
  312. utiliser sous forme de cible pour
  313. votre attaque. Il faudra ensuite facto-
  314. riser le module n pour obtenir la clé
  315. privée, et enfin décrypter le message
  316. en question.
  317. OpenSSL et RSA
  318. OpenSSL est un outil cryptographi-
  319. que open source particulièrement
  320. pratique. Dans la partie consacrée
  321. aux références, vous trouverez
  322. toutes les informations nécessaires
  323. pour le télécharger, mais sachez que
  324. la plupart des distributions GNU/
  325. Linux le proposent par défaut. Nous
  326. allons donc l'utiliser ici pour configu-
  327. rer un environnement de test dans
  328. lequel l'attaque sera lancée.
  329. La première étape consiste
  330. à générer un couple de clés pour
  331. le cryptage et le décryptage. Nous
  332. allons générer des clés de 256 bits,
  333. certes trop courtes pour maintenir un
  334. niveau de sécurité sur nos communi-
  335. cations, mais largement suffisantes
  336. pour illustrer nos propos.
  337. Nous générons donc une paire
  338. de clés, en maintenant notre clé pri-
  339. vée confidentielle.
  340. # Génération d'une paire de clés à 256
  341. bits du système RSA
  342. openssl genrsa -out rsa_privkey
  343. .pem 256
  344. cat rsa_privkey.pem
  345. -----DEBUT DE LA CLE PRIVEE-----
  346. MIGqAgEAAiEA26dbqzGRt31qincXxy
  347. 4jjZMMOId/DVT8aTcq8aam
  348. DiMCAwEAAQIh
  349. AmvT1oXa/rxF3mrVLrR/RS7vK1WT
  350. sQ5CWl/+37wztZOpAhEA+4jg
  351. EkfalFH+0S+1
  352. IPKD5wIRAN+NmMH4AF0B8jz
  353. MAXHHXGUCEGRpRZnGmV
  354. kwSlrTgqj+Zu0CEA7v7CQR
  355. yRxt09zCGNqcYo0CEDEW7mvoz
  356. MYYLC5o+zgfV4U=
  357. -----FIN DE LA CLE PRIVEE RSA-----
  358. Après cette étape, nous sauvegar-
  359. dons la clé publique dans un fichier.
  360. Il s'agit de la clé que nous allons
  361. publier afin de permettre à quicon-
  362. que de nous envoyer des messages
  363. cryptés.
  364. Listing 1. Transformation d'un
  365. chiffre hexadécimal en chiffre
  366. décimal
  367. #include <stdio.h>
  368. #include <openssl/bn.h>
  369. int main (int argc, char **argv) {
  370. BIGNUM *n = BN_new();
  371. if (argc!=2) {
  372. printf ("%s <hex>\n",
  373. argv[0]);
  374. return 0;
  375. }
  376. if(!BN_hex2bn(&n, argv[1])) {
  377. printf("error:
  378. BN_hex2bn()");
  379. return 0;
  380. }
  381. printf("%s\n", BN_bn2dec(n));
  382. BN_free(n);
  383. }
  384. Attaque par factorisation contre RSA
  385. hakin9 Nº 3/2007 www.hakin9.org 59
  386. # Sauvegarde de la clé publique sur un
  387. fichier
  388. openssl rsa -in rsa_privkey.pem
  389. -pubout -out rsa_pubkey.pem
  390. cat rsa_pubkey.pem
  391. -----DEBUT DE LA CLE PUBLIQUE-----
  392. MdwwDQYJKoZIhvcNAQEBB
  393. QADKwAwKAIhANunW6sxkbd
  394. 9aop3F8cuI42TDDiHfw1U
  395. /Gk3KvGmpg4jAgMBAAE=
  396. -----FIN DE LA CLE PUBLIQUE-----
  397. Après avoir générex cette paire de
  398. clés, il est désormais possible de
  399. crypter et de décrypter les messa-
  400. ges. Nous allons travailler sur le
  401. message suivant :
  402. echo "Forty-two" > plain.txt
  403. Ce message peut être facilement
  404. crypté au moyen de la commande
  405. suivante et de la clé publique :
  406. openssl rsautl -encrypt
  407. -pubin -inkey rsa_pubkey.pem \
  408. -in plain.txt -out cipher.txt
  409. Afin de décrypter le message, nous
  410. utiliserons la clé privée :
  411. openssl rsautl -decrypt -inkey
  412. rsa_privkey.pem -in cipher.txt
  413. Une fois le fonctionnement de l'outil
  414. OpenSSL avec le système RSA
  415. maîtrisé, et en étant conscient de la
  416. nécessité de disposer de la clé privée
  417. pour pouvoir décrypter les messa-
  418. ges, notre objectif consiste à obtenir
  419. cette clé privée sans avoir accès
  420. à l'originale. En d'autres termes, il faut
  421. tenter d'obtenir la clé privée en utili-
  422. sant la clé publique. Il faut donc com-
  423. mencer par obtenir le module n ainsi
  424. que l'exposant de cryptage. Pour ce
  425. faire, il suffit d'utiliser la commande
  426. suivante avec la clé publique :
  427. openssl rsa -in rsa_pubkey.pem
  428. -pubin -text -modulus
  429. Modulus (256 bit):
  430. 00:db:a7:5b:ab:31:91:b7:7d:
  431. 6a:8a:77:17:c7:2e:
  432. 23:8d:93:0c:38:87:7f:0d:54:
  433. fc:69:37:2a:f1:a6:
  434. a6:0e:23
  435. Exponent: 65537 (0x10001)
  436. Modulus=DBA75BAB3191B77D
  437. 6A8A7717C72E238D930C38877
  438. F0D54FC69372AF1A6A60E23
  439. writing RSA key
  440. -----DEBUT DE LA CLE PUBLIQUE-----
  441. MdwwDQYJKoZIhvcNAQEBBQ
  442. ADKwAwKAIhANunW6sxkbd9
  443. Listing 2. Clé privée
  444. #include <stdio.h>
  445. #include <openssl/bn.h>
  446. #include <openssl/rsa.h>
  447. #include <openssl/engine.h>
  448. #include <openssl/pem.h>
  449. int main (int argc, char **argv) {
  450. RSA *keypair = RSA_new();
  451. BN_CTX *ctx = BN_CTX_new();
  452. BN_CTX_start(ctx);
  453. BIGNUM *n = BN_new();
  454. BIGNUM *d = BN_new();
  455. BIGNUM *e = BN_new();
  456. BIGNUM *p = BN_new();
  457. BIGNUM *q = BN_new();
  458. BIGNUM *dmp1 = BN_new();
  459. BIGNUM *dmq1 = BN_new();
  460. BIGNUM *iqmp = BN_new();
  461. BIGNUM *r0 = BN_CTX_get(ctx);
  462. BIGNUM *r1 = BN_CTX_get(ctx);
  463. BIGNUM *r2 = BN_CTX_get(ctx);
  464. BIGNUM *r3 = BN_CTX_get(ctx);
  465. if (argc!=4) {
  466. printf ("%s [p] [q] [exp]\n", argv[0]);
  467. return 0;
  468. }
  469. BN_dec2bn(&p, argv[1]);
  470. BN_dec2bn(&q, argv[2]);
  471. BN_dec2bn(&e, argv[3]);
  472. if(BN_cmp(p, q)<0) {
  473. BIGNUM *tmp = p;
  474. p = q;
  475. q = tmp;
  476. }
  477. // Nous calculons n
  478. BN_mul(n, p, q, ctx);
  479. // Nous calculons d
  480. BN_sub(r1, p, BN_value_one()); // p-1
  481. BN_sub(r2, q, BN_value_one()); // q-1/
  482. BN_mul(r0, r1, r2, ctx); // (p-1)(q-1)
  483. BN_mod_inverse(d, e, r0, ctx); // d
  484. BN_mod(dmp1, d, r1, ctx);
  485. BN_mod(dmq1, d, r2, ctx);
  486. // Nous calculons le module p inverse de q
  487. BN_mod_inverse(iqmp, q, p, ctx);
  488. // Clés RSA
  489. keypair->n = n;
  490. keypair->d = d;
  491. keypair->e = e;
  492. keypair->p = p;
  493. keypair->q = q;
  494. keypair->dmq1 = dmq1;
  495. keypair->dmp1 = dmp1;
  496. keypair->iqmp = iqmp;
  497. PEM_write_RSAPrivateKey(stdout, keypair, NULL, NULL, 0, NULL, NULL);
  498. BN_CTX_end(ctx);
  499. BN_CTX_free(ctx);
  500. RSA_free(keypair);
  501. return 0;
  502. }
  503. hakin9 Nº 3/2007 www.hakin9.org
  504. Fiche technique
  505. 60
  506. aop3F8cuI42TDDiHfw1U
  507. /Gk3KvGmpg4jAgMBAAE=
  508. -----FIN DE LA CLE PUBLIQUE-----
  509. Le module est exprimé en chiffres
  510. hexadécimaux. Afin de le convertir
  511. en chiffres décimaux, vous pouvez
  512. utiliser le programme exposé dans
  513. le Listing 1.
  514. gcc hex2dec.c -lssl
  515. /a.out DBA75BAB3191B77D6
  516. A8A7717C72E238D930C388
  517. 77F0D54FC69372AF1A6A60E23
  518. 99352209973842013949736850170
  519. 185769998267119089063339396
  520. 575567287426977500707
  521. Une fois le module obtenu en déci-
  522. mal, l'étape suivante consiste à le
  523. décomposer en produit de facteurs
  524. premiers.
  525. Factorisation du module n
  526. Dans la mesure où le nombre que
  527. nous voulons factoriser n'est pas trop
  528. important, il est plus rapide d'appliquer
  529. l'algorithme de factorisation baptisé
  530. QS (Crible Quadratique, en français).
  531. Cet algorithme est installé à l'aide de
  532. msieve, programme que vous pouvez
  533. télécharger en suivant le tableau des
  534. références ci-après. Msieve dispose
  535. d'une documentation suffisante qui
  536. vous permettra de l'installer et de
  537. l'utiliser rapidement sans trop de dif-
  538. ficulté. Ce programme, combiné à la
  539. commande suivante suffit à factoriser
  540. le nombre proposé :
  541. /msieve -v
  542. 9935220997384201394973685
  543. 01701857699982671190890633
  544. 39396575567287426977500707
  545. Un ordinateur moderne peut factoriser
  546. ce nombre en près de dix minutes,
  547. selon le matériel informatique disponi-
  548. ble. Le résultat est le suivant :
  549. factor: 297153055211137492311
  550. 771648517932014693
  551. factor: 334346924022870445836
  552. 047493827484877799
  553. À ce stade, une fois le module n
  554. factorisé et grâce à l'exposant de
  555. cryptage 65537 obtenu lors de
  556. l'étape précédente, nous disposons
  557. de toutes les données nécessaires
  558. pour l'obtention de la clé privée.
  559. Obtention de la clé
  560. privée et décryptage
  561. du message
  562. En raison des difficultés de ce proces-
  563. sus avec les outils les plus communs,
  564. nous allons développer un programme
  565. capable de réaliser cette tâche à notre
  566. place. La source de ce programme
  567. est exposée dans le Listing 3.
  568. Afin de réaliser les calculs néces-
  569. saires, nous avons utilisé la bibliothè-
  570. que OpenSSL. Les variables BIGNUM
  571. sont employées par cette bibliothèque
  572. pour travailler sur les gros chiffres. Ces
  573. variables possèdent leur propre interfa-
  574. ce de programmation pour réaliser des
  575. opérations telles qu'additions, soustrac-
  576. tions, opérations modulaires, etc.
  577. Listing 3. Modifier une clé privée en une clé publique
  578. gcc get _ priv _ key.c -lssl -o get _ priv _ key
  579. ./get _ priv _ key 297153055211137492311771648517932014693 \
  580. 334346924022870445836047493827484877799 65537
  581. -----BEGIN RSA PRIVATE KEY-----
  582. MIGqAgEAAiEA26dbqzGRt31qincXxy4jjZMMOId/
  583. DVT8aTcq8aamDiMCAwEAAQIh
  584. AMvT1oXa/rxF3mrVLrR/RS7vK1WTsQ5CWl/+37wztZOpAhEA+4jgEkfalFH+0
  585. S+1
  586. IPKD5wIRAN+NmMH4AF0B8jzMAXHHXGUCEGRpRZnGmVkwSlrTgqj+Zu0CEA7v7
  587. CQR
  588. yRxt09zCGNqcYo0CEDEW7mvozMYYLC5o+zgfV4U=
  589. -----END RSA PRIVATE KEY-----
  590. Listing 4. dfact_client
  591. ...
  592. for(;;) {
  593. get_random_seeds(&seed1, &seed2);
  594. switch(status) {
  595. case DF_CLIENT_STATUS_WAITING:
  596. N = recv_N_number(&rel_by_host, host);
  597. if(!N) sleep(DF_TIME_TO_RECV);
  598. else status = DF_CLIENT_STATUS_RUNNING;
  599. break;
  600. case DF_CLIENT_STATUS_RUNNING: {
  601. msieve_obj *obj = NULL;
  602. obj = msieve_obj_new(N, flags, relations, NULL,
  603. NULL, seed1, seed2, rel_by_host, 0, 0);
  604. if (obj == NULL) {
  605. syslog(LOG_ERR, "Factoring initialization failed");
  606. free(N);
  607. return 0;
  608. }
  609. msieve_run(obj);
  610. if(obj) msieve_obj_free(obj);
  611. while(!send_relations(N, host, relations)) sleep(DF_TIME_TO_SEND);
  612. if(unlink(relations)==-1) syslog(LOG_ERR, "unlink(): %s: %s",
  613. relations, strerror(errno));
  614. status = DF_CLIENT_STATUS_WAITING;
  615. free(N);
  616. }
  617. break;
  618. default:
  619. break;
  620. }
  621. ...
  622. Attaque par factorisation contre RSA
  623. hakin9 Nº 3/2007 www.hakin9.org 61
  624. Le programme donné en exemple
  625. commence par placer dans les varia-
  626. bles BIGNUM, les paramètres p, q et
  627. e. Ensuite, si vous analysez le code en
  628. détails en vous aidant des commen-
  629. taires, vous pourrez comprendre la
  630. procédure consistant à générer la clé
  631. privée. Il s'agit de la même procédure
  632. que nous avions expliquée précédem-
  633. ment de manière théorique. En réalité,
  634. la seule différence entre le test et la
  635. génération réelle de clés repose sur
  636. le fait que p et q auraient été choisis
  637. de manière aléatoire. Dans notre
  638. exemple, nous les avons obtenus
  639. à partir de la factorisation du module.
  640. Enfin, à l'aide de PEM_write_RSAPri-
  641. vateKey(), nous pouvons rédiger la
  642. clé privée utilisée dans les exemples
  643. au format PEM. Si l'on compare la
  644. clé ainsi générée avec la clé privée
  645. originale, il est clair que notre objectif
  646. a bien été rempli, puisque nous avons
  647. obtenu la clé privée à partir de la clé
  648. publique.
  649. Si nous appliquons notre nou-
  650. velle clé privée sur un fichier texte,
  651. comme par exemple rsa_hacked_
  652. privkey.pem, il est alors possible de
  653. décrypter le message :
  654. openssl rsautl -decrypt
  655. -inkey rsa_hacked_privkey
  656. .pem -in cipher.txt
  657. Algorithmes modernes
  658. de factorisation
  659. Les algorithmes de factorisation ont
  660. énormément progressé au fil du
  661. temps, de sorte qu'aujourd'hui, nous
  662. disposons d'algorithmes particuliè-
  663. rement rapides tels que la Méthode
  664. de la Courbe Elliptique (Elliptic Curve
  665. Method, ou ECM), le Crible Quadra-
  666. tique (Quadratic Sieve, ou QS), ou le
  667. Crible de Corps de Nombre (Number
  668. Field Sieve, ou NFS). Ces algorithmes
  669. donnent également naissance aux
  670. certaines de variations selon le type
  671. de nombre à décomposer en produit
  672. de facteurs premiers où la manière de
  673. résoudre certaines parties du nombre
  674. en question. Ces algorithmes sont as-
  675. sez complexes. Ils sont en règle géné-
  676. rale divisés en deux étapes au cours
  677. desquelles différents calculs condui-
  678. sant à la factorisation du nombre en
  679. question sont effectués. Les algorith-
  680. mes QS et NFS passent par une étape
  681. dite de crible. À ce stade, certains
  682. types de relations sont rassemblés,
  683. pour finalement construire un système
  684. d'équations permettant d'obtenir le
  685. résultat. L'étape dite de crible peut être
  686. réalisée par plusieurs machines fonc-
  687. tionnant de manière simultanée, dans
  688. la mesure où il s'agit normalement de
  689. l'étape la plus longue.
  690. Dans les exemples exposés
  691. plus haut, nous avons utilisé le pro-
  692. gramme msieve, implémentation de
  693. l'algorithme de Crible Quadratique
  694. à Polynômes Multiples (Multiple
  695. Polynomial Quadratic Sieve, ou
  696. MPQS), lui-même étant dérivé de
  697. l'algorithme QS. L'algorithme QA se
  698. révèle plus rapide lorsque vous devez
  699. factoriser des nombres de moins de
  700. 110 chiffres. Si cette limite est dé-
  701. passée, il vaut mieux avoir recours
  702. à l'algorithme NFS. Une variation
  703. de l'algorithme NFS est utilisée
  704. pour factoriser tout type de nom-
  705. bres ; il s'agit de l'algorithme GNFS
  706. (General Number Field Sieve). Peu
  707. de programmes libres et gratuits
  708. implémentent l'algorithme GNFS,
  709. et le seul programme de ce genre
  710. disponible ne dispose pas d'une
  711. bonne documentation, et n'est pas
  712. facile d'utilisation. Du moins, tel était
  713. le cas au moment où nous rédigions
  714. le présent article. Quoiqu'il en soit,
  715. Listing 5. dfact_server
  716. ...
  717. for(;;) {
  718. while(child_count >= DF_MAX_CLIENTS) sleep(1);
  719. sd_tmp = socket_server_accept(sd, client, sizeof(client));
  720. if((pid=fork())==0) {
  721. close(sd);
  722. process_client(sd_tmp, N, num_relations, rel_by_host, client);
  723. } else if (pid>0) {
  724. close(sd_tmp);
  725. child_count++;
  726. } else {
  727. perror("fork()");
  728. }
  729. close(sd_tmp);
  730. }
  731. close(sd);
  732. ...
  733. Listing 6. dfact_server (process_relations)
  734. void process_relations(char *N, int num_relations, int seconds) {
  735. for(;;) {
  736. int n_sieves = get_num_relations_in_file(DF_FILE_RELATIONS);
  737. printf ("relations: %d, need: %d \n", n_sieves, num_relations);
  738. // y a-t-il assez de relations ?
  739. if(n_sieves>=num_relations) {
  740. printf("Factoring %s\n", N);
  741. kill(0, SIGUSR1);
  742. uint32 seed1;
  743. uint32 seed2;
  744. uint32 flags;
  745. flags |= MSIEVE_FLAG_USE_LOGFILE;
  746. get_random_seeds(&seed1, &seed2);
  747. factor_integer(N,flags,DF_FILE_RELATIONS,NULL,&seed1,&seed2);
  748. printf("Factoring Done\n");
  749. kill(getppid(), SIGKILL);
  750. exit(0);
  751. }
  752. sleep(seconds);
  753. }
  754. }
  755. hakin9 Nº 3/2007 www.hakin9.org
  756. Fiche technique
  757. 62
  758. nous allons nous pencher sur le fonc-
  759. tionnement de l'algorithme GGNFS.
  760. Il s'agit d'une implémentation de l'algo-
  761. rithme GNFS qui, malgré un manque
  762. de stabilité, permet de décomposer
  763. des nombres en produit de facteurs
  764. premiers sans trop de problèmes.
  765. L'algorithme GGNFS comprend
  766. en réalité un groupe d'outils, lesquels,
  767. utilisés un par un, peuvent procéder
  768. à l'ensemble des étapes composant
  769. cet algorithme. Toutefois, un novice
  770. en la matière risque d'avoir du mal
  771. à factoriser un nombre avec cette pro-
  772. cédure assez complexe. C'est la rai-
  773. son pour laquelle l'algorithme GGNFS
  774. comprend un script rédigé en Perl qui
  775. se charge de toutes les tâches né-
  776. cessaires. Ce script permet d'utiliser
  777. le programme sans aucun problème,
  778. mais ce n'est pas le meilleur moyen
  779. d'obtenir le meilleur des outils qui
  780. composent l'algorithme GGNFS.
  781. Le plus simple pour tester ce
  782. programme reste encore d'éditer un
  783. fichier, que nous baptiserons test.n,
  784. dans lequel est indiqué le nombre
  785. que nous souhaitons décomposer en
  786. facteurs premiers.
  787. cat test.n
  788. n: 1522605027922533360535
  789. 6183781326374297180681149
  790. 6138068865790849458012296
  791. 3258952897654000350692006139
  792. Il faut ensuite lancer :
  793. tests/factLat.pl test.n
  794. Ce programme va effectivement
  795. factoriser le nombre, après quelques
  796. bonnes heures de traitement. La du-
  797. rée de traitement dépend du matériel
  798. utilisé. Afin d'optimiser l'algorithme
  799. GGNFS, il vaut mieux ne pas tenir
  800. compte du script factLat.pl pour uti-
  801. liser les outils dont il dispose avec
  802. les bons paramètres. L'utilisation de
  803. l'algorithme mériterait d'y consacrer
  804. un article entier, mais ce n'est malheu-
  805. reusement pas le propos du présent
  806. article. Si vous souhaitez apprendre
  807. à vous en servir, le mieux reste de lire
  808. la documentation disponible avec le
  809. code source et de consulter le forum
  810. de discussions (voir les liens). Il est
  811. également recommandé de consulter
  812. quelques documents sur l'algorithme
  813. NFS. Quoiqu'il en soit, il est néces-
  814. saire de préciser qu'il faut maîtriser
  815. les principes de l'algèbre linéaire ainsi
  816. que la théorie des nombre.
  817. Nécessité d'une
  818. attaque distribuée
  819. La clé factorisée dans cet exemple
  820. est très modeste par rapport à la
  821. longueur des clés généralement uti-
  822. lisées aujourd'hui. Si nous décidions
  823. à l'instant de créer une clé RSA pour
  824. un usage personnel, nous utiliserions
  825. au minimum une clé de 1024 bits.
  826. Pour plus de sécurité, nous pourrions
  827. également utiliser une clé de 2048 ou
  828. 4096 bits. Si vous tentez de factoriser
  829. une de ces clés avec un PC familial,
  830. quelle que soit sa vitesse, vous ver-
  831. rez à quel point votre ordinateur va
  832. s'embarquer dans des calculs sans
  833. fin ne menant à rien. La vérité est qu'il
  834. est impossible d'attaquer ce genre
  835. de clés. Mais les avancées techno-
  836. logiques et mathématiques réduisent
  837. de jour en jour cet objectif. Sous
  838. certaines conditions, il est possible de
  839. réaliser des attaques distribuées en
  840. utilisant des centaines de machines
  841. de manière simultanée pour faciliter le
  842. processus de factorisation. De nom-
  843. breuses études ont été menées dans
  844. ce domaine afin d'analyser les possi-
  845. bilités d'attaquer une clé de 1024 bits
  846. (voir la partie consacrée aux liens sur
  847. le Web). Aujourd'hui, ce genre d'atta-
  848. que demeure bien loin de la portée de
  849. la plupart des accros d'informatique,
  850. mais pas de celle de certains gouver-
  851. nements ou organisations.
  852. En outre, l'existence de compéti-
  853. tions telles que la Compétition de Fac-
  854. torisation RSA mentionnée plus haut,
  855. aident considérablement les experts
  856. dans ce domaine en les motivant
  857. à créer des outils distribués destinés
  858. à la factorisation des gros chiffres.
  859. Attaque distribuée
  860. Nous avons évoqué dans les exem-
  861. ples précédents le programme
  862. msieve. Comme nous l'avons appris,
  863. ce programme est facile à utiliser
  864. et le programme est suffisamment
  865. développé pour ne pas créer trop de
  866. problèmes à l'utilisateur. Selon nous,
  867. il s'agit du meilleur programme capable
  868. jusqu'ici d'implémenter l'algorithme
  869. de Crible Quadratique (QS). Mais, ce
  870. programme n'est rien de plus qu'une
  871. démo illustrant un usage basique de
  872. la bibliothèque msieve, et ne peut donc
  873. être utilisé que sur une seule machine.
  874. La documentation du programme
  875. comporte quelques méthodes per-
  876. mettant d'utiliser le programme démo
  877. sur différentes machines de sorte
  878. à réaliser une factorisation distribuée.
  879. Il s'agit toutefois d'une procédure ma-
  880. nuelle, très peu pratique. C'est la rai-
  881. son pour laquelle nous avons décidé
  882. d'implémenter un modeste exemple
  883. de programme introduisant l'utilisation
  884. de la bibliothèque msieve pour réali-
  885. ser une factorisation distribuée. Ce
  886. programme est baptisé dfact, et vous
  887. le trouverez sur le CD proposé avec
  888. ce magazine ainsi que dans la partie
  889. consacrée aux liens sur le Web.
  890. Le programme peut être compilé
  891. avec un Makefile et n'exige que l'ins-
  892. tallation correcte de la bibliothèque
  893. msieve. Le chemin de cette bibliothè-
  894. que doit être inclus dans le Makefile.
  895. Une fois compilé, vous trouverez deux
  896. binaires dans le dossier bin/ corres-
  897. pondant aux côtés client et serveur.
  898. Le serveur (dfs) sera exécuté sur
  899. une machine avec une capacité de
  900. mémoire suffisante (plus le nombre
  901. est gros, plus il faudra de mémoire),
  902. et permettra de distribuer les charges
  903. et coordonner les clients. Le serveur
  904. prend quatre paramètres : le nombre
  905. à factoriser, le nombre de relations
  906. que nous voulons voir recompilée par
  907. le client pour chaque paquet envoyé
  908. et le nombre de secondes qu'il faut au
  909. serveur pour contrôler s'il dispose de
  910. données client en quantité suffisante
  911. pour terminer avec succès le proces-
  912. sus de factorisation. Dans l'exemple
  913. suivant, nous allons demander aux
  914. clients d'envoyer des relations toutes
  915. les 5000 secondes et au serveur de
  916. vérifier le nombre de relations toutes
  917. les 60 secondes.
  918. bin/dfs 9935220997384201394
  919. 973685017018576999826
  920. 711908906333939657556
  921. 7287426977500707 5000 60
  922. Attaque par factorisation contre RSA
  923. hakin9 Nº 3/2007 www.hakin9.org 63
  924. Nous allons lancer dfc sur quelques
  925. clients, en lui affectant comme para-
  926. mètre l'IP du serveur et le chemin
  927. vers un fichier temporaire où les re-
  928. lations peuvent être sauvegardées.
  929. Par exemple :
  930. bin/dfc /tmp/rel 192.168.1.7
  931. Le programme dfact a été développé
  932. en utilisant comme support de base la
  933. bibliothèque msieve. Celle-ci dispose
  934. d'un exemple de programme baptisé
  935. demo.c, illustrant son fonctionnement
  936. simplifié. Si vous observez attentive-
  937. ment le code, vous constaterez qu'il
  938. n'y a rien de très difficile dans les ins-
  939. tructions à suivre. Nous avons exposé
  940. dans le Listing 4 un extrait de code du
  941. client dfact. Ici, nous exposons le pro-
  942. cessus interne de la boucle principale
  943. au cours duquel le client obtient du
  944. serveur le nombre à factoriser, puis
  945. calcule les relations demandées via
  946. la bibliothèque msieve pour finir par
  947. les envoyer au serveur pour qu'il les
  948. traite.
  949. Regardons comment le serveur
  950. gère la situation (Listing 5). Chaque
  951. client demandant l'envoi de la liste
  952. des relations au serveur est géré par
  953. process_client() via un processus
  954. séparé.
  955. Une autre procédure distincte se
  956. charge de traiter les relations que les
  957. clients envoient à des intervalles de
  958. temps réguliers (Listing 6).
  959. L'exemple de programme nous
  960. permet de factoriser un nombre
  961. à l'aide de plusieurs machines. Même
  962. si cette opération peut être réalisée
  963. via Internet, il est recommandé d'y
  964. renoncer compte tenu du manque
  965. d'authentification et/ou des mécanis-
  966. mes de décryptage. Il serait possible
  967. d'améliorer (ce serait par ailleurs un
  968. excellent exercice pour les lecteurs)
  969. l'usage de SSL, de renforcer la sécu-
  970. rité, d'optimiser la performance, etc...
  971. Nous avions précédemment évo-
  972. qué l'algorithme GNFS, plus efficace
  973. que l'algorithme MPQS lorsqu'il s'agit
  974. de factoriser des nombres à plus de
  975. 110 chiffres. À ce stade, il semble
  976. qu'aucun programme open source
  977. ne permette d'implémenter de ma-
  978. nière simple un système distribué de
  979. factorisation avec l'algorithme GNFS,
  980. comme nous sommes parvenus
  981. à le faire avec la bibliothèque msieve
  982. (QS). L'auteur du programme msieve,
  983. toutefois, travaille sur un support pour
  984. l'algorithme GNFS. Même s'il n'est
  985. actuellement qu'à mi-chemin dans la
  986. programmation de ce support, il est
  987. fort possible que la solution définitive
  988. soit disponible dans un futur proche. Si
  989. tel était le cas, il ne serait alors guère
  990. difficile de modifier notre exemple
  991. (dfact) afin de réaliser une factorisation
  992. distribuée avec l'algorithme GNFS.
  993. Quoiqu'il en soit, l'algorithme
  994. GGNFS permet d'utiliser plusieurs
  995. machines à des fins de factorisation.
  996. Ceci est possible grâce au script
  997. factLat.pl, comme nous l'avons de-
  998. montré précédemment, mais sachez
  999. qu'il s'agit d'une version assez insta-
  1000. ble qui ne permet d'utiliser que très
  1001. peu de machines seulement sur un
  1002. réseau LAN. l
  1003. À propos de l'auteur
  1004. Daniel Lerch Hostalot, ingénieur spécialisé en programmes C/C+ développés sur les
  1005. plate–formes GNU/Linux, est titulaire d'un MA en Techniques Sans Fil et Sécurité de
  1006. Réseau du Programme de l'Académie Cisco sur Réseaux (Cisco Networking Aca-
  1007. demy Program, CCNA). Il travaille également en qualité d'Ingénieur Technique pour
  1008. les systèmes informatiques, comme l'y autorise son diplôme délivré par l'Université
  1009. Oberta, Catalogne (UOC). Daniel Lerch Hostalot travaille actuellement dans le secteur
  1010. des télécommunications. Il maîtrise les langages de programmation suivants : C/C++,
  1011. ShellScript, Java, Perl, PHP (programme de modules C).
  1012. Vous pouvez contacter l'auteur à l'adresse suivante : dlerch@gmail.com, url :
  1013. http://daniellerch.com
  1014. Sur Internet
  1015. • Factorisation des gros nombres entiers – http://factorizacion.blogspot.com
  1016. • DFACT – http://daniellerch.com/sources/projects/dfact/dfact-hakin9.tar.gz
  1017. • GGNFS – Implémentation d'un Crible de Corps de Nombre : http://
  1018. www.math.ttu.edu/~cmonico/software/ggnfs/
  1019. • Groupe Yahoo! Pour l'algorithme GGNFS – http://www.groups.yahoo.com/group/
  1020. ggnfs
  1021. • MSIEVE – Factorisation d'entiers : http://www.boo.net/~jasonp/qs.html
  1022. • Compétition de Factorisation RSA : http://www.rsasecurity.com/rsalabs/
  1023. node.asp?id=2092
  1024. • OpenSSL – http://www.openssl.org
  1025. • Algorithme Shor – http://es.wikipedia.org/wiki/Algoritmo_de_Shor
  1026. • Sur le coût de la factorisation RSA 1024 – http://www.wisdom.weizmann.ac.il/
  1027. %7Etromer/papers/cbtwirl.pdf
  1028. • Estimations sur la factorisation du module RSA à 1024 bits – http://www.wisdom.w
  1029. eizmann.ac.il/%7Etromer/papers/factorest.pdf
  1030. Compétition de Factorisation RSA
  1031. • RSA-704 (30 000 dollars) : http://www.rsasecurity.com/rsalabs/
  1032. node.asp?id=2093#RSA704
  1033. • RSA-768 (50 000 dollars) : http://www.rsasecurity.com/rsalabs/
  1034. node.asp?id=2093#RSA768
  1035. • RSA-896 (75 000 dollars) : http://www.rsasecurity.com/rsalabs/
  1036. node.asp?id=2093#RSA896
  1037. • RSA-1024 (100 000 dollars) : http://www.rsasecurity.com/rsalabs/
  1038. node.asp?id=2093#RSA1024
  1039. • RSA-1536 (150 000 dollars) : http://www.rsasecurity.com/rsalabs/
  1040. node.asp?id=2093#RSA1536
  1041. • RSA-2048 (200 000 dollars) : http://www.rsasecurity.com/rsalabs/
  1042. node.asp?id=2093#RSA2048
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement