# 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é** * le secret permet de chiffrer **et** de déchiffrer * plus le secret est **long** plus il est difficile de le 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  ## Chiffrement symétrique ### communications 2 à 2 pour n * Une clé par destinataire * pour n destiantaires * n * (n-1) / 2 clés * démultiplication des clés ## Vecteur d'intialisation * Avoir la garantie que les chiffrés sont uniques * Se stocke en clair * n'est utilisable qu'avec le secret * Deux messages identiques chiffrés avec de **vi** différents auront des chiffrés différents ``` $crypt = openssl_encrypt("all in clear", "aes128", "secret"); ``` <pre><code class="hljs bash"" style="font-size: 16px">PHP Warning: openssl_encrypt(): Using an empty Initialization Vector (iv) is potentially insecure and not recommended in /data/htdocs/blog.limos.fr/tmp.php on line 4 Warning: openssl_encrypt(): Using an empty Initialization Vector (iv) is potentially insecure and not recommended in /data/htdocs/blog.limos.fr/tmp.php on line 4</code></pre> ## Vecteur d'intialisation ### Right way <pre><code class="hljs bash"" style="font-size: 18px">$iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length("aes128")); $crypt = openssl_encrypt("all in clear", "aes128", "secret", true, $iv); $clear = openssl_decrypt($crypt, "aes128", "secret", true , $iv); </code></pre> note: - https://stackoverflow.com/questions/11821195/use-of-initialization-vector-in-openssl-encrypt ## Chiffrement asymétrique * Dit aussi à **clé publique** * une clé privée * une clé publique * 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 ## Chiffrement asymétrique * La clé publique doit être connue de l'expéditeur * 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 un serveur de clés * sur une page web * via une carte de visite * via une pièce jointe * via un chat * la **clé privée** est à protéger à tout prix * quiconque la possède peut l'utiliser en se faisant passer pour son propriétaire légitime #### En pratique * Alice et Bob se sont chacun générés un couple **clé publique** / **clé privée** * Ils se sont **échangés** leur **clé publique** respective * Alice a en sa possession * sa **clé publique**, sa **clé privée** et la **clé publique** de Bob * Bob a en sa possession * sa **clé publique**, sa **clé privée** et la **clé publique** d'Alice ## 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** #### Signature en pratique * Alice envoie * le message chiffré * un hashé chiffré du message * Bob peut vérifier en * déchiffrant le message avec la clé publique d'Alice * calculant le hashé du message en clair * déchiffrant le hashé chiffré envoyé par Alice * comparant le hashé calculé et le hashé déchiffré ## Signature en pratique * Bob a pu vérifier * la clé à l'origine du message **autentification de l'origine** * l'**intégrité** du message **autentification de l'origine** + **intégrité** = **non répudiation** #### Les clés de Bob n'ont jamais été utilisées ## 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. * Garantie de la **confidentialité** ## Enjeu de la clé privée * Eve a récupéré la **clé privée** de Bob (mal protégée) * elle peut envoyer des messages chiffrés à Alice, et à tout ceux qui font confiance à la clé publique de Bob * en se faisant passer pour Bob * elle peut lire tous les messages chiffrés avec la **clé publique** de Bob (à destination de Bob) ## Bonne pratique * Toujours signer et chiffrer ses messages * Toujours être certain de l'identité du possesseur de la clé * échange de clé IRL * Bien protéger sa clé privée * stockée en sécurité * dans un keepass? * dans un coffre? * sur papier? * protégée par un mot de passe fort ## Certificat * Clé publique * Attributs * nom * mail * date d'expiration * algorithmes * ... * Au moins une signature ## Trousseau * Ensemble de clés * couples clé publique / clé privée * différentes fonctions * signature * chiffrement * création de certificat * authentification * clés publiques * importés (contacts)