OpenSSL et RSA

De knowledge
Aller à la navigation Aller à la recherche

On utilisera ici le concept de chiffrage asymetrique.

Génération de la paire de clés

Clé privée

On génère la clé privée : LA PLUS IMPORTANTE avec le commande

openssl genrsa -out private.pem 1024

Le fichier généré ressemble à ceci:

-----BEGIN RSA PRIVATE KEY-----
MIICXgIBAAKBgQDd6eQXChY6JDK13iDWE1iTIdV/Xqz3l9igNQJEvS9nnBpuMMpK
DdrbEK6TPXRThKiw28jK3DSJJLZP0xkXmDZyMVdPkn/AUopoi+wgbklU3EGSSN1U
ncYIAO3yJdTgLujGItEqppHmLe6XTz/By0v0WNvQQu9fMaylt2l9BvYn1QIDAQAB
AoGARTHP+Esh4SE2WrUXggjoPoB3RM7tmgpT9qhwu6RN6r2nFCLMgMjPLC2Iccrg
wcYEn5j4hCCjlPvIiR1mno/Msbv10z+o5ElN1gRznKbqVD1hsKFGS1PLvDe7Rqcc
I3R7e2E7QuXehdEkqTHiYd7Dniry/iXNIOJERcoztLSzzCUCQQD0sPliUmAGrZEi
iJvg++cTQpTWVXUyBZpmYNkQ/TbujNlUf9rYUOf1dli/1IXTgbpC0CfkXORaqVM7
tE0JSGzzAkEA6CttLsKHkVOF8QqbzxjmJAWd8B7CXlJF/5RYupv5Eat2yaY79d+I
Z0Q9Bmkew7HC8TZs6pbBc95Apo7njTmqFwJBAOHfsAXcBrqDZDNdqY8Q2akE0EHe
VzXayEFza0zsgdXJfSEseQcwAD+thJVoCDVLTnY4kmqSeVVbcvLtKCPGkJMCQQCV
fyEW8vwIgBfHVmVtvUKz/0nrzGKsCZ45LHTV9Ik074vV3MzPTdivZilFb3r32AcG
+1y20cxPp9VJast/DJqRAkEAlqYQa2pb3CeaXDYjiG7ahg67f2eIuqwwA5M33kC5
GkzQG0dbbPJ4LJ6RS8cNaxa+7rsNu6nytBib5TfZv+Q/Kw==
-----END RSA PRIVATE KEY-----

Ce fichier est assez indigeste. Pour en voir le contenu :

openssl rsa -in private.pem -text -noout

Qui nous donne

RSA Private-Key: (1024 bit, 2 primes)
modulus:
    00:dd:e9:e4:17:0a:16:3a:24:32:b5:de:20:d6:13:
    58:93:21:d5:7f:5e:ac:f7:97:d8:a0:35:02:44:bd:
    2f:67:9c:1a:6e:30:ca:4a:0d:da:db:10:ae:93:3d:
    74:53:84:a8:b0:db:c8:ca:dc:34:89:24:b6:4f:d3:
    19:17:98:36:72:31:57:4f:92:7f:c0:52:8a:68:8b:
    ec:20:6e:49:54:dc:41:92:48:dd:54:9d:c6:08:00:
    ed:f2:25:d4:e0:2e:e8:c6:22:d1:2a:a6:91:e6:2d:
    ee:97:4f:3f:c1:cb:4b:f4:58:db:d0:42:ef:5f:31:
    ac:a5:b7:69:7d:06:f6:27:d5
publicExponent: 65537 (0x10001)
privateExponent:
    45:31:cf:f8:4b:21:e1:21:36:5a:b5:17:82:08:e8:
    3e:80:77:44:ce:ed:9a:0a:53:f6:a8:70:bb:a4:4d:
    ea:bd:a7:14:22:cc:80:c8:cf:2c:2d:88:71:ca:e0:
    c1:c6:04:9f:98:f8:84:20:a3:94:fb:c8:89:1d:66:
    9e:8f:cc:b1:bb:f5:d3:3f:a8:e4:49:4d:d6:04:73:
    9c:a6:ea:54:3d:61:b0:a1:46:4b:53:cb:bc:37:bb:
    46:a7:1c:23:74:7b:7b:61:3b:42:e5:de:85:d1:24:
    a9:31:e2:61:de:c3:9e:2a:f2:fe:25:cd:20:e2:44:
    45:ca:33:b4:b4:b3:cc:25
prime1:
    00:f4:b0:f9:62:52:60:06:ad:91:22:88:9b:e0:fb:
    e7:13:42:94:d6:55:75:32:05:9a:66:60:d9:10:fd:
    36:ee:8c:d9:54:7f:da:d8:50:e7:f5:76:58:bf:d4:
    85:d3:81:ba:42:d0:27:e4:5c:e4:5a:a9:53:3b:b4:
    4d:09:48:6c:f3
prime2:
    00:e8:2b:6d:2e:c2:87:91:53:85:f1:0a:9b:cf:18:
    e6:24:05:9d:f0:1e:c2:5e:52:45:ff:94:58:ba:9b:
    f9:11:ab:76:c9:a6:3b:f5:df:88:67:44:3d:06:69:
    1e:c3:b1:c2:f1:36:6c:ea:96:c1:73:de:40:a6:8e:
    e7:8d:39:aa:17
