Crypter ne veut rien dire

Je ne suis pas le seul à avoir écrit un article à ce sujet, le bien connu chiffrer.info apporte les éléments de réponses à ce problème.

De quel problème parle-t-on ? Le fait d’utiliser, de répéter et d’amplifier un terme qui ne veut rien dire : crypter.

Avant toutes explications, essayons de comprendre pourquoi cette erreur est faite :

Théorie

La cryptographie est une discipline qui a pour but de mettre à disposition des moyens pour assurer la confidentialité, l’authenticité et l’intégrité d’une donnée en se basant sur des concepts mathématiques tels que la factorisation des nombres premiers, le logarithme discret et j’en passe.

Le chiffrement est un procédé cryptographique qui permet de transformer une donnée dans le but de la rendre incompréhensible pour autrui. Ce procédé s’axe autour de deux grandes familles, le chiffrement symétrique et le chiffrement asymétrique.

Le chiffrement symétrique

Pour chiffrer une donnée, vous utilisez une clé. Vous utiliserez exactement la même pour retrouver la donnée originale.

Le chiffrement asymétrique

Pour chiffrer une donnée, vous utilisez une clé. Vous utiliserez une autre clé pour retrouver la donnée originale.

En cryptographie, il existe trois termes pour définir les processus liés à la transformation d’une donnée pour la rendre incompréhensible ou au contraire, la rendre compréhensible :

Quand est-ce qu’on chiffre ?

On chiffre pour, par exemple, protéger des fichiers des lectures non désirées.

Quand est-ce qu’on déchiffre ?

On déchiffre pour, par exemple, accéder de nouveau aux fichiers précédemment chiffrés.

Quand est-ce qu’on décrypte ?

On décrypte pour, par exemple, essayer d’accéder aux fichiers précédemment chiffrés sans connaissance de la clé de chiffrement.

Quand est-ce qu’on crypte ?

Jamais, on ne crypte pas.

En se basant sur notre belle langue française, est un préfixe entrant dans la composition de nombreux mots pour exprimer la cessation d’un état ou d’une action, ou l’état, l’action inverses : défaire, dessouder, désintéresser. Donc, crypter, reviendrait à chiffrer, sans connaissance de la clé de chiffrement… Impossible.

Si vous êtes encore réticent, ce qui va suivre devrait vous faire changer d’avis.

Pratique

Pour bien comprendre d’un point de vue mathématique qu’il est impossible de crypter, démontrons-le.

En utilisant des calculs mathématiques non triviaux de la théorie des nombres, trouvez trois très grands nombres entiers \(e\), \(d\) et \(n\), tels que :

\[(m^e)^d \equiv m \pmod n\]

Pour tous \(m\) dans l’intervalle [0…\(n\)).

Le nombre entier \(n\) est appelé modulo et définit la longueur de la clé RSA. Il s’agit généralement d’un très grand nombre premier, par exemple, 2048 bits.

La paire \(\{n, e\}\) est la clé publique. Elle est conçue pour être partagée avec tout le monde. Le nombre \(e\) est appelé exposant de la clé publique. Il est généralement égal à 65537 (0x010001).

La paire \(\{n, d\}\) est la clé privée. Elle est conçue pour être gardée secrète. Il est pratiquement impossible de calculer la clé privée à partir de la clé publique \(\{n, e\}\). Le nombre \(d\) est appelé exposant de la clé privée.

Avec OpenSSL, il est très facile de générer une paire de clé RSA.

openssl genrsa -out privkey.pem 2048
openssl rsa -in privkey.pem -pubout -out pubkey.pem

Le fichier privkey.pem est la clé privée, pubkey.pem est la clé publique.

file *.pem
privkey.pem: PEM RSA private key
pubkey.pem:  ASCII text

Clé publique

Exemple de clé publique RSA de 2048 bits représentée par un modulo au format hexadécimal de 2048 bits \(n\) et un exposant public de 24 bits \(e\) :

