La cryptographie asymétrique avec RSA

Chiffrer ses données avec RSA

a marqué ce sujet comme résolu.

J'ai réécrit toute la deuxième moitié de « La taille, ça compte » et une bonne partie de « Qui es-tu, belle inconnue ? » pour être plus clair sur la question de la signature numérique et du chiffrement par blocs. Avec cette nouvelle version, en principe, la section « Parce que Snowden… » devient beaucoup plus claire. Dis-moi s'il y a encore des choses que tu ne comprends pas.

+0 -0

Dans « Comment l'autorité publique reprit la main », tu dis : « À l'occasion d'une rencontre en personne, Brunehaut et Adalbéron s'échangent leurs clés publiques respectives. ». Dans la vraie vie, comment se passe cette rencontre sûre ? Même question quand tu dis « Et c'est lui [Warnachaire] et lui seul qui distribue les clés publiques quand on les lui demande, et en main propre. »

+0 -0

C'est un réel problème. Dans l'idéal, il s'agit d'une rencontre physique. Quand cela n'est pas possible, c'est par l'intermédiaire d'un moyen de communication que les deux parties estiment protégé contre les attaques de l'homme du milieu, par exemple par téléphone. Le cas de Warnachaire est un peu différent : il peut envoyer la clé publique demandée en la signant de sa propre clé privée (cf. la suite de la section sur la mise en place d'une pyramide de certification). On peut aussi fournir une nouvelle clé publique en la signant avec son ancienne clé privée. Enfin, une autorité de certification pourra te demander de lui envoyer (protégé par le secret de sa propre clé publique), ta clé publique accompagnée d'une preuve que tu es bien la personne que tu prétends être (généralement une pièce d'identité).

J'ai rajouté un exemple en Haskell dans la partie pratique. Il faudrait mettre un troisième exemple, plutôt d'une fonction correspondant à la quatrième couche (le Haskell implémente des fonctions des deuxième et troisième couches, et le PHP une fonction de la cinquième couche). Par exemple, le formatage d'un message de n'importe quelle taille selon le cadre donné par l'OAEP. Mais de mon côté, j'ai un peu épuisé les langages que je connais : on ne parle pas de C/C++, j'ai fait PHP et Haskell, JavaScript serait vraiment dégueu et l'assembleur x86 serait ultra-galère. Peut-être du Python, mais je n'y connais rien.

Sinon, où en es-tu de ta lecture ? Je veux dire par là : quelles parties n'as-tu pas encore lues donc sur lesquelles es-tu susceptible d'avoir encore des remarques à faire ? Juste pour me faire une idée.

+0 -0

Il faudrait du coup le préciser dans le tutoriel. Parce qu'on a beau remonter dans la pyramide des AC, il faudra bien un jour ou l'autre recevoir la clé.

Le plus simple, je pense, serait que tu le fasse en PHP et je me chargerai de le traduire en Python.

J'ai terminé la lecture. A partir du bourrage papier, ça devient moins concret, moins précis, mais je pense que c'est dû au fait qu'il y a des notions complexes derrière, difficiles à expliquer dans le cadre du tutoriel.

+0 -0

J'ai ajouté une boite "Attention" à la fin de cette section pour expliquer tout ça succinctement.

En pseudo-code, la fonction oaep_base(msg) donnerait ça :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
SI longueur(msg) <= 64 // C'est à dire 512 bits
    Ajouter des 0 à la fin de msg jusqu'à ce que sa longueur soit égale à 512 bits
    R = Générer 256 bits soit 32 octets de données aléatoires // Python a os.urandom pour ça, je crois
    G = SHA-512(R) // La fonction de hachage SHA-512, disponible dans le module hashlib de Python
    X = msg (xor) G
    H = SHA-256(X) // Idem
    Y = H (xor) R
    Retourner X concaténé à Y // Donc X*(2**256) + Y si X et Y sont des nombres
SINON
    Ajouter des 0 à la fin de msg jusqu'à ce que la longueur du total soit un multiple de 512 bits
    Découper en tronçons de 512 bits
    Appliquer oaep_base() à chaque tronçon
    Retourner un tableau contenant tous les tronçons formatés

C'est assez clair ?

C'est ça : les attaques dont il est question deviennent de plus en plus complexes à mettre en œuvre. Il faut savoir que ça existe, mais on ne peut pas vraiment en faire de petites histoires avec Adalbéron et Brunehaut.

+0 -0

Je regarderai ça demain. Pour les schémas des personnages, je suis personnellement incapable de les dessiner. Donc soit on en prend sur le Oueb, soit on demande à quelqu'un du site, soit on n'en prend pas.

+0 -0

J'ai fait quelques recherches et j'ai trouvé ça.

D'une part, toutes ces images sont dans le domaine public donc on en fait ce qu'on veut. D'autre part, étant en noir et blanc, ça rendrait bien même en version imprimée.

+0 -0

Je ne parvenais pas à les placer horizontalement avec une légende. Mais tu as réglé le problème. :P

J'ai rajouté un schéma en dessous, pour présenter le contexte.

Sinon, il faudrait décrire avec précision ceux (et ce) qu'il reste à faire. ^^

