Skip to content
Snippets Groups Projects
crypto.md 10.7 KiB
Newer Older
mazenovi's avatar
mazenovi committed
# 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

![bâton de plutarque](images/crypto/scytale.png)


## 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