Partage
  • Partager sur Facebook
  • Partager sur Twitter

chiffre de vernam

Sujet résolu
    28 octobre 2010 à 14:54:15

    salut =)

    Voila je fais des recherches depuis quelques temps sur la cryptographie et je me demandais si un programme en python existait pour cela ou est ce qu'il faut que je le code moi mème ?

    Merci =)
    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      28 octobre 2010 à 15:05:30

      incomplet ! Tu peux faire plus précis comme question

      • Partager sur Facebook
      • Partager sur Twitter
        28 octobre 2010 à 15:15:04

        existe il un programme permettant de chiffrer le texte contenue dans un fichier par la methode de vernam et ceci en utilisant comme masque le texte contenue dans un autre fichier
        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          28 octobre 2010 à 15:20:43

          Tu devras le coder toi même :)
          • Partager sur Facebook
          • Partager sur Twitter
            28 octobre 2010 à 15:30:24

            ça tombe bien je viens de commencer =)

            EDIT : encore une petite question : je sais que la fonction ord() permet de renvoyer la valeur correspondant a une lettre (a=1) ... seulement existe il une fonction qui a un nombre renvoi la lettre qui lui correspond ???
            • Partager sur Facebook
            • Partager sur Twitter
              28 octobre 2010 à 15:51:28

              autant pour moi c'est bon j'ai trouver (chr pour les intéressés)

              #!/usr/bin/env python
              # -*- coding: utf-8 -*-
              
              from string import lowercase, lower
              
              #Programme de Cryptographie par la méthode du masque jetable
              
              #focntion chargée de compter les lettres du message 
              def compte_lettre(fichier):
              	total = 0
              	
              	for ligne in open(fichier):
              		for car in ligne:
              			total+=1
              
              	return total-1
              
              #Fonction qui remplie une liste en fonction d'un fichier avec un nombre d'éléments égal à la longueur du message
              def remplir_masque(fichier,taille):
              	masque=[]
              	for ligne in open(fichier):
              		for car in ligne:
              			car=lower(car)
              			if len(masque)<taille and car in lowercase:
              				masque.append(car)
              	return masque
              
              #On met le message dans une liste	
              def remplir_message(fichier):
              	liste=[]
              	for ligne in open(fichier):
              		for car in ligne:
              			car=lower(car)
              			liste.append(car)
              	return liste
              
              #Et enfin on le chiffre
              def chiffrer(mess,masque,longu):
              	message_chiffre=[]
              	for j in range(longu):
              		a=(ord(masque[j]))-96
              		b=(ord(mess[j]))-96
              		add=(a+b)%26		
              		if chr(add+95) == '`':
              			message_chiffre.append('z')
              		else:
              			message_chiffre.append(chr(add+95))
              	return message_chiffre
              	
              nb_lettres=compte_lettre("message.txt")			
              masque=remplir_masque("masque.txt",nb_lettres)
              message=remplir_message("message.txt")
              message.remove('\n')	
              message_chiffre=chiffrer(message,masque,nb_lettres)
              
              print " ###### Programme de cryptographie par la methode de vernam  ###### "
              print "message : %s"%(message)
              print "masque  : %s"%(masque)		
              print "Chiffre : %s"%(message_chiffre)
              


              Voici mon code final =)
              • Partager sur Facebook
              • Partager sur Twitter
                29 octobre 2010 à 18:21:44

                Si quelqun pouvait me dire ce qu'il en pense ... Merci =)
                • Partager sur Facebook
                • Partager sur Twitter
                Anonyme
                  29 octobre 2010 à 18:40:04

                  En ce qui concerne la fonction chargée de compter les lettres du message, tu comptes les espaces?

                  Citation

                  On met le message dans une liste



                  Pourquoi ?

                  Peut-être n'ai-je pas compris ce que tu veux faire, mais quelle est la différence entre

                  "bonjour les amis" et ['bonjour les amis'] ?
                  • Partager sur Facebook
                  • Partager sur Twitter
                    29 octobre 2010 à 19:24:36

                    Citation : Mathieu__71

                    Si quelqun pouvait me dire ce qu'il en pense



                    Tu ne précises pas trop, en particulier ce qu'est masque.txt (pour moi, c'est la clé et elle est censée contenir autant de caractères que le message à chiffrer, en tous cas d'après ce que je sais du chiffrement de Vernam comme expliqué dans le livre de Zémor). A vue d'oeil, ça me semble assez compliqué, en particulier ta fonction de chiffrement mais j'ai pas le temps de regarder en détail. Juste au passage, le module string est obsolète et ne sert quasiment pas en pratique sauf pour des détails.
                    • Partager sur Facebook
                    • Partager sur Twitter
                      29 octobre 2010 à 19:33:16

                      Citation : candide

                      Citation : Mathieu__71

                      Si quelqun pouvait me dire ce qu'il en pense



                      Tu ne précises pas trop, en particulier ce qu'est masque.txt (pour moi, c'est la clé et elle est censée contenir autant de caractères que le message à chiffrer, en tous cas d'après ce que je sais du chiffrement de Vernam comme expliqué dans le livre de Zémor). A vue d'oeil, ça me semble assez compliqué, en particulier ta fonction de chiffrement mais j'ai pas le temps de regarder en détail. Juste au passage, le module string est obsolète et ne sert quasiment pas en pratique sauf pour des détails.



                      Tu peux avoir le détail ici : http://fr.wikipedia.org/wiki/Masque_jetable

                      Citation : fred1599

                      En ce qui concerne la fonction chargée de compter les lettres du message, tu comptes les espaces?

                      Citation

                      On met le message dans une liste



                      Pourquoi ?

                      Peut-être n'ai-je pas compris ce que tu veux faire, mais quelle est la différence entre

                      "bonjour les amis" et ['bonjour les amis'] ?



                      Merci pour la remarque en effet il faut modifié par : if car in lowercase: total+=1 car l'espace n'est pas contenue dans lowercase, de plus la différence est que "bonjour" devient ['b','o','n','j','o','u','r']
                      • Partager sur Facebook
                      • Partager sur Twitter
                      Anonyme
                        29 octobre 2010 à 19:43:29

                        Y'a pas mal de choses à voir (ou revoir) dans ton script Mathieu.

                        Déjà tu devrais ouvrir tes fichiers en mode binaire:
                        f = open(file, 'rb')
                        data = f.read()
                        f.close()
                        


                        Ensuite tu pourras avoir la taille du fichier simplement avec len(data) . Et du fais de manipuler un objet 'bytes' tu n'auras pas besoin d'utiliser les fonctions ord() or chr()

                        Et il y a encore beaucoup de petits trucs...

                        Sinon on peut aussi faire du vernam sans être obligé d'avoir deux fichiers de taille identique (enfin je crois :euh: ) :
                        from random import randint
                        
                        def xorror(data, key):
                            list, ks = [], len(key)
                            for i, v in enumerate(data):
                                list += [v ^ key[i % ks]]
                            return list
                        
                        
                        text = "Chaîne de caractères pour tester l'xorror qui suit !" # ou : data = open(file, 'rb').read()
                        keygen = [randint(1, 255) for _ in range(128)]                # clés de 128 bytes aléatoire
                        
                        xorror(text.encode(), keygen)
                        
                        • Partager sur Facebook
                        • Partager sur Twitter
                          29 octobre 2010 à 20:00:40

                          Citation : Mathieu__71



                          Tu peux avoir le détail ici : http://fr.wikipedia.org/wiki/Masque_jetable



                          Ça correspond à ce qui est dans le Zémor. Le code de Wikipedia est bien trop compliqué, ce sera pas la première fois ...
                          • Partager sur Facebook
                          • Partager sur Twitter
                            29 octobre 2010 à 20:12:10

                            j'ai ajouter mon code dans wikipedia ... *part se cacher ...*
                            • Partager sur Facebook
                            • Partager sur Twitter
                              30 octobre 2010 à 18:31:07

                              Bah c'est moche.

                              Si tu veux aller regarder, j'ai changé un poil ton exemple pour que ça soit plus pythonesque.
                              • Partager sur Facebook
                              • Partager sur Twitter
                              yjltg.
                                31 octobre 2010 à 14:40:45

                                Citation : quelqun_dautre

                                Bah c'est moche.

                                Si tu veux aller regarder, j'ai changé un poil ton exemple pour que ça soit plus pythonesque.



                                si ton code était fonctionnel et compréhensible ce serait pas mal ...
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  31 octobre 2010 à 15:07:22

                                  En effet. Voici mon code que j'ai corrigé:
                                  def vernam(masque, message):
                                      # pour chaque element x du message,
                                      # on applique un XOR avec l'element y correspondant de la clef
                                      foo = [chr( ord(x) ^ ord(y) ) for x, y in zip(message, masque)]
                                      return ''.join(foo)
                                  


                                  Edit: je viens de commenter mon code
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                  yjltg.
                                    31 octobre 2010 à 19:05:42

                                    chez moi sa ne marche toujours pas
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      31 octobre 2010 à 19:53:50

                                      Citation : wikipédia

                                      Pour cela, on attribue un nombre à chaque lettre, par exemple le rang dans l'alphabet, de 0 à 25. Ensuite on additionne la valeur de chaque lettre avec la valeur correspondante dans le masque; enfin si le résultat est supérieur à 25 on soustrait 26 (calcul dit "modulo 26")



                                      def vernam(message, masque):
                                          return ''.join([chr((ord(x)+ord(y))%26)for x, y in zip(message, masque)])
                                      


                                      Pas vraiment le temps de t'expliquer comment ça fonctionne mais je te conseille de te documenter à propos de la fonction zip, des listes compréhensions et de l'opérateur modulo.

                                      A toi de fournir la clé (le masque) et le message. Mais si j'ai le temps, j'incorporerai la création du masque à ma fonction vernam.
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                      Anonyme
                                        31 octobre 2010 à 20:10:38

                                        Citation : tcpc_

                                        def vernam(message, masque):
                                            return ''.join([chr((ord(x)+ord(y))%26)for x, y in zip(message, masque)])
                                        


                                        :euh: Comment tu fais pour récupérer le message d'origine ? (ou j'ai pas tous compris o_O )
                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          31 octobre 2010 à 20:24:46

                                          J'ai édité mon message. Et tu dois fournir message et masque lors de l'appel de la fonction. vernam("Mon message", "Mon masquee")
                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                          Anonyme
                                            31 octobre 2010 à 20:28:32

                                            S'il y a des accents dans le message ou bien si tu as d'autres caractères plus spécifiques comme un tiret ou un dièse, comment peux-tu retrouver le message d'origine une fois que tu l'a masqué avec ton code ?

                                            [edit]
                                            >>> def vernam(message, masque):
                                            ...     return ''.join([chr((ord(x)+ord(y))%26)for x, y in zip(message, masque)])
                                            
                                            >>> vernam("tester", "masque")
                                            '\x11\x10\x16\x15\n\x07'
                                            >>> vernam(_, "tester")
                                            '\x03\r\x07\x07\x07\x11'
                                            >>> vernam("masque", '\x11\x10\x16\x15\n\x07')
                                            '\x16\t\x07\x04\x17\x04'
                                            
                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              31 octobre 2010 à 20:32:22

                                              Ha, tu peux pas revenir au message d'origine. :-° J'ai pas codé le retour à la normale, oublié. :D Je verrai ça demain.

                                              De toute manière, j'ai un léger souci :
                                              def vernam(message, masque):
                                                  return [chr((ord(x)+ ord(y))%26) for x, y in zip(message, masque)]
                                              
                                              print(vernam("mon message", "mon masque"))
                                              


                                              ['\n', '\x0e', '\x0c', '\x0c', '\n', '\x10', '\x16', '\x14', '\x06', '\x16']
                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                1 novembre 2010 à 8:43:14

                                                Citation : Wikipedia

                                                Méthode informatisée de chiffrement et déchiffrement
                                                Lorsque les données sont informatisées, donc mises sous forme binaire, la méthode se réduit à un calcul particulièrement simple, donc très rapide en pratique.
                                                Le message en clair, à chiffrer, se présente comme une suite de bits. La clé est une autre suite de bits, de même longueur.
                                                On traite un à un les bits du clair, en combinant chacun avec le bit de même rang dans la clé.
                                                Appelons A un bit du clair et B le bit de même rang de la clé.
                                                Le chiffrement consiste à calculer un bit C en effectuant sur A et B l'opération appelée "XOR". Celle-ci est définie par le tableau suivant, qui indique pour toutes les valeurs possibles de A et B la valeur du résultat, que l'on note A ⊕ B :


                                                J'ai préféré utiliser une solution plus générique qui marche avec tous les caractères plutôt que la solution ne prenant que les lettres.

                                                Citation : Mathieu__71

                                                chez moi sa ne marche toujours pas


                                                Et chez moi, mon code fonctionne parfaitement. Tu peux me dire quelle erreur il sort ?
                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                yjltg.

                                                chiffre de vernam

                                                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                                • Editeur
                                                • Markdown