Outils pour utilisateurs

Outils du site


nsi:tds:cryptographie:blockchain

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
Prochaine révision
Révision précédente
nsi:tds:cryptographie:blockchain [2023/04/11 19:26] goupillwikinsi:tds:cryptographie:blockchain [2023/05/08 01:14] (Version actuelle) goupillwiki
Ligne 110: Ligne 110:
 <WRAP tip>On peut indiquer l'empreinte de chaque bloc dans sa version ''hexdigest'', c'est du texte et c'est plus simple.</WRAP> <WRAP tip>On peut indiquer l'empreinte de chaque bloc dans sa version ''hexdigest'', c'est du texte et c'est plus simple.</WRAP>
  
-==== Signature ====+=== Signature ===
  
 Dans la transaction ''%%("Paul", "Judith", 5, S)%%'', la signature ''S'' permet d'être certain que Paul est bien à l'origine de la transaction. Dans la transaction ''%%("Paul", "Judith", 5, S)%%'', la signature ''S'' permet d'être certain que Paul est bien à l'origine de la transaction.
Ligne 117: Ligne 117:
   * Paul veut donner 5 unité à Judith. On crée le texte ''%%T = "Paul;Judith;5"%%''   * Paul veut donner 5 unité à Judith. On crée le texte ''%%T = "Paul;Judith;5"%%''
   * on encode le texte et on hache. On utilise pour cela ''hashlib'' :\\ ''%%z = hashlib.sha256(T.encode('utf8'))%%''   * on encode le texte et on hache. On utilise pour cela ''hashlib'' :\\ ''%%z = hashlib.sha256(T.encode('utf8'))%%''
-  * on calcule la signature ''S'' par chiffrement de ''z'' en utilisant la clé privée de Paul :\\ ''%%S = rsa.cypher(z, Kpr)%%''\\ on utilise {{ :nsi:tds:cryptographie:rsa.py |}} correspondant à ce que l'on a vu dans le [[nsi:terminales:securite:rsa|cours RSA]]+  * on calcule la signature ''Sb'' par chiffrement de ''z'' en utilisant la clé privée de Paul :\\ ''%%S = rsa.cypher(z, Kpr)%%''\\ on utilise {{ :nsi:tds:cryptographie:rsa.py |}} correspondant à ce que l'on a vu dans le [[nsi:terminales:securite:rsa|cours RSA]] 
 +  * ''Sb'' est de type ''bytes''. On préfère une écriture texte hexadécimale. On peut calculer ''S = Sb.hex()''.
   * la transaction est alors complétée : ''%%("Paul", "Judith", 5, S)%%''   * la transaction est alors complétée : ''%%("Paul", "Judith", 5, S)%%''
  
-Dans l'exemple, la signature est un long ''bytes'' :+Dans l'exemple, la signature est :
  
 <code python> <code python>
-b"\x12\xd1\xcc\x8b'\x16O\xdcD\x0b\xde\x81\x904\x7f\xe0HD\x89\xbf\x9e\x04\xe7\x1f,\xd6\xed\xf1\x82\x91\r\xd4\x93\xc0,h\xbf\x01\xfau*)\x7f\xa3L5\x8djE\x1d\xef\xfcw\xdf9\xb3"+'12d1cc8b27164fdc440bde8190347fe0484489bf9e04e71f2cd6edf182910dd493c02c68bf01fa752a297fa34c358d6a451deffc77df39b3'
 </code> </code>
  
Ligne 130: Ligne 131:
   * comme dans ce qui précède, on produit le texte ''%%T = "Paul;Judith;5"%%'',   * comme dans ce qui précède, on produit le texte ''%%T = "Paul;Judith;5"%%'',
   * on hache ce texte : ''%%z = hashlib.sha256(T.encode('utf8'))%%''   * on hache ce texte : ''%%z = hashlib.sha256(T.encode('utf8'))%%''
-  * on déchiffre ''S'' avec la ''Kpu'' de Paul : ''%%z2 = rsa.decypher(S, Kpu)%%''+  * on cherche la version ''bytes'' de ''S'' : ''Sb = bytes.from_hex(S)'' 
 +  * on déchiffre ''Sb'' avec la ''Kpu'' de Paul : ''%%z2 = rsa.decypher(Sb, Kpu)%%''
   * on compare si ''z == z2''. Si oui, la signature est valide.   * on compare si ''z == z2''. Si oui, la signature est valide.
  
Ligne 223: Ligne 225:
 # blockchain.py # blockchain.py
 import hashlib import hashlib
 +import os
 import rsa import rsa
  
Ligne 239: Ligne 242:
         """         """
         # mettre empreinte_precedent,         # mettre empreinte_precedent,
-        # suivi du version texte de data+        # suivi de la version texte de data (__str__ ci dessous)
         # encoder en utf8 pour obtenir un bytes b         # encoder en utf8 pour obtenir un bytes b
         # faire le hash  avec hashlib.sha256(b)         # faire le hash  avec hashlib.sha256(b)
