@Max ok en fait ton problème semble être que tu ne connais pas le concept de signature cryptographique.
Ce concept est basé sur les clés asymétriques : ce qu’une clé chiffre l’autre le déchiffre.
Tu a donc deux cas d’utilisation possible :
-
chiffrer avec la clé publique et déchiffrer avec la clé privée => utilisé pour communiquer un message confidentiel (par exemple un mail chiffré)
-
chiffrer avec la clé privé puis déchiffrer avec la clé publique => utilisé pour la signature numérique.
Comme le chiffrement asymétrique est très lent, et que le but d’une signature n’est pas de cacher le contenu d’un document mais seulement de le “signer”, on signe seulement le hash du document, avec la fonction de hashage de notre choix (dans le protocole duniter c’est actuellement du sha256).
Donc l’individu qui souhaite signer un document chiffre le hash de ce document avec sa clé privée et ajoute ce hash chiffré a la fin du document. C’est ce hash chiffré que l’on nomme signature, hash chiffré = signature.
De là, toute personne ou tout programme qui reçoit ce document peut déchiffrer la signature avec la clé publique du prétendu signataire, et il doit trouver en sortie le hash en clair du document, hash en clair qu’il va vérifier en hashant lui même le document, si les deux hash sont identiques la signature est valide, s’il sont différents la signature est invalide. (c’est pour ça qu’il faut se mettre d’accord sur la fonction de hashage utilisée).
L’explication vidéo en 2min : https://youtu.be/Sx7ZNDppxQc
Dans le cas précis de duniter nous utilisons l’algo de chiffrement asymétrique ed25519, qui a l’avantage de permettre de générer une paire de clé très rapidement, ainsi il n’y a pas besoin des stocker ta clé privée contrairement a PGP par exemple, ta clé privée est régénérée a chaque fois que tu saisie ton couple (id secret+password), mais attention la clé privée n’est pas un hash de ton (id secret+password), c’est une opération mathématique complexe qui nécessite une librairie de crypto comme libsodium
ou nacl
.
Ceci étant la puce client n’a pas besoin se savoir générer la clé privée, elle pourrais la stockée directement mais chiffré par un code pin. Les 3 seules choses que la puce client doit savoir faire c’est :
- donner sa clé publique sur demande (stockée en clair sur la puce client)
- déchiffré la clé privée stockée vie le code pin que lui donne le terminal commerçant
- chiffré le hash que lui donne le terminal avec la clé privée et retourner ce hash chiffré au terminal commerçant, c’est tout.
Ainsi ce que doit faire le terminal commerçant c’est :
- mémoriser le montant M saisi par le commerçant
- lire la clé publique sur la puce client
- récupéré sur le réseau les sources correspondantes a la clé publique du client et créer le document transaction // Et en parallèle demander au client de saisir son code pin
- Envoyer a la puce client le hash sha256 du document transaction + le code pin
- récupérer le hash chiffré = signature qui lui renvoi le puce client
- vérifier la validité de cette signature
- Si la signature est valide, transmettre le document transaction signé au réseau duniter