openssl rsa -in privkey.pem -pubout | openssl asn1parse -inform PEM -strparse 19
writing RSA key
    0:d=0  hl=4 l= 266 cons: SEQUENCE
    4:d=1  hl=4 l= 257 prim: INTEGER           :93F492A5DC67A78102370FDCB20488EBB23C7381E7887BFE1377149E062687A99D54329646197FBEEBA9A913BC3CDB90110F645696707A8EED47A9E93C0ACDB50312F2B2A7D1AA051566F8ECFAA813C8C99D817581E5AE0A75DC0270D6FB165FFEF37019A3422266F711AB2C26921E8C10CF59A39240409B20F77D0DE4FBE603CEF8EFBDC5C180510C32E58228864B18AED6BD26BF6A5DBCA652AE26C85E1B069ED47C41D90F03EE72E1DE81FBBB1C951A434C484C33292F22EA6CF3B0840CEDCCC6B6C5F98D6DB0ABA20D00A97DC9C26A725AB70F2438C5C6B0A0539923FFCF6466ECA2D001BA07C61F70769E876389F0FAAAF40ACD11F901872FD0016D7809
  265:d=1  hl=2 l=   3 prim: INTEGER           :010001
n = 93F492A5DC67A78102370FDCB20488EBB23C7381E7887BFE1377149E062687A99D54329646197FBEEBA9A913BC3CDB90110F645696707A8EED47A9E93C0ACDB50312F2B2A7D1AA051566F8ECFAA813C8C99D817581E5AE0A75DC0270D6FB165FFEF37019A3422266F711AB2C26921E8C10CF59A39240409B20F77D0DE4FBE603CEF8EFBDC5C180510C32E58228864B18AED6BD26BF6A5DBCA652AE26C85E1B069ED47C41D90F03EE72E1DE81FBBB1C951A434C484C33292F22EA6CF3B0840CEDCCC6B6C5F98D6DB0ABA20D00A97DC9C26A725AB70F2438C5C6B0A0539923FFCF6466ECA2D001BA07C61F70769E876389F0FAAAF40ACD11F901872FD0016D7809
e = 0x010001

Pour plus de clarté, voici la valeur de \(n\) au format décimal.

echo "ibase=16; 93F492A5DC67A78102370FDCB20488EBB23C7381E7887BFE1377149E062687A99D54329646197FBEEBA9A913BC3CDB90110F645696707A8EED47A9E93C0ACDB50312F2B2A7D1AA051566F8ECFAA813C8C99D817581E5AE0A75DC0270D6FB165FFEF37019A3422266F711AB2C26921E8C10CF59A39240409B20F77D0DE4FBE603CEF8EFBDC5C180510C32E58228864B18AED6BD26BF6A5DBCA652AE26C85E1B069ED47C41D90F03EE72E1DE81FBBB1C951A434C484C33292F22EA6CF3B0840CEDCCC6B6C5F98D6DB0ABA20D00A97DC9C26A725AB70F2438C5C6B0A0539923FFCF6466ECA2D001BA07C61F70769E876389F0FAAAF40ACD11F901872FD0016D7809" | bc
18677634194009197950667958292186313642583892656885067032124283815691\
02902545227693136388296935218253451599796676315599011512958506535955\
25341423989950882264870345031277881652044284833892552977622204552821\
78758564992232502304194700326853041235723926193276000891280214564858\
36674860413924121793933398997770591255784212921064209073580076179775\
80559749574071910617913043606692231032932338404369291871508101415482\
50553984114254458854626392483848350867134269084969230330883257285685\
05769237658980731423217935045244948005656771344419152823613726978515\
58849291152988138496540660955905829891321426841780834731630420232921\
06761

Clé privée

Exemple de clé privée RSA de 2048 bits correspondant à la clé publique donnée ci-dessus, représentée par un modulo au format hexadécimal de 2048 bits \(n\) et un exposant privé de 2048 bits \(d\) :