Edit : le programme me donne du fil à retordre au niveau des types. On ne peut faire des opérations logiques que sur les entiers et la fonction hashlib.sha512 me retourne un objet de type _hashlib.HASH. Est-ce que l'algorithme fonctionnerait avec ça ? As-tu possibilité de le tester à la fin ?

+0 -0

Vraiment pas dégueu ton schéma du contexte. ^^ Pour ce qui reste à faire.

  • à la fin de « La taille, ça compte » : une image qui passe par une boite RSA et en ressort façon Canal+ sans décodeur. En version dégueue, ça donnerait un truc comme ça : http://i.imgur.com/ineRrLj.jpg avec une légende « Pour ne pas finir sur le Net comme une vulgaire JLaw, chiffrez vos photos. » Pour l'image de départ, j'avais pensé mettre une photo d'Angie Varona, mais j'ai peur que l'on trouve ça de mauvais goût. ^^
  • un schéma pour la cryptographie hybride : le message protégé par un cadenas, la clé de ce cadenas dans un coffre donné par Brunehaut, le tout envoyé avec la signature Quelques idées d'images : http://pixabay.com/fr/s%C3%A9curit%C3%A9-coffre-fort-verrouillage-33270/ https://openclipart.org/detail/122125/locks-by-dear_theophilus https://openclipart.org/detail/15982/simple-key-by-witchlines
  • un schéma pour SSL vs. WoT : d'un côté, une pyramide avec des flèches « certifie » du haut vers le bas et un agent de la NSA qui menace l'AC tout en haut, de l'autre, un réseau de flèches « certifie » à double sens et l'agent de la NSA qui se trouve con
  • le script Python dont on a parlé
+0 -0

L'algo donnerait ça. Je ne suis pas du tout sûr :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# -*- coding: utf8 -*-
import os
import hashlib

def xor_str(s1, s2):
  # Effectue un "ou exclusif" entre les deux chaînes
  return "".join(chr(ord(a) ^ ord(b)) for a, b in zip(s1, s2))

def oaep_base(msg):
  if len(msg) <= 64:
    # On complète la chaîne avec des "0" jusqu'à ce 
    # qu'elle ait une longueur de 64
    msg = msg + "0" * (64 - len(msg)) 

    # 32 octets de données aléatoires
    R = os.urandom(256) 

    # On crypte R
    G = hashlib.sha512(R)

    # XOR
    X = xor_str(msg, str(G))

    # On crypte X
    H = hashlib.sha256(X)

    # XOR
    Y = xor_str(str(H), str(R))

    return X + Y
  else:
    # len(msg) = 64 * q + len(msg)%64 
    # Donc len(msg) = 64 * (q+1) - 64 + len(msg)%64
    # Donc len(msg) + 64 - len(msg)%64 est un multiple de 64.
    msg = msg + "0" * (64 - len(msg)%64)

    # Découpage en tronçons de 512 bits i.e. 64 caractères
    data = [msg[64*i:64*(i+1)] for i in range(len(msg)/64)]

    # On applique oaep_base à chaque tronçon
    data = map(oaep_base, data)

    return data

if __name__ == "__main__":
  msg = "Brunehaut est une grosse vache."
  print oaep_base(msg)

  msg = "Brunehaut est une grooooooooooooooooooooooooooooooooooooooooooooooooosse vache."
  print oaep_base(msg)
+0 -0

Par contre, je ne suis pas certain de la correspondance "longueur(chaîne) = 64" et "512 bits".

J'essaye de m'occuper des schémas demain. Je te laise choisir une image appropriée pour « La taille, ça compte » et ta légende, en restant un minimum correct quand même (moi je m'en fiche, mais ce serait dommage de choquer certains lecteurs). =P

Je pense également qu'on peut supprimer l'ancienne version. Met-on en bêta avant de demander la validation ?

+0 -0

En principe, ça tombe juste.

La légende est très bien. :P Quant à l'image, t'as qu'à prendre celle-là : http://cs616217.vk.me/v616217326/1945b/DBH6rMwx9-U.jpg La demoiselle participe au concours Miss VK (l'équivalent russe de Facebook), donc je pense qu'elle ne nous en voudra pas d'utiliser sa photo.

J'ai supprimé l'ancienne version. Vu tous les retours que tu as faits, je ne pense pas qu'une étape de bêta soit nécessaire. En revanche, quand tu auras mis les images, je referai un dernier tour pour traquer les fautes d'orthographe et rajouter quelques intros/conclusions manquantes.

Cela étant, dans la mesure où le texte à été entièrement réécrit, je pense qu'il n'y a plus vraiment de raison que chabotsi reste dans la liste des auteurs : je suggère qu'on lui en parle, en proposant éventuellement de mettre une note sur le fait qu'il avait écrit la première version. En outre, sur la question des droits d'auteurs, la licence CC-BY ne me plaît pas, je préférerais mettre quelque chose de plus proche d'une CC BY-SA-NC : comme il ne reste plus rien du texte d'origine, je peux me le permettre. Mais je voudrais avoir ta position sur le sujet pour les images et ton bout de code (je compte placer les miens sous CeCIll, l'équivalent français de la GPL).

+0 -0
Ce sujet est verrouillé.