Skip to content
Snippets Groups Projects
crypto.md 9.98 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


mazenovi's avatar
mazenovi committed
## Opérations cryptographiques
mazenovi's avatar
mazenovi committed

mazenovi's avatar
mazenovi committed
* Agit sur une donnée en claire
mazenovi's avatar
mazenovi committed
  * une chaîne caractère
  * un fichier texte
  * un fichier multimédia
  * une archive

mazenovi's avatar
mazenovi committed
* Appelé aussi le **clair**
mazenovi's avatar
mazenovi committed

mazenovi's avatar
mazenovi committed
* Le but de la protéger
mazenovi's avatar
mazenovi committed


## Hacher (to hash)

mazenovi's avatar
mazenovi committed
* Hash / Empreinte / Condensat
* Taille fixe (quelques octets)
* Chaque **clair** a un hash unique
mazenovi's avatar
mazenovi committed
  * collision = cassé
mazenovi's avatar
mazenovi committed
* Pas d’opération inverse
* On parle de hashage
mazenovi's avatar
mazenovi committed


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

mazenovi's avatar
mazenovi committed
* [Force brute](https://fr.wikipedia.org/wiki/Attaque_par_force_brute)
mazenovi's avatar
mazenovi committed
  * testé toutes les possibilités (online / offline)
mazenovi's avatar
mazenovi committed
* [Par dictionnaire](https://fr.wikipedia.org/wiki/Attaque_par_dictionnaire)
mazenovi's avatar
mazenovi committed
  * 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)

mazenovi's avatar
mazenovi committed
* Hasher en concaténant la donnée en claire avec une chaîne de caractères pseudo-aléatoires
mazenovi's avatar
mazenovi committed

mazenovi's avatar
mazenovi committed
* Stocker le sel au niveau de l'enregistrement de l'utilisateur
mazenovi's avatar
mazenovi committed
  * évite les attaques par tables arc-en-ciel
  * n'évite pas la force brute / ni les attaques par dictionnaire

mazenovi's avatar
mazenovi committed
* On parle de salaison
mazenovi's avatar
mazenovi committed


## Saler (to salt)

<pre><code class="hljs bash" style="font-size: 14px">sha256("hello"."bv5PehSMfV11Cd") = d1d3ec2e6f20fd420d50e2642992841d8338a314b8ea157c9e18477aaef226ab</code></pre>

mazenovi's avatar
mazenovi committed
* Utilisé notamment pour le stockage des mots de passe en base de données
mazenovi's avatar
mazenovi committed
  * [Salted Password Hashing - Doing it Right](https://crackstation.net/hashing-security.htm)


## Coder (to encode)

mazenovi's avatar
mazenovi committed
* Changer la manière de stocker la donnée en clair
mazenovi's avatar
mazenovi committed
  * 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

mazenovi's avatar
mazenovi committed
  <pre><code class="hljs bash" style="font-size: 25px">base64_encode("all in clear") = YWxsIGluIGNsZWFy</code></pre>
mazenovi's avatar
mazenovi committed

mazenovi's avatar
mazenovi committed
  * opération inverse décoder (to decode)
mazenovi's avatar
mazenovi committed

mazenovi's avatar
mazenovi committed
  <pre><code class="hljs bash" style="font-size: 25px">base64_decode("YWxsIGluIGNsZWFy") = all in clear</code></pre>
mazenovi's avatar
mazenovi committed


## Chiffrer (to encrypt)

mazenovi's avatar
mazenovi committed
* Rendre la compréhension de la donnée en claire impossible à quiconque ne possède pas le secret (la **clé** pour la lire)
mazenovi's avatar
mazenovi committed
  * on parle de chiffrement

mazenovi's avatar
mazenovi committed
  <pre><code class="hljs bash" style="font-size: 16px">openssl_encrypt("all in clear","aes128","secret") = d2xhqzZbLFzoCP6vNfdVOg==</code></pre>
mazenovi's avatar
mazenovi committed

mazenovi's avatar
mazenovi committed
  * opération inverse déchiffrer (to decrypt)
mazenovi's avatar
mazenovi committed

mazenovi's avatar
mazenovi committed
  <pre><code class="hljs bash" style="font-size: 16px">openssl_decrypt("d2xhqzZbLFzoCP6vNfdVOg==","aes128","secret") = all in clear</code></pre>
mazenovi's avatar
mazenovi committed

* 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é**
mazenovi's avatar
mazenovi committed
    * le secret permet de chiffrer **et** de déchiffrer
    * plus le secret est **long** plus il est difficile de le deviner
mazenovi's avatar
mazenovi committed
    * <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

mazenovi's avatar
mazenovi committed
![Bâton de plutarque](images/crypto/scytale.png)
mazenovi's avatar
mazenovi committed


mazenovi's avatar
mazenovi committed
## Chiffrement symétrique
### communications 2 à 2 pour n
mazenovi's avatar
mazenovi committed

mazenovi's avatar
mazenovi committed
* Une clé par destinataire
mazenovi's avatar
mazenovi committed
  * pour n destiantaires
    * n * (n-1) / 2 clés
    * démultiplication des clés
mazenovi's avatar
mazenovi committed


mazenovi's avatar
mazenovi committed
## Vecteur d'intialisation
mazenovi's avatar
mazenovi committed

mazenovi's avatar
mazenovi committed
* Avoir la garantie que les chiffrés sont uniques
* Se stocke en clair
mazenovi's avatar
mazenovi committed
  * n'est utilisable qu'avec le secret
mazenovi's avatar
mazenovi committed
* Deux messages identiques chiffrés avec de **vi** différents auront des chiffrés différents
mazenovi's avatar
mazenovi committed

mazenovi's avatar
mazenovi committed
```
$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>
mazenovi's avatar
mazenovi committed


mazenovi's avatar
mazenovi committed
## Vecteur d'intialisation

### Right way
mazenovi's avatar
mazenovi committed

mazenovi's avatar
mazenovi committed
<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
mazenovi's avatar
mazenovi committed


## Chiffrement asymétrique

mazenovi's avatar
mazenovi committed
* Dit aussi à **clé publique**
mazenovi's avatar
mazenovi committed
  * une clé privée
mazenovi's avatar
mazenovi committed
  * une clé publique
mazenovi's avatar
mazenovi committed

mazenovi's avatar
mazenovi committed
* 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
mazenovi's avatar
mazenovi committed

mazenovi's avatar
mazenovi committed

## Chiffrement asymétrique

mazenovi's avatar
mazenovi committed
* La clé publique doit être connue de l'expéditeur
mazenovi's avatar
mazenovi committed
  * plus complexe d'un simple secret à transmettre

mazenovi's avatar
mazenovi committed
* Demande plus de ressources
mazenovi's avatar
mazenovi committed

mazenovi's avatar
mazenovi committed
* <i class="fa fa-thumbs-o-down"></i> Gourmand en calcul
mazenovi's avatar
mazenovi committed

mazenovi's avatar
mazenovi committed
* <i class="fa fa-thumbs-up"></i> Le plus connu
mazenovi's avatar
mazenovi committed
    * [RSA](https://fr.wikipedia.org/wiki/Chiffrement_RSA) since 1977
    * Algo à courbes elliptiques


## distribution des clés?

mazenovi's avatar
mazenovi committed
* la **clé publique** est diffusable n'importe où
mazenovi's avatar
mazenovi committed
  * sur un serveur de clés
mazenovi's avatar
mazenovi committed
  * sur une page web
mazenovi's avatar
mazenovi committed
  * via une carte de visite
mazenovi's avatar
mazenovi committed
  * via une pièce jointe
  * via un chat
mazenovi's avatar
mazenovi committed

mazenovi's avatar
mazenovi committed
* la **clé privée** est à protéger à tout prix
mazenovi's avatar
mazenovi committed
  * quiconque la possède peut l'utiliser en se faisant passer pour son propriétaire légitime
mazenovi's avatar
mazenovi committed


mazenovi's avatar
mazenovi committed
#### En pratique
mazenovi's avatar
mazenovi committed

* Alice et Bob se sont chacun générés un couple **clé publique** / **clé privée**
mazenovi's avatar
mazenovi committed
* Ils se sont **échangés** leur **clé publique** respective
mazenovi's avatar
mazenovi committed

* Alice a en sa possession
mazenovi's avatar
mazenovi committed
  * sa **clé publique**, sa **clé privée** et la **clé publique** de Bob
mazenovi's avatar
mazenovi committed

* Bob a en sa possession
mazenovi's avatar
mazenovi committed
  * sa **clé publique**, sa **clé privée** et la **clé publique** d'Alice
mazenovi's avatar
mazenovi committed


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


mazenovi's avatar
mazenovi committed
#### Signature en pratique
mazenovi's avatar
mazenovi committed

mazenovi's avatar
mazenovi committed
* Alice envoie
  * le message chiffré
  * un hashé chiffré du message
mazenovi's avatar
mazenovi committed

mazenovi's avatar
mazenovi committed
* 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é
mazenovi's avatar
mazenovi committed


mazenovi's avatar
mazenovi committed
## Signature en pratique
mazenovi's avatar
mazenovi committed

mazenovi's avatar
mazenovi committed
* Bob a pu vérifier
  * la clé à l'origine du message: **autentification de l'origine**
mazenovi's avatar
mazenovi committed
  * 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
mazenovi's avatar
mazenovi committed


## Chiffrement

* Bob veut maintenant écrire à Alice
  * qu'il sait être la vraie Alice
mazenovi's avatar
mazenovi committed
    * en tout cas celle qui possède la clé privée associée à la clé publique qu'Alice lui a donné
mazenovi's avatar
mazenovi committed
* 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.

mazenovi's avatar
mazenovi committed
* Garantie de la **confidentialité**
mazenovi's avatar
mazenovi committed


mazenovi's avatar
mazenovi committed
## Enjeu de la clé privée
mazenovi's avatar
mazenovi committed

mazenovi's avatar
mazenovi committed
* Eve a récupéré la **clé privée** de Bob (mal protégée)
mazenovi's avatar
mazenovi committed
  * elle peut envoyer des messages chiffrés à Alice, et à tout ceux qui font confiance à la clé publique de Bob
mazenovi's avatar
mazenovi committed
    * en se faisant passer pour Bob
mazenovi's avatar
mazenovi committed
  * elle peut lire tous les messages chiffrés avec la **clé publique** de Bob (à destination de Bob)
mazenovi's avatar
mazenovi committed


## Bonne pratique

mazenovi's avatar
mazenovi committed
* Toujours signer et chiffrer ses messages
* Toujours être certain de l'identité du possesseur de la clé
mazenovi's avatar
mazenovi committed
  * échange de clé IRL
mazenovi's avatar
mazenovi committed
* Bien protéger sa clé privée
mazenovi's avatar
mazenovi committed
  * stockée en sécurité
mazenovi's avatar
mazenovi committed
    * dans un keepass?
    * dans un coffre?
    * sur papier?
mazenovi's avatar
mazenovi committed
  * protégée par un mot de passe fort
mazenovi's avatar
mazenovi committed


## Certificat

mazenovi's avatar
mazenovi committed
* Clé publique
* Attributs
mazenovi's avatar
mazenovi committed
  * nom
  * mail
  * date d'expiration
  * algorithmes
  * ...
mazenovi's avatar
mazenovi committed
* Au moins une signature
mazenovi's avatar
mazenovi committed


## Trousseau

mazenovi's avatar
mazenovi committed
* Ensemble de clés
mazenovi's avatar
mazenovi committed
  * couples clé publique / clé privée
mazenovi's avatar
mazenovi committed
    * différentes fonctions
mazenovi's avatar
mazenovi committed
      * signature
      * chiffrement
      * création de certificat
      * authentification
  * clés publiques
    * importés (contacts)