openssl rsa -in privkey.pem | openssl asn1parse -inform PEM
writing RSA key
    0:d=0  hl=4 l=1186 cons: SEQUENCE
    4:d=1  hl=2 l=   1 prim: INTEGER           :00
    7:d=1  hl=4 l= 257 prim: INTEGER           :93F492A5DC67A78102370FDCB20488EBB23C7381E7887BFE1377149E062687A99D54329646197FBEEBA9A913BC3CDB90110F645696707A8EED47A9E93C0ACDB50312F2B2A7D1AA051566F8ECFAA813C8C99D817581E5AE0A75DC0270D6FB165FFEF37019A3422266F711AB2C26921E8C10CF59A39240409B20F77D0DE4FBE603CEF8EFBDC5C180510C32E58228864B18AED6BD26BF6A5DBCA652AE26C85E1B069ED47C41D90F03EE72E1DE81FBBB1C951A434C484C33292F22EA6CF3B0840CEDCCC6B6C5F98D6DB0ABA20D00A97DC9C26A725AB70F2438C5C6B0A0539923FFCF6466ECA2D001BA07C61F70769E876389F0FAAAF40ACD11F901872FD0016D7809
  268:d=1  hl=2 l=   3 prim: INTEGER           :010001
  273:d=1  hl=4 l= 256 prim: INTEGER           :3E57DCFF349B1CB2B89B38FCD6AA2083A84BDEA40B4AB06C8409364FCBE9AA5A6727D65509DEAEBC6512CD62BA7BAE4CCB5380051848F6EB88C21CAF61946FCF69272FCAE5F9EBB94EA66017831B1593129962B67FF0A6E0537F4C2BFDFA3918641671D2EBBEEF3E11B78938065CA5B08158CDBDA5DF9B1982CFA60B17C4A8CBA801C3D7538873C485056C7568796F20CA2932DA7E864493E3BA0E82D1EFCC080A11903084C6EDC88AFC46979887C30AFC4BF97CB3CD4282DB9681ADB7C61052D3BB6C7887AB95B09B31703CAA20EF6E143DA128769DA6936521AA22138FAD9ECE99D1C821B8D998E3B309D144B704772E571ED43AC2A201CCE06A898D97FE6D
  533:d=1  hl=3 l= 129 prim: INTEGER           :C4B3CE661E74C0FE73E261FE3D45CD6DC64B7BF53DD8CE1BCB9F3BC8214CD78322A3106E84B9C1725A529D73BCD32E92FE84326CA9435D7A2B7FB76FACF781BDFC7FAD1DA5E3FB799671D9A7E3E63146926BE0AA200F92794964F47AF51A18BF2F557436A8435ECF852A3467A4837D60702A52E6336CD64AADF135401D103597
  665:d=1  hl=3 l= 129 prim: INTEGER           :C08ECB2C83E602C6162DA0038B4BD7695AF09B63206D54E89CF14BD0CB40C8A0B1EB13594931FB1E0F5658F70A7CFDC0680D0783D5A54E47405315F648F2DBFF486D86B6F1DE417F72B038425333387D4B06C04CD87A82992D20120B71EA93945CECC1A174770709D0E161CDEE5C1AC295F9A6A5068B6A9CD34137628CB7B35F
  797:d=1  hl=3 l= 128 prim: INTEGER           :5031BA6159E361D79BA95D284914CF4705043B5A65C7A16825A11ABF620C31050EB70A78F475C30F7B11998DD91B042EFBC32BC7AF4E7EAAD35733933D227F6BD4A8BD0C8C58A16B15D1FED9FB091B67D94450092C1F0D2993A9AC1F01148DA84C84FB67593C764806D38920042B738F40CB9096B7BA94B747A9427B8C1DD2AB
  928:d=1  hl=3 l= 128 prim: INTEGER           :6FBCECED8204A12B6D8740498E358E64D69EB4ACCB0E66AD2D15609762BACF3160CD36C723105BD64FB41DA00D78068FF65149411962F98FA32613A27D2660BF3CBA41E83B666BBF973FE705A5DE1D33A7ABDD3F3A87ACED52204018601C6D5334B13693884FE1C7B26C7722D6E49FAAB6F8CDD90979317E9BA046916B72D625
 1059:d=1  hl=3 l= 128 prim: INTEGER           :2892C91E33B57DC14B19901A6EA1EE968A85564AF9DCBBD2D2D92A36DB0849E8FC3684BF3148FE64D5E6C2FDF9258EA9723D5ED4E233515A5ABEE69543A306EE64721692119CBF25BC08E5C4587F7CF9D16819A08EA9CDAF9C417C28DB6676587CEEB6FD59A38A7823407E6564469D83DB5EE98D7E3EDA1526E94FA59A223A17