exponent1:
    00:e1:df:b0:05:dc:06:ba:83:64:33:5d:a9:8f:10:
    d9:a9:04:d0:41:de:57:35:da:c8:41:73:6b:4c:ec:
    81:d5:c9:7d:21:2c:79:07:30:00:3f:ad:84:95:68:
    08:35:4b:4e:76:38:92:6a:92:79:55:5b:72:f2:ed:
    28:23:c6:90:93
exponent2:
    00:95:7f:21:16:f2:fc:08:80:17:c7:56:65:6d:bd:
    42:b3:ff:49:eb:cc:62:ac:09:9e:39:2c:74:d5:f4:
    89:34:ef:8b:d5:dc:cc:cf:4d:d8:af:66:29:45:6f:
    7a:f7:d8:07:06:fb:5c:b6:d1:cc:4f:a7:d5:49:6a:
    cb:7f:0c:9a:91
coefficient:
    00:96:a6:10:6b:6a:5b:dc:27:9a:5c:36:23:88:6e:
    da:86:0e:bb:7f:67:88:ba:ac:30:03:93:37:de:40:
    b9:1a:4c:d0:1b:47:5b:6c:f2:78:2c:9e:91:4b:c7:
    0d:6b:16:be:ee:bb:0d:bb:a9:f2:b4:18:9b:e5:37:
    d9:bf:e4:3f:2b

Bon comme ça ça parait tout aussi obscur mais une personne qui comprends l'algorithme RSA comprendra!

Clé publique

En fait le fichier précédent contient la clé privée, il faut l'en extraire.

openssl rsa -in private.pem -pubout -out public.pem

La partie publique est plus courte

-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDd6eQXChY6JDK13iDWE1iTIdV/
Xqz3l9igNQJEvS9nnBpuMMpKDdrbEK6TPXRThKiw28jK3DSJJLZP0xkXmDZyMVdP
kn/AUopoi+wgbklU3EGSSN1UncYIAO3yJdTgLujGItEqppHmLe6XTz/By0v0WNvQ
Qu9fMaylt2l9BvYn1QIDAQAB
-----END PUBLIC KEY-----

Nous avons notre paire de clés. On garde précieusement la clé privée et on envoie notre clé publique à tous nos interlocuteurs.

Avec cette clés ils pourront chiffrer les fichiers que seul ma clé privée saura déchiffrer.

Chiffrement

On va utiliser un texte court pour tester ce système asymétrique. On ne prut pas chiffer de cette façon de long fichiers nous verrons ça plus tard.

Ceci est un texte

Ce texte est dans le fichier texte.txt.

openssl rsautl -encrypt -in texte.txt -pubin -inkey public.pem -out texte.cry

Le fichier texte.cry est alors illisible et ne sera lisible qu'après avoir été déchiffré avec la clé privée.

On le chiffre avec la clé publique comme si on était la personne qui souhaite m'envoyer le fichier.

Déchiffrement

On suppose avoir reçu le fichier texte.cry et on souhaite le déchiffrer.

openssl rsautl -decrypt -in texte.cry -inkey private.pem -out texte.dechiffre.txt

Le texte est déchiffré!

$ cat texte.dechiffre.txt
Ceci est un texte

Limites de taille

Le protocole de RSA ne sait chiffre que des textes dont la longueur est inférieure ou égale à la taille de la clé. Ici on a une clé de 1024 bits soit 128 octets. C'est court!


Alors à quoi ça sert?


En pratique les protocoles associent le chiffrage asymétrique avec le chiffrage symétrique.

Côté source:

  1. On génère une clé symétrique "temporaire" TK
  2. On chiffre TK en RSA avec la clé publique
  3. On l'envoie au partenaire
  4. On chiffre le fichier de façon symétrique avec la clé temporaire TK
  5. On efface la clé temporaire TK
  6. On envoie le fichier au partenaire

Côté destination:

  1. On reçoit la clé temporaire symétrique chiffrée
  2. On la déchiffre avec notre clé privée ce qui nous redonne TK
  3. On reçois le fichier chiffré
  4. On le déchiffre avec TK
  5. On jette TK

De la symétrie dans l'asymétrie

En fonction de l'usage on peut :

  • Chiffrer avec la clé publique et déchiffrer avec la clé privée. ⇒ L'expéditeur sait que son fichier ne sera lisible que par le destinataire. En revanche le destinataire peut décoder le fichier mais ne peut pas être sûr qu'il est issue de l'expéditeur puisque il a été crée pas sa clé publique.
  • Chiffrer avec la clé privée et déchiffrer avec la clé publique. ⇒ L'émetteur chiffre avec sa clé privée donc il est le seul à pouvoir le faire. En revanche tout le monde peut le lire. Cela permet de diffuser au grand public un fichier tout en prouvant qu'il vient de nous.

Openssl sait faire cela. On utilise SMIME et Certificats x509

Signature

Le fait d'utiliser une signature permet de sécuriser un échange en satisfaisant les deux points ci dessus:

  1. Le destinataire est le seul à pouvoir déchiffrer le fichier (il déchiffre avec sa clé privée)
  2. L'expéditeur signe son document avec sa clé privée. Le destinataire vérifira cette signature avec la clé publique de l'expéditeur.