# cryptologie # <i class="fa fa-user-secret" aria-hidden="true"></i> ## Pourquoi chiffre-t-on ? 1. Confidentialité 2. Authentification 3. Intégrité 4. Non répudiation ## opérations cryptographiques * agit sur une donnée en claire * une chaîne caractère * un fichier texte * un fichier multimédia * une archive * appelé aussi le **clair** * le but de la protéger ## Hacher (to hash) * hash / Empreinte / Condensat * taille fixe (quelques octets) * chaque **clair** a un hash unique * collision = cassé * pas d’opération inverse * on parle de hashage ## Hacher (to hash) <pre><code class="hljs bash"" style="font-size: 16px"">sha256("password") = 5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8</code></pre> * [MD5]([SHA-1](https://fr.wikipedia.org/wiki/MD5) <i class="fa fa-thumbs-down"></i> * [SHA-1](https://fr.wikipedia.org/wiki/SHA-1) <i class="fa fa-thumbs-down"></i> * [SHA-2](https://fr.wikipedia.org/wiki/SHA-2) <i class="fa fa-thumbs-up"></i> * [SHA-256](https://fr.wikipedia.org/wiki/SHA-2#SHA-256) * [SHA-512](https://fr.wikipedia.org/wiki/SHA-2#SHA-512) * [SHA-384](https://fr.wikipedia.org/wiki/SHA-2#SHA-384) * [Hash: online hash value calculator](https://www.fileformat.info/tool/hash.htm) ## Hash / attaques * [force brute](https://fr.wikipedia.org/wiki/Attaque_par_force_brute) * testé toutes les possibilités (online / offline) * [par dictionnaire](https://fr.wikipedia.org/wiki/Attaque_par_dictionnaire) * testé des combinaisons de possibilités probables (online / offline) <!-- * [https://github.com/danielmiessler/SecLists/tree/master/Passwords](https://github.com/danielmiessler/SecLists/tree/master/Passwords) --> * [Tables arc-en-ciel](https://fr.wikipedia.org/wiki/Rainbow_table) * hashés précalculés de possibilités (offline) * [https://crackstation.net/](https://crackstation.net/) * [http://project-rainbowcrack.com/table.htm](http://project-rainbowcrack.com/table.htm) <!--* [What are the differences between dictionary attack and brute force attack?](https://security.stackexchange.com/questions/67712/what-are-the-differences-between-dictionary-attack-and-brute-force-attack#67768) --> ## Saler (to salt) * hasher en concaténant la donnée en claire avec une chaîne de caractères pseudo-aléatoires * stocker le sel au niveau de l'enregistrement de l'utilisateur * évite les attaques par tables arc-en-ciel * n'évite pas la force brute / ni les attaques par dictionnaire * on parle de salaison ## Saler (to salt) <pre><code class="hljs bash" style="font-size: 14px">sha256("hello"."bv5PehSMfV11Cd") = d1d3ec2e6f20fd420d50e2642992841d8338a314b8ea157c9e18477aaef226ab</code></pre> * utilisé notamment pour le stockage des mots de passe en base de données * [Salted Password Hashing - Doing it Right](https://crackstation.net/hashing-security.htm) ## Coder (to encode) * changer la manière de stocker la donnée en clair * n'est pas réellement une opération cryptographique * pas de secret * la donnée n'est pas protégée * on parle de codage <pre><code class="hljs bash" style="font-size: 25px">base64_encode("all in clear") = YWxsIGluIGNsZWFy</code></pre> * opération inverse décoder (to decode) <pre><code class="hljs bash" style="font-size: 25px">base64_decode("YWxsIGluIGNsZWFy") = all in clear</code></pre> ## Chiffrer (to encrypt) * rendre la compréhension de la donnée en claire impossible à quiconque ne possède pas le secret (la **clé** pour la lire) * on parle de chiffrement <pre><code class="hljs bash" style="font-size: 16px">openssl_encrypt("all in clear","aes128","secret") = d2xhqzZbLFzoCP6vNfdVOg==</code></pre> * opération inverse déchiffrer (to decrypt) <pre><code class="hljs bash" style="font-size: 16px">openssl_decrypt("d2xhqzZbLFzoCP6vNfdVOg==","aes128","secret") = all in clear</code></pre> * Deux options : symétrique ou asymétrique ## Le reste ... * **Décrypter** * chercher à deviner la donnée en claire sans disposer du secret * **Chiffrage** * pour les devis (en homme / jour) * **[Crypter, cryptage, encrypter n'existent pas](http://www.bortzmeyer.org/cryptage-n-existe-pas.html)** * reviendrait à tenter de chiffrer sans connaîre le secret * non sens ## en termes scientifiques ... * **Cryptologie** * science du secret * **Cryptographie** * comment protéger les messages * **Cryptogranalyse** * comment décrypter les messages ## Chiffrement symétrique * Dit **à clé secrète**, **à clé privée**, ou encore **à secret partagé** * la clé permet de chiffrer **et** de déchiffrer * plus la clé est **grosse** plus il est difficile de la deviner * <i class="fa fa-thumbs-o-up"></i> peu gourmand en calcul * <i class="fa fa-thumbs-o-down"></i> la clé doit être partagée par l'émetteur et le(s) récepteur(s) ## Chiffrements symétriques connus * <i class="fa fa-thumbs-down"></i> faibles * Scytale spartiate, ROT13, Chiffre de Jules César * <i class="fa fa-thumbs-up"></i> robustes * Blowfish, AES, Twofish  ## problème du chiffrement pour plusieurs * démultiplie le nombre de clé * une clé par destinataire ## problème du partage de la clé secrète * risque d'interaction * communiqué des messages chiffrés deux à deux * n * (n-1) / 2 * si on veut couvrir tous les cas * chiffré pour un groupe de 3 4 * démultiplication des clés * non adaptée Note: * https://www.youtube.com/watch?v=9zNAUFtw7Ac 14:30 * https://romain.blogreen.org/files/2017-10-31-pki.pdf slide 15 ## vecteur d'intialisation https://stackoverflow.com/questions/11821195/use-of-initialization-vector-in-openssl-encrypt * avoir la garanti que les chiffrés sont uniques * se stocke en clair * n'est utilisable qu'avec le secret * mais deux messages identiques chiffrés avec de vi différent auront des chiffré différents <?php $iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length("aes128")); $crypt = openssl_encrypt("all in clear", "aes128", "secret", null, $iv); $crypt = openssl_encrypt("all in clear", "aes128", "secret"); echo $crypt."\n"; $clear = openssl_decrypt($crypt, "aes128", "secret", null , $iv); $clear = openssl_decrypt($crypt, "aes128", "secret"); echo $clear."\n"; ## Chiffrement asymétrique * Dit aussi à "clé publique" * une clé privée * une clé public * un message chiffré avec une clé publique sera déchiffrable avec la clé privée associée * un message chiffré avec une clé privé sera déchiffrable avec la clé publique associée * plus complexe d'un simple secret à transmettre * demande plus de ressources * <i class="fa fa-thumbs-o-down"></i> gourmand en calcul * <i class="fa fa-thumbs-up"></i> le plus connu * [RSA](https://fr.wikipedia.org/wiki/Chiffrement_RSA) since 1977 * Algo à courbes elliptiques ## distribution des clés? * la clé publique est diffusable n'importe où * sur une page web * une carte de visite * un pièce jointe d'un message en clair * dans un chat * sur un serveur de clés * la clé privée est à protéger à tout prix * quiconque la possède peut se l'utiliser en se faisant passer pour vous ## Dans la vraie vie * Alice et Bob se sont chacun générées un couple de clé publique / clé privée * ils se sont échangés lors clés publiques * Alice a en sa possession * la clé publique d'Alice * la clé privée d'Alice * la clé publique de Bob * Bob a en sa possession * la clé publique de Bob * la clé privée de Bob * la clé publique d'Alice ## Chiffrement asymétrique ## Signature * Alice chiffre un message avec sa clé privée et l'envoi à Bob * Bob peut déchiffrer le message avec la clé publique d'Alice * Bob est alors sûr que le message a été émis avec la clé privée d'Alice * **Autentification de l'origine** <div style="text-align: center;"> <img src="images/TLS_Auth.gif" width="50%" /> </div> * Deux solutions pour cette vérification * Alice envoie le message en double * une fois en claire * une fois chiffré avec sa clé privée * Bob peut comparer la similarité du clair et du message déchiffré * Alice envoie * le message chiffré * un hashé chiffré du message * Bob peut vérifier * déchiffre le message avec la clé publique d'Alice * calcul le hashé du message en clair * déchiffré le hashé chiffré envoyé à Alice * comparer la simmilarité du hashé déchiffré et du hashé calculé * Bob à vérifier non seulement l'authenticité du message mais aussi son **intégrité** ### Les clés de Bob n'ont jamais été utilisée ## Chiffrement asymétrique ## Chiffrement * Bob veut maintenant écrire à Alice * qu'il sait être la vraie Alice * en tout cas celle qui possède la clé privée associée à la clé publique qu'Alice lui a donné * Bob chiffre le message avec la clé publique d'Alice * Bob envoie le texte chiffré * Alice déchiffre le message grâce à sa clé privée. * garanti la **confidentialité** <div style="text-align: center;"> <img src="images/Asymmetric_cryptography_step_1.svg.png" width="60%" /> </div> ## Chiffrement * Bob veut maintenant écrire à Alice * qu'il sait être la vraie Alice * en tout cas celle qui possède la cl privée associée à la clé publique qu'Alice lui a donné <div style="text-align: center;"> <img src="images/Asymmetric_cryptography_step_2.svg.png" width="60%" /> </div> * Bob chiffre le message avec la clé publique d'Alice * Bob envoie le texte chiffré * Alice déchiffre le message grâce à sa clé privée. * garanti la **confidentialité** <div style="text-align: center;"> <img src="images/Asymmetric_cryptography_step_1.svg.png" width="60%" /> </div> ## Eve * a récupéré la clé de Bob mal protégée * elle peut envoyer des messages chiffrés à Alice * en se faisant passer pour lui ## Bonne pratique * toujours signer et chiffrer ses messages * il faut être certain de l'identité du possesseur de la clé * chiffrofête (cryptoparty) * bien protéger sa clié privée * passphrase ## Certificat * clé publique * des informations * une signature ## Synthèse X.509 vs. PGP ### X.509 * Certificat créé par la CA * 1 seule signature : celle de la CA * Chiffre le tuyau (TLS/SSL) * Confiance centralisée * Confiance distribuée * Forêt d’arbres de confiance ### PGP * Certificat créé par l’utilisateur * Plusieurs signatures * Chiffre les messages * Graph orienté de confiance X.509 centralise PGP distribue