n = 93F492A5DC67A78102370FDCB20488EBB23C7381E7887BFE1377149E062687A99D54329646197FBEEBA9A913BC3CDB90110F645696707A8EED47A9E93C0ACDB50312F2B2A7D1AA051566F8ECFAA813C8C99D817581E5AE0A75DC0270D6FB165FFEF37019A3422266F711AB2C26921E8C10CF59A39240409B20F77D0DE4FBE603CEF8EFBDC5C180510C32E58228864B18AED6BD26BF6A5DBCA652AE26C85E1B069ED47C41D90F03EE72E1DE81FBBB1C951A434C484C33292F22EA6CF3B0840CEDCCC6B6C5F98D6DB0ABA20D00A97DC9C26A725AB70F2438C5C6B0A0539923FFCF6466ECA2D001BA07C61F70769E876389F0FAAAF40ACD11F901872FD0016D7809
d = 3E57DCFF349B1CB2B89B38FCD6AA2083A84BDEA40B4AB06C8409364FCBE9AA5A6727D65509DEAEBC6512CD62BA7BAE4CCB5380051848F6EB88C21CAF61946FCF69272FCAE5F9EBB94EA66017831B1593129962B67FF0A6E0537F4C2BFDFA3918641671D2EBBEEF3E11B78938065CA5B08158CDBDA5DF9B1982CFA60B17C4A8CBA801C3D7538873C485056C7568796F20CA2932DA7E864493E3BA0E82D1EFCC080A11903084C6EDC88AFC46979887C30AFC4BF97CB3CD4282DB9681ADB7C61052D3BB6C7887AB95B09B31703CAA20EF6E143DA128769DA6936521AA22138FAD9ECE99D1C821B8D998E3B309D144B704772E571ED43AC2A201CCE06A898D97FE6D

Pour plus de clarté, voici la valeur de \(d\) au format décimal.

echo "ibase=16; 3E57DCFF349B1CB2B89B38FCD6AA2083A84BDEA40B4AB06C8409364FCBE9AA5A6727D65509DEAEBC6512CD62BA7BAE4CCB5380051848F6EB88C21CAF61946FCF69272FCAE5F9EBB94EA66017831B1593129962B67FF0A6E0537F4C2BFDFA3918641671D2EBBEEF3E11B78938065CA5B08158CDBDA5DF9B1982CFA60B17C4A8CBA801C3D7538873C485056C7568796F20CA2932DA7E864493E3BA0E82D1EFCC080A11903084C6EDC88AFC46979887C30AFC4BF97CB3CD4282DB9681ADB7C61052D3BB6C7887AB95B09B31703CAA20EF6E143DA128769DA6936521AA22138FAD9ECE99D1C821B8D998E3B309D144B704772E571ED43AC2A201CCE06A898D97FE6D" | bc
78701019007211804233897747568354525114050718787842154217024291250790\
81534673003455446749594864893429523159190261448535438443985711581305\
87653298668308530104276145999777026995621240778177647813759735527438\
49492313084288348738931695000693765922229614084763837925553980989145\
64257788780462124195411876241426198448758892362322217630825886350689\
76743747006985280171417449424009567866753861763595328227008107926070\
18916643336076856388829837465199323952370236810772678290266241184472\
39439203536921094451518615610503602763482126753905351488319521896633\
80309869119352610881849348979766148466264949295704184219000452284782\
9613

Le fichier privkey.pem contient donc la structure complète de la paire de clés RSA, ainsi que plusieurs paramètres supplémentaires : \(n\), le modulo de 2048 bits, l’exposant public \(e\) de 24 bits, l’exposant privé \(d\) de 2048 bits, le premier facteur \(p\), le second facteur \(q\) et trois autres entiers de la structure de données interne à RSA.

