{"id":4482,"date":"2020-04-01T14:05:22","date_gmt":"2020-04-01T12:05:22","guid":{"rendered":"http:\/\/www.laurentmarot.fr\/wordpress\/?p=4482"},"modified":"2021-10-28T16:40:50","modified_gmt":"2021-10-28T14:40:50","slug":"rsa-avec-openssl","status":"publish","type":"post","link":"https:\/\/www.laurentmarot.fr\/wordpress\/?p=4482","title":{"rendered":"RSA avec openSSL"},"content":{"rendered":"<p>Int\u00e9gralement et honteusement pomp\u00e9 sur <a href=\"https:\/\/www.fil.univ-lille1.fr\/~wegrzyno\/portail\/PAC\/Doc\/TP-Certificats\/tp-certif002.html\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/www.fil.univ-lille1.fr\/~wegrzyno\/portail\/PAC\/Doc\/TP-Certificats\/tp-certif002.html<\/a><\/p>\n<h3>1. G\u00e9n\u00e9ration d\u2019une paire de cl\u00e9s<\/h3>\n<p>On peut g\u00e9n\u00e9rer une paire de cl\u00e9s RSA avec la commande <tt><strong>genrsa<\/strong><\/tt> de <tt>openSSL<\/tt>.<\/p>\n<p><code>$ openssl genrsa -out &lt;<em>fichier<\/em>&gt; &lt;<em>taille<\/em>&gt;<\/code><\/p>\n<p>o\u00f9 <code><em><em><strong>fichier<\/strong><\/em><\/em><\/code> est un nom de fichier de sauvegarde de la cl\u00e9, et <code><em><strong>taille<\/strong><\/em><\/code> et la taille souhait\u00e9e (exprim\u00e9e en bits) du modulus de la cl\u00e9.<\/p>\n<p>Par exemple, pour g\u00e9n\u00e9rer une paire de cl\u00e9s de 1024 bits, stock\u00e9e dans le fichier <tt>maCle.pem<\/tt>, on tape la commande<\/p>\n<p><code>$ openssl genrsa -out maCle.pem 1024<\/code><\/p>\n<p>Le fichier obtenu est un fichier au format <strong>PEM<\/strong> (Privacy Enhanced Mail, format en base 64), dont voici un exemple :<\/p>\n<p><code>$ cat maCle.pem<\/code><\/p>\n<p><code>-----BEGIN RSA PRIVATE KEY----- MIICXAIBAAKBgQCveVjLltevTC5kSAiTYjHMVuAR80DHMLWCp3BOVZ49eXwraXxO 7AfKWpA5g0wFZgZNERIfFYaCnvaQDQA+9BRIfsSSr3oSw0My5SD6eg15v0VmJmvP d8LgBypJHbr6f5MXWqntvzp0Qvg6ddeNpUIrqkkh4uDfHFDWqyrkQUCvKwIDAQAB AoGANchUrfnq28DWy0fE0R+cscvC292Z8jN8vrIBWxEk8iSlKU0om6v+a0g8wlP6 3gC6V66uxjY7xxdf7SD+\/UykVl4PGFymhLtywSdGlgec3tLgBtV3ytJFilAVDBij LzQwUegCO4zt1JWYc6vvaVdNyQSaGIIeYGsNDWEYlOtDSlkCQQDVRn9JS15G8p+H<br \/>\n4Z0PbU9ZQg2L1u9\/SD\/kELVe3Kx1fdHulxH0v8V2AgPdXA29Nhi+TxUtC+V8CMc2 KXmAvFsHAkEA0qBDmjHMDPwcGaqbQ2lymYQIGlZ5TLQFA98Dey2uE+CB6pmS\/e\/Z ilu1IaasuE3vBzXfB\/JU7DUkV++JQ7TtvQJBAL2s5dUch2sXqlOhjhpDP\/eE7CE6 9WLAsbm2Nmd4YJRZYtQLXPfLeeSapC9BCCMHsnfGQ3H9i4mFEQ6VUi7w1Q8CQAQa pVaS09QI8Y86eM4GdvowzWud9b0d4N8jcFDtIfA3NrDYjzmte8KraMsgEUuCET9F<br \/>\nuHPSL\/9uRagE\/dq44s0CQCMQU4PMqkMtwzCFsV8ZqLmkDPn1binIAwRLYFcsQRDt gTi6rycz3Pk1hCVzBfyMd8zwqpwKmR5FoOXuJEv+mVg=<br \/>\n-----END RSA PRIVATE KEY-----<br \/>\n<\/code><\/p>\n<h3>2.\u00a0Visualisation des cl\u00e9s RSA<\/h3>\n<p>La commande <tt>rsa<\/tt> permet de visualiser le contenu d\u2019un fichier au format PEM contenant une paire de cl\u00e9s RSA.<\/p>\n<p><code>$ openssl rsa -in &lt;<em>fichier<\/em>&gt; -text -noout<\/code><\/p>\n<p>L\u2019option <tt>-text<\/tt> demande l\u2019affichage d\u00e9cod\u00e9 de la paire de cl\u00e9s. L\u2019option <tt>-noout<\/tt> supprime la sortie normalement produite par la commande <tt>rsa<\/tt>.<\/p>\n<p>Par exemple<\/p>\n<p><code>$ openssl rsa -in maCle.pem -text -noout<\/code><\/p>\n<p><code>Private-Key: (1024 bit)<br \/>\nmodulus:<br \/>\n00:af:79:58:cb:96:d7:af:4c:2e:64:48:08:93:62: 31:cc:56:e0:11:f3:40:c7:30:b5:82:a7:70:4e:55: 9e:3d:79:7c:2b:69:7c:4e:ec:07:ca:5a:90:39:83: 4c:05:66:06:4d:11:12:1f:15:86:82:9e:f6:90:0d: 00:3e:f4:14:48:7e:c4:92:af:7a:12:c3:43:32:e5: 20:fa:7a:0d:79:bf:45:66:26:6b:cf:77:c2:e0:07: 2a:49:1d:ba:fa:7f:93:17:5a:a9:ed:bf:3a:74:42: f8:3a:75:d7:8d:a5:42:2b:aa:49:21:e2:e0:df:1c:<br \/>\n50:d6:ab:2a:e4:41:40:af:2b<br \/>\npublicExponent: 65537 (0x10001)<br \/>\nprivateExponent:<br \/>\n35:c8:54:ad:f9:ea:db:c0:d6:cb:47:c4:d1:1f:9c: b1:cb:c2:db:dd:99:f2:33:7c:be:b2:01:5b:11:24: f2:24:a5:29:4d:28:9b:ab:fe:6b:48:3c:c2:53:fa: de:00:ba:57:ae:ae:c6:36:3b:c7:17:5f:ed:20:fe: fd:4c:a4:56:5e:0f:18:5c:a6:84:bb:72:c1:27:46: 96:07:9c:de:d2:e0:06:d5:77:ca:d2:45:8a:50:15: 0c:18:a3:2f:34:30:51:e8:02:3b:8c:ed:d4:95:98: 73:ab:ef:69:57:4d:c9:04:9a:18:82:1e:60:6b:0d:<br \/>\n0d:61:18:94:eb:43:4a:59<br \/>\nprime1:<br \/>\n00:d5:46:7f:49:4b:5e:46:f2:9f:87:e1:9d:0f:6d: 4f:59:42:0d:8b:d6:ef:7f:48:3f:e4:10:b5:5e:dc: ac:75:7d:d1:ee:97:11:f4:bf:c5:76:02:03:dd:5c: 0d:bd:36:18:be:4f:15:2d:0b:e5:7c:08:c7:36:29:<br \/>\n79:80:bc:5b:07<br \/>\nprime2:<br \/>\n00:d2:a0:43:9a:31:cc:0c:fc:1c:19:aa:9b:43:69: 72:99:84:08:1a:56:79:4c:b4:05:03:df:03:7b:2d: ae:13:e0:81:ea:99:92:fd:ef:d9:8a:5b:b5:21:a6: ac:b8:4d:ef:07:35:df:07:f2:54:ec:35:24:57:ef:<br \/>\n89:43:b4:ed:bd<br \/>\nexponent1:<br \/>\n00:bd:ac:e5:d5:1c:87:6b:17:aa:53:a1:8e:1a:43: 3f:f7:84:ec:21:3a:f5:62:c0:b1:b9:b6:36:67:78: 60:94:59:62:d4:0b:5c:f7:cb:79:e4:9a:a4:2f:41: 08:23:07:b2:77:c6:43:71:fd:8b:89:85:11:0e:95:<br \/>\n52:2e:f0:d5:0f<br \/>\nexponent2:<br \/>\n04:1a:a5:56:92:d3:d4:08:f1:8f:3a:78:ce:06:76: fa:30:cd:6b:9d:f5:bd:1d:e0:df:23:70:50:ed:21: f0:37:36:b0:d8:8f:39:ad:7b:c2:ab:68:cb:20:11: 4b:82:11:3f:45:b8:73:d2:2f:ff:6e:45:a8:04:fd:<br \/>\nda:b8:e2:cd<br \/>\ncoefficient:<br \/>\n23:10:53:83:cc:aa:43:2d:c3:30:85:b1:5f:19:a8: b9:a4:0c:f9:f5:6e:29:c8:03:04:4b:60:57:2c:41: 10:ed:81:38:ba:af:27:33:dc:f9:35:84:25:73:05: fc:8c:77:cc:f0:aa:9c:0a:99:1e:45:a0:e5:ee:24:<br \/>\n4b:fe:99:58<\/code><\/p>\n<p>Les diff\u00e9rents \u00e9l\u00e9ments de la cl\u00e9 sont affich\u00e9s en hexad\u00e9cimal (hormis l\u2019exposant public). On peut distinguer le modulus, l\u2019exposant public (qui par d\u00e9faut est toujours 65537<sup><a href=\"https:\/\/www.fil.univ-lille1.fr\/~wegrzyno\/portail\/PAC\/Doc\/TP-Certificats\/tp-certif004.html#note1\" name=\"text1\">1<\/a><\/sup>), l\u2019exposant priv\u00e9, les nombres premiers facteurs du modulus, plus trois autres nombres qui servent \u00e0 optimiser l\u2019algorithme de d\u00e9chiffrement.<\/p>\n<p>On v\u00e9rifie assez facilement avec 2 lignes de java que les 2 nombres premiers p et q font bien 1024 bits et que le modulus n = p x q<\/p>\n<div id=\"attachment_4875\" style=\"width: 310px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/www.laurentmarot.fr\/wordpress\/wp-content\/uploads\/2020\/04\/Capture-du-2021-10-28-16-33-51.png\" rel=\"lightbox[4482]\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-4875\" class=\"size-medium wp-image-4875\" src=\"https:\/\/www.laurentmarot.fr\/wordpress\/wp-content\/uploads\/2020\/04\/Capture-du-2021-10-28-16-33-51-300x125.png\" alt=\"Playing with big numbers\" width=\"300\" height=\"125\" srcset=\"https:\/\/www.laurentmarot.fr\/wordpress\/wp-content\/uploads\/2020\/04\/Capture-du-2021-10-28-16-33-51-300x125.png 300w, https:\/\/www.laurentmarot.fr\/wordpress\/wp-content\/uploads\/2020\/04\/Capture-du-2021-10-28-16-33-51-1024x427.png 1024w, https:\/\/www.laurentmarot.fr\/wordpress\/wp-content\/uploads\/2020\/04\/Capture-du-2021-10-28-16-33-51-768x320.png 768w, https:\/\/www.laurentmarot.fr\/wordpress\/wp-content\/uploads\/2020\/04\/Capture-du-2021-10-28-16-33-51-1536x641.png 1536w, https:\/\/www.laurentmarot.fr\/wordpress\/wp-content\/uploads\/2020\/04\/Capture-du-2021-10-28-16-33-51.png 1580w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a><p id=\"caption-attachment-4875\" class=\"wp-caption-text\">Playing with big numbers<\/p><\/div>\n<h3>3.\u00a0Chiffrement d\u2019un fichier de cl\u00e9s RSA<\/h3>\n<p>Il n\u2019est pas prudent de laisser une paire de cl\u00e9s en clair (surtout la partie priv\u00e9e). Avec la commande <tt>rsa<\/tt>, il est possible de chiffrer une paire de cl\u00e9s<sup><a href=\"https:\/\/www.fil.univ-lille1.fr\/~wegrzyno\/portail\/PAC\/Doc\/TP-Certificats\/tp-certif004.html#note2\" name=\"text2\">2<\/a><\/sup>. Pour cela trois options sont possibles qui pr\u00e9cisent l\u2019algorithme de chiffrement sym\u00e9trique \u00e0 utiliser\u00a0: <tt>-des<\/tt>, <tt>-des3<\/tt> et <tt>-idea<\/tt>.<\/p>\n<p><code>$ openssl rsa -in maCle.pem -des3 -out maCle.pem writing RSA key Enter PEM pass phrase: Verifying - Enter PEM pass phrase:<\/code><\/p>\n<p>Une phrase de passe est demand\u00e9e deux fois pour g\u00e9n\u00e9rer une cl\u00e9 sym\u00e9trique prot\u00e9geant l\u2019acc\u00e8s \u00e0 la cl\u00e9.<\/p>\n<h3>4.\u00a0Export de la partie publique<\/h3>\n<p>La partie publique d\u2019une paire de cl\u00e9s RSA est publique, et \u00e0 ce titre peut \u00eatre communiqu\u00e9e \u00e0 n\u2019importe qui. Le fichier <tt>maCle.pem<\/tt> contient la partie priv\u00e9e de la cl\u00e9, et ne peut donc pas \u00eatre communiqu\u00e9 tel quel (m\u00eame s\u2019il est chiffr\u00e9). Avec l\u2019option <tt>-pubout<\/tt> on peut exporter la partie publique d\u2019une cl\u00e9.<\/p>\n<p><code>$ openssl rsa -in maCle.pem -pubout -out maClePublique.pem<\/code><\/p>\n<p><code>-----BEGIN PUBLIC KEY-----<br \/>\nMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCveVjLltevTC5kSAiTYjHMVuAR<br \/>\n80DHMLWCp3BOVZ49eXwraXxO7AfKWpA5g0wFZgZNERIfFYaCnvaQDQA+9BRIfsSS<br \/>\nr3oSw0My5SD6eg15v0VmJmvPd8LgBypJHbr6f5MXWqntvzp0Qvg6ddeNpUIrqkkh<br \/>\n4uDfHFDWqyrkQUCvKwIDAQAB<br \/>\n-----END PUBLIC KEY-----<\/code><\/p>\n<p>Mais <a href=\"http:\/\/www.laurentmarot.fr\/wordpress\/?p=4534\">pourquoi<\/a> ma cl\u00e9 commence toujours par MIGf&#8230; ?<\/p>\n<p><code><br \/>\n# openssl rsa -inform PEM -pubin -in maClePublique.pem -text -noout<br \/>\nPublic-Key: (1024 bit)<br \/>\nModulus:<br \/>\n00:af:79:58:cb:96:d7:af:4c:2e:64:48:08:93:62:<br \/>\n31:cc:56:e0:11:f3:40:c7:30:b5:82:a7:70:4e:55:<br \/>\n9e:3d:79:7c:2b:69:7c:4e:ec:07:ca:5a:90:39:83:<br \/>\n4c:05:66:06:4d:11:12:1f:15:86:82:9e:f6:90:0d:<br \/>\n00:3e:f4:14:48:7e:c4:92:af:7a:12:c3:43:32:e5:<br \/>\n20:fa:7a:0d:79:bf:45:66:26:6b:cf:77:c2:e0:07:<br \/>\n2a:49:1d:ba:fa:7f:93:17:5a:a9:ed:bf:3a:74:42:<br \/>\nf8:3a:75:d7:8d:a5:42:2b:aa:49:21:e2:e0:df:1c:<br \/>\n50:d6:ab:2a:e4:41:40:af:2b<br \/>\nExponent: 65537 (0x10001)<\/code><\/p>\n<p>&nbsp;<\/p>\n<h3>5.\u00a0Chiffrement \/ d\u00e9chiffrement de donn\u00e9es avec RSA<\/h3>\n<p>On peut chiffrer des donn\u00e9es avec une cl\u00e9 RSA. Pour cela on utilise la commande <tt>rsautl<\/tt><\/p>\n<p><code>$ openssl rsautl -encrypt -in &lt;<em>fichier_entree<\/em>&gt; -inkey &lt;<em>cle<\/em>&gt; \\ -out &lt;<em>fichier_sortie<\/em><\/code><\/p>\n<p>o\u00f9<\/p>\n<ul class=\"itemize\">\n<li class=\"li-itemize\"><code><em>fichier_entree<\/em><\/code> est le fichier des donn\u00e9es \u00e0 chiffrer. Attention, le fichier des donn\u00e9es \u00e0 chiffrer ne doit pas avoir une taille excessive (ne doit pas d\u00e9passer 116 octets pour une cl\u00e9 de 1024 bits).<\/li>\n<li class=\"li-itemize\"><code><em>cle<\/em><\/code> est le fichier contenant la cl\u00e9 RSA. Si ce fichier ne contient que la parte publique de la cl\u00e9, il faut rajouter l\u2019option <tt>-pubin<\/tt>.<\/li>\n<li class=\"li-itemize\"><code><em>fichier_sortie<\/em><\/code> est le fichier de donn\u00e9es chiffr\u00e9.<\/li>\n<\/ul>\n<p>Pour d\u00e9chiffrer on remplace l\u2019option <tt>-encrypt<\/tt> par <tt>-decrypt<\/tt>. Le fichier contenant la cl\u00e9 doit \u00e9videmment contenir la partie priv\u00e9e.<\/p>\n<h3>6.\u00a0Signature de fichiers<\/h3>\n<p>La commande <tt>dgst<\/tt> permet de le faire.<\/p>\n<p><code class=\"lstlisting\">$ openssl dgst &lt;<em>hachage<\/em>&gt; -out &lt;<em>empreinte<\/em>&gt; &lt;<em>fichier_entree<\/em>&gt;<\/code><\/p>\n<p>o\u00f9 <code><em>hachage<\/em><\/code> est une fonction de hachage. Avec <tt>openssl<\/tt>, plusieurs fonctions de hachage sont propos\u00e9es dont<\/p>\n<ul class=\"itemize\">\n<li class=\"li-itemize\">MD5 (option <tt>-md5<\/tt>), qui calcule des empreintes de 128 bits,<\/li>\n<li class=\"li-itemize\">SHA1 (option <tt>-sha1<\/tt>), qui calcule des empreintes de 160 bits,<\/li>\n<li class=\"li-itemize\">RIPEMD160 (option <tt>-ripemd160<\/tt>), qui calcule des empreintes de 160 bits.<\/li>\n<\/ul>\n<p>Dans la vraie vie signer un document revient \u00e0 chiffrer son empreinte (et non pas \u00e0 signer son empreinte comme on peut le lire dans le doc original, puisque la signature est une double op\u00e9ration cryptographique hash&amp;encrypt). Pour cela, on utilise l\u2019option <tt>-sign<\/tt> de la commande <tt>rsautl<\/tt><\/p>\n<p><code>$ openssl rsautl -sign -in &lt;<em>empreinte<\/em>&gt; \\ -inkey &lt;<em>cle<\/em>&gt; \\ -out &lt;<em>signature<\/em>&gt;<\/code><\/p>\n<p>et pour v\u00e9rifier la signature<\/p>\n<p>$ openssl rsautl -verify -in &lt;<em>signature<\/em>&gt; -pubin \\ -inkey &lt;<em>cle<\/em>&gt; -out &lt;<em>empreinte<\/em><\/p>\n<p>Il reste ensuite \u00e0 v\u00e9rifier que l\u2019empreinte ainsi produite est la m\u00eame que celle que l\u2019on peut calculer. L\u2019option <tt>-pubin<\/tt> indique que la cl\u00e9 utilis\u00e9e pour la v\u00e9rification est la partie publique de la cl\u00e9 utilis\u00e9e pour la signature.<\/p>\n<p>Pour ceux qui ne veulent pas jouer avec\u00a0 Java : <a href=\"https:\/\/wiki.openssl.org\/index.php\/Command_Line_Utilities\" target=\"_blank\" rel=\"noopener noreferrer\">Command Line Utilities openSSL<\/a><\/p>\n<p>Si vous voulez faire des tests en ligne (! confidentialit\u00e9 sur clefs priv\u00e9es), il existe de nombreux outils :<br \/>\n&#8211; <a href=\"https:\/\/8gwifi.org\/PemParserFunctions.jsp\">https:\/\/8gwifi.org\/<\/a> &#8211; PEM Parseur<br \/>\n&#8211; <a href=\"https:\/\/www.devglan.com\/online-tools\/rsa-encryption-decryption\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/www.devglan.com\/online-tools\/rsa-encryption-decryption<\/a><br \/>\n&#8211; <a href=\"https:\/\/www.sslshopper.com\/ssl-certificate-tools.html\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/www.sslshopper.com\/ssl-certificate-tools.html<\/a><\/p>\n<p>Si vous voulez jeter un oeil sur une conf un peu trop provoc&rsquo; \u00e0 mon go\u00fbt : \u00ab\u00a0<a href=\"https:\/\/blog.trailofbits.com\/2019\/07\/08\/fuck-rsa\/\" target=\"_blank\" rel=\"noopener\">Fuck RSA @SummerCon2019<\/a>\u00a0\u00bb<\/p>\n<hr \/>\n\n","protected":false},"excerpt":{"rendered":"<p>Int\u00e9gralement et honteusement pomp\u00e9 sur https:\/\/www.fil.univ-lille1.fr\/~wegrzyno\/portail\/PAC\/Doc\/TP-Certificats\/tp-certif002.html 1. G\u00e9n\u00e9ration d\u2019une paire de cl\u00e9s On peut g\u00e9n\u00e9rer une paire de cl\u00e9s RSA avec la commande genrsa de openSSL. $ openssl genrsa -out &lt;fichier&gt; &lt;taille&gt; o\u00f9 fichier est un nom de fichier de sauvegarde de la cl\u00e9, et taille et la taille souhait\u00e9e (exprim\u00e9e en bits) du modulus [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[20],"tags":[],"_links":{"self":[{"href":"https:\/\/www.laurentmarot.fr\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/4482"}],"collection":[{"href":"https:\/\/www.laurentmarot.fr\/wordpress\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.laurentmarot.fr\/wordpress\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.laurentmarot.fr\/wordpress\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.laurentmarot.fr\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=4482"}],"version-history":[{"count":37,"href":"https:\/\/www.laurentmarot.fr\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/4482\/revisions"}],"predecessor-version":[{"id":4876,"href":"https:\/\/www.laurentmarot.fr\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/4482\/revisions\/4876"}],"wp:attachment":[{"href":"https:\/\/www.laurentmarot.fr\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=4482"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.laurentmarot.fr\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=4482"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.laurentmarot.fr\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=4482"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}