Ligne 253: Ligne 256:
         """         """
         sauvegarde le bloc dans un fichier dont le nom est l'empreinte         sauvegarde le bloc dans un fichier dont le nom est l'empreinte
-        du bloc précédent suivit de l'extension .bloc+        du bloc précédent suivit de l'extension .blc
         """         """
         # le fichier doit contenir le contenu de __str__         # le fichier doit contenir le contenu de __str__
-        # si le fichier existe, il ne faut rien faire+        # si le fichier existe déjà, il ne faut rien faire 
 +         
 +    def next_filename(self) -> str: 
 +        """ 
 +        renvoie le nom de fichier du bloc suivant 
 +        """ 
 +        return self.FOLDER + self.empreinte() + self.EXT    
  
  
Ligne 264: Ligne 273:
         lance la procédure de chargement pour construire la blockchain         lance la procédure de chargement pour construire la blockchain
         """         """
 +        self.blocs = []
 +        self.keys = {}
 +        self.credits = {}
         self.load()         self.load()
  
Ligne 277: Ligne 289:
         #   empreinte du bloc         #   empreinte du bloc
         # créer le bloc0 avec les infos du fichier mettre bloc0 dans self.blocs         # créer le bloc0 avec les infos du fichier mettre bloc0 dans self.blocs
-        # créer un self.comptes = { identifiant: (compte, n, e) } pour stocker +        # créer un self.keys = { identifiant: (n, e) } pour stocker les clés des comptes 
-        #   les infos sur les comptes+        # créer un self.credits = { identifiant: credit } pour stocker les crédits des comptes
         # à partir de là, tant que l'empreinte du dernier bloc correspond à un fichier,         # à partir de là, tant que l'empreinte du dernier bloc correspond à un fichier,
         # charger le fichier, lire la transaction, l'ajouter à la chaîne         # charger le fichier, lire la transaction, l'ajouter à la chaîne
          
 +        # pour info, on peut obtenir les noms de fichiers en faisant :
 +        # fichiers = [f for f in os.listdir('./') if f.endswith('.blc')]
 +        
     def add_transaction(id_source:str, id_cible:str, value:int, s:str) -> bool:     def add_transaction(id_source:str, id_cible:str, value:int, s:str) -> bool:
         """         """
Ligne 293: Ligne 308:
         # vérifie la signature         # vérifie la signature
         # vérifie si le compte source a assez de crédits         # vérifie si le compte source a assez de crédits
 +        # modifie l'état des comptes concernés
         # crée un bloc pour la transaction         # crée un bloc pour la transaction
         #   en indiquant l'empreinte du dernier bloc pour l'empreinte précédente         #   en indiquant l'empreinte du dernier bloc pour l'empreinte précédente
         # ajoute le bloc dans la liste des blocs         # ajoute le bloc dans la liste des blocs
         # sauvegarder le bloc         # sauvegarder le bloc
-        # modifie l'état des comptes concernés 
  
     def empreinte_transaction(self, id_source:str, id_cible:str, value:int) -> bytes:     def empreinte_transaction(self, id_source:str, id_cible:str, value:int) -> bytes:
Ligne 304: Ligne 319:
         id_cible: identifiant cible         id_cible: identifiant cible
         value: quantité  à transférer         value: quantité  à transférer
-        renvoie l'empreinte+        renvoie l'empreinte sous forme digest
         """         """
         # fabrique le texte formé de la façon id_source;id_cible;value         # fabrique le texte formé de la façon id_source;id_cible;value
-        # encode, hash, +        # encode, hash 
-        # renvoie digest()+        # renvoie digest
  
-    def compte(self, identifiant:str) -> int:+    def credit(self, identifiant:str) -> int:
         """         """
-        renvoie la valeur de compte pour identifiant+        renvoie la valeur de crédit pour identifiant
         """         """
 </code> </code>
Ligne 366: Ligne 381:
 judith = Client("Judith", (16218573123863373407, 6385025328607971353)) judith = Client("Judith", (16218573123863373407, 6385025328607971353))
  
-print(f"Le compte actuel de Paul est de {b.compte('Paul')}"+print(f"Le compte actuel de Paul est de {b.credit('Paul')}"
-print(f"Le compte actuel de Judith est de {b.compte('Judith')}")+print(f"Le compte actuel de Judith est de {b.credit('Judith')}")
 t = paul.transaction("Judith", 5) t = paul.transaction("Judith", 5)
 success = b.add_transaction(*t) # * pour ventiler les morceaux du tuple t dans les arguments success = b.add_transaction(*t) # * pour ventiler les morceaux du tuple t dans les arguments
nsi/tds/cryptographie/blockchain.1681234007.txt.gz · Dernière modification : de goupillwiki