Newer
Older
# 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
* une chaîne caractère
* un fichier texte
* un fichier multimédia
* une archive
* Hash / Empreinte / Condensat
* Taille fixe (quelques octets)
* Chaque **clair** a un hash unique
## 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)
* [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
* évite les attaques par tables arc-en-ciel
* n'évite pas la force brute / ni les attaques par dictionnaire
## 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)
* 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>
<pre><code class="hljs bash" style="font-size: 25px">base64_decode("YWxsIGluIGNsZWFy") = all in clear</code></pre>
* Rendre la compréhension de la donnée en claire impossible à quiconque ne possède pas le secret (la **clé** pour la lire)
<pre><code class="hljs bash" style="font-size: 16px">openssl_encrypt("all in clear","aes128","secret") = d2xhqzZbLFzoCP6vNfdVOg==</code></pre>
<pre><code class="hljs bash" style="font-size: 16px">openssl_decrypt("d2xhqzZbLFzoCP6vNfdVOg==","aes128","secret") = all in clear</code></pre>
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
* 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
* pour n destiantaires
* n * (n-1) / 2 clés
* démultiplication des clés
* Avoir la garantie que les chiffrés sont uniques
* Se stocke en clair
* 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>
<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
* 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
* [RSA](https://fr.wikipedia.org/wiki/Chiffrement_RSA) since 1977
* Algo à courbes elliptiques
## distribution des clés?
* quiconque la possède peut l'utiliser en se faisant passer pour son propriétaire légitime
* Alice et Bob se sont chacun générés un couple **clé publique** / **clé privée**
* sa **clé publique**, sa **clé privée** et la **clé publique** de Bob
* 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**
* 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é
* 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.
* elle peut envoyer des messages chiffrés à Alice, et à tout ceux qui font confiance à la clé publique de Bob
* elle peut lire tous les messages chiffrés avec la **clé publique** de Bob (à destination de Bob)
* Toujours signer et chiffrer ses messages
* Toujours être certain de l'identité du possesseur de la clé
* nom
* mail
* date d'expiration
* algorithmes
* ...