Chiffrer

Le chiffrement d’une donnée à l’aide d’une certaine clé publique RSA \(\{n, e\}\) est effectué par la transformation suivante :

\[cipheredData = (data)^e \bmod n\]

Ici, data est un nombre dans la plage [0…\(n\)). Avant d’être chiffrées, les données doivent être encodées en tant qu’entiers dans la plage [0…\(n\)], voir EAOP. Pour des données de plus grande taille, il convient d’utiliser le chiffrement hybride (chiffrer une clé secrète et l’utiliser pour chiffrer de manière symétrique), voir RSA-KEM.

L’opération ci-dessus ne peut pas être inversée : il n’existe pas d’algorithme efficace pour calculer data à partir de cipheredData, \(e\) et \(n\) qui sont, par nature, tous publiques (non privés). C’est le principe même de RSA.

Déchiffrer

Le déchiffrement de la donnée chiffrée à l’aide de la clé privée RSA correspondante \(\{n, d\}\) se fait par la transformation suivante :

\[decipheredData = (cipheredData)^d \bmod n\]

Pourquoi est-ce correct ? Rappelons que, par définition, la paire de clés RSA a la propriété suivante :

\[(m^e)^d \equiv m \pmod n\]

Pour tous \(m\) dans l’intervalle [0…\(n\)).

D’après la méthode de chiffrement, nous avons :

\[cipheredData = (data)^e \bmod n\]

Par conséquent :

\[decipheredData = (cipheredData)^d \bmod n\] \[decipheredData = ((data)^e \bmod n)^d\] \[decipheredData = ((data)^e)^d \bmod n\] \[decipheredData = (data) \bmod n = data\] \[decipheredData = data\]

Exemple

Examinons un exemple de chiffrement et de déchiffrement RSA, ainsi que les calculs, en suivant les formules ci-dessus. Supposons que nous avons généré la paire de clés RSA ayant les propriétés suivantes :

Chiffrons un message secret data = 83.

\[cipheredData = (data)^e \bmod n\] \[cipheredData = 83^7 \bmod 143\] \[cipheredData = 27136050989627 \bmod 143 = 8\]

Maintenant, déchiffrons le message chiffré pour retrouver sa valeur originale.

\[decipheredData = (cipheredData)^d \bmod n\] \[decipheredData = 8^{103} \bmod 143\] \[decipheredData = 1042962419883.. \bmod 143 = 83\]

Tout ça pour quoi ? Pour démontrer que, crypter, donc chiffrer sans connaissance de la clé de chiffrement \(\{n, e\}\) (la clé publique), est tout bonnement impossible.

Le mur de la honte

Liens sur lesquels l’erreur est faite :

Dernière chose par rapport à CryptoPhone, ils prétendent utiliser des algorithmes de chiffrage. De chiffrage ? L’action d’évaluer le coût d’un projet par exemple ? Quel est le rapport ? Quand on lit un peu ce qu’ils racontent, ils utiliseraient une technologie unique au monde pour offrir la sécurité ultime. D’une part, c’est une très mauvaise idée d’inventer sa propore cryptographie, d’autre part, quand on lit un peu plus loin, on apprend qu’ils utilisent des clés asymétriques de 4096 bits, ça ressemble beaucoup à RSA, vous n’avez rien inventé d’unique. Enfin, des “clés asymétriques 4096 bits Diffie-Hellman”, qu’est-ce que c’est ? L’alogrithme RSA peut servir à signer des signatures numériques et assurer l’échange de clés symétriques, mais exige d’abord un échange de clés publiques, généralement assuré par l’algorithme d’échange de clés Diffie-Hellman. La façon dont vous avez écrit ça n’est pas du tout clair. Je présume que, comme tout le reste, c’est une chose de plus que vous ne maîtrisez pas.

J’espère que c’est plus clair désormais, n’hésitez pas à envoyer cet article dès que vous entendez ce mot. N’oublions pas que l’apprentissage passe par la pédagogie !