Outils pour utilisateurs

Outils du site


issue84:python_p._53

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
issue84:python_p._53 [2014/10/17 20:39] – [8] fredphil91issue84:python_p._53 [2014/10/20 12:34] (Version actuelle) andre_domenech
Ligne 22: Ligne 22:
 **Once we have validated the email, we then will create a “checksum character” which is based on the ascii value of each character in the entire email address, and then divide it by the number of characters in the email address. For example, let’s use a mythical email address of fredjones@someplace.com. If we walk through the email address, we can get the ascii value of each character by using the ord() function. When we add up each of the ascii values, we get a sum of 1670, then we divide that by the length of the email address (23); we get 72. Remember we are using integer division here, so our result will be an integer.** **Once we have validated the email, we then will create a “checksum character” which is based on the ascii value of each character in the entire email address, and then divide it by the number of characters in the email address. For example, let’s use a mythical email address of fredjones@someplace.com. If we walk through the email address, we can get the ascii value of each character by using the ord() function. When we add up each of the ascii values, we get a sum of 1670, then we divide that by the length of the email address (23); we get 72. Remember we are using integer division here, so our result will be an integer.**
  
-Une fois l'adresse validée, nous allons créer un « caractère de contrôle » qui est basé sur la valeur ASCII de chaque caractère de l'adresse complète, puis le diviser par le nombre de caractères de l'adresse. Par exemple, prenons l'adresse factice pierredupont@quelquepart.fr. En parcourant l'adresse, nous pouvons obtenir la valeur ASCII de chaque caractère en utilisant la fonction ord(). En additionnant chacune des valeurs ASCII, on obtient une somme de 1670, que l'on divise par la longueur de l'adresse (23) ; et nous obtenons 72. Nous utilisons la division entière ici, de sorte que notre résultat soit un entier.+Une fois l'adresse validée, nous allons créer un « caractère somme de contrôle » qui est basé sur la valeur ASCII de chaque caractère de l'adresse complète, puis le diviser par le nombre de caractères de l'adresse. Par exemple, prenons l'adresse factice pierredupont@quelquepart.fr. En parcourant l'adresse, nous pouvons obtenir la valeur ASCII de chaque caractère en utilisant la fonction ord(). En additionnant chacune des valeurs ASCII, on obtient une somme de 2048, que l'on divise par la longueur de l'adresse (27) ; et nous obtenons 75. Nous utilisons la division entière ici, de sorte que notre résultat soit un entier.
  
 ====== 4 ====== ====== 4 ======
Ligne 33: Ligne 33:
 Lets get started with the code. Since this is the 53rd article in the series, I won’t be quite as verbose from here on out.** Lets get started with the code. Since this is the 53rd article in the series, I won’t be quite as verbose from here on out.**
  
-Maintenant que nous avons notre somme de contrôle, on soustrait 68 de celle (ascii 'D') pour créer un décalage. Nous utilisons ce décalage pour encoder chaque caractère de l'adresse. Pour rendre les choses un peu plus difficiles à décoder, nous mettons la longueur (avec décalage) comme caractère en deuxième position et la somme de contrôle en quatrième position. +Maintenant que nous avons notre somme de contrôle, on en soustrait 68 (ascii 'D') pour créer un décalage. Nous utilisons ce décalage pour encoder chaque caractère de l'adresse. Pour rendre les choses un peu plus difficiles à décoder, nous mettons la longueur (avec décalage) comme caractère en deuxième position et le caractère somme de contrôle en quatrième position. 
  
 Donc, pour l'adresse pierredupont@quelquepart.fr nous obtenons cette clé de licence : Donc, pour l'adresse pierredupont@quelquepart.fr nous obtenons cette clé de licence :
Ligne 39: Ligne 39:
 w_pKlyylk|wvu{Gx|lsx|lwhy{5my w_pKlyylk|wvu{Gx|lsx|lwhy{5my
  
-Commençons à écrire le code. Puisque c'est le 53ème article de la série, je vais commencer à être un peu moins explicite à partir de maintenant.+Commençons à écrire le code. Puisque c'est le 53e article de la série, je vais commencer à être un peu moins explicite à partir de maintenant.
  
 ====== 5 ====== ====== 5 ======
Ligne 52: Ligne 52:
 import sys  import sys 
  
-Maintenant (ci-dessus à droite), nous allons créer une chaîne qui inclura tous nos caractères « autorisés » pour la fonction AdresseValide. Je l'ai découpée en 3 parties pour qu'elle s'intègre parfaitement dans le magazine. Nous les combinons dans la routine AdresseValide. Nous réglons également une variable globale « decalage » à 0. Ce sera la valeur que nous ajouterons (plus tard) à chaque caractère lorsque nous créons la chaîne codée.+Maintenant (ci-dessus à droite), nous allons créer une chaîne qui inclura tous nos caractères « autorisés » pour la fonction AdresseValide. Je l'ai découpée en 3 parties pour qu'elle s'intègre parfaitement dans le magazine. Nous les combinons dans la routine AdresseValide. Nous réglons également une variable globale « decalage » à 0. Ce sera la valeur que nous ajouterons (plus tard) à chaque caractère lorsque nous créerons la chaîne codée.
  
 ====== 6 ====== ====== 6 ======
Ligne 59: Ligne 59:
 First we assign the passed in email address to the variable ‘email’ and find the ‘@’ character that separates the local from the domain portions of the email. We then assign the local portion of the email to (I think it’s appropriate) ‘local’, and the domain portion to ‘domain’. We then set the boolean isgood flag to False and finally create the ‘localvalid’ string from the 3 shorter strings we set up earlier.** First we assign the passed in email address to the variable ‘email’ and find the ‘@’ character that separates the local from the domain portions of the email. We then assign the local portion of the email to (I think it’s appropriate) ‘local’, and the domain portion to ‘domain’. We then set the boolean isgood flag to False and finally create the ‘localvalid’ string from the 3 shorter strings we set up earlier.**
  
-Maintenant, voici notre première fonction. C'est (ci-dessous) la routine AdresseValide. Fondamentalement, nous passons l'adresse dans la variable s, et un drapeau optionnel de débogage. Nous utilisons le drapeau de débogage, comme nous l'avons fait dans le passé, pour fournir des instructions d'affichage pour voir comment vont les choses. En général, nous passerons la valeur 1 comme second paramètre si nous voulons afficher la progression.+Maintenant, voici notre première fonction. C'est (ci-dessous) la routine AdresseValide. Essentiellement, nous passons l'adresse dans la variable s, et un drapeau optionnel de débogage. Nous utilisons le drapeau de débogage, comme nous l'avons fait dans le passé, pour fournir des instructions d'affichage, afin de voir comment les choses se passent. En général, nous passerons la valeur 1 comme second paramètre si nous voulons afficher la progression.
  
-D'abord, nous affectons l'adresse reçue dans a variable « adresse » et cherchons le caractère « @ » qui sépare la partie locale du domaine dans l'adresse. Puis, nous affectons la partie locale de l'adresse à (je pense que c'est approprié) « local », et la partie de domaine à « domaine ». Nous réglons ensuite le  drapeau booléen « valide » à False et enfin créons la chaîne « localvalid » avec les 3 chaînes plus courtes dont nous avons parlé plus haut.+D'abord, nous affectons l'adresse reçue à la variable « adresse » et cherchons le caractère « @ » qui sépare la partie locale du domaine. Puis, nous affectons la partie locale de l'adresse à (je pense que c'est approprié) « local », et la partie de domaine à « domaine ». Nous réglons ensuite le drapeau booléen « valide » à False et enfin créons la chaîne « localvalid » avec les 3 chaînes plus courtes dont nous avons parlé plus haut.
  
 ====== 7 ====== ====== 7 ======
Ligne 91: Ligne 91:
      return valide      return valide
  
-La prochaine routine (en bas à droite) est la routine de CheckSum qui est assez courte. Nous parcourons chaque caractère de l'adresse et créons la somme des valeurs ASCII de chacun en s'aidant de la fonction ord intégrée qui convertit en nombres. Comme je l'ai dit plus tôt, nous divisons cette somme par la longueur de l'adresse. Nous retournons la somme de contrôle et le caractère correspoondant.+La prochaine routine (en bas à droite) est la routine de CheckSum qui est assez courte. Nous parcourons chaque caractère de l'adresse et créons la somme des valeurs ASCII de chacun en s'aidant de la fonction ord intégrée qui convertit en nombres. Comme je l'ai dit plus tôt, nous divisons cette somme par la longueur de l'adresse. Nous retournons la somme de contrôle et le caractère correspondant.
  
 ====== 9 ====== ====== 9 ======
-Now for the EncodeKey routine. While it looks simple, it requires some concentration so pay attention! We assign the Offset variable to global status so we can change it within the function and so it can be used in other functions. We then set the Offset variable to the checksum minus 68. As in the example presented at the beginning of the article, it would be 72-68 which equals 4. We then step through each character of the email address adding the offset to the ascii value of that character. For the ‘f’ in ‘fredjones’, it would be 102 + 4 or 106 which equates to ‘i’. Using the counter variable ‘cntr’, we then determine what we add to the ‘NewEmail’ string we build up character by character. Notice in the code that we go from 0 to the length of the email, so character 0 is ‘f’, character 1 is ‘r’ and so on. Now comes the part that might confuse some of you. If cntr is a value of 1 (‘r’), we insert the character for the length of the email + 68 and then the offset character, which using our example would be iYt. The next time we go through the loop, cntr will equal 2, but we already have 3 characters in the email. That’s where we want to insert the checksum character (‘F’) and then the third character offset. From there, we simply add each offset character to the string, and when the loop is done, we return the key (top right).+**Now for the EncodeKey routine. While it looks simple, it requires some concentration so pay attention! We assign the Offset variable to global status so we can change it within the function and so it can be used in other functions. We then set the Offset variable to the checksum minus 68. As in the example presented at the beginning of the article, it would be 72-68 which equals 4. We then step through each character of the email address adding the offset to the ascii value of that character. For the ‘f’ in ‘fredjones’, it would be 102 + 4 or 106 which equates to ‘i’. Using the counter variable ‘cntr’, we then determine what we add to the ‘NewEmail’ string we build up character by character. Notice in the code that we go from 0 to the length of the email, so character 0 is ‘f’, character 1 is ‘r’ and so on. Now comes the part that might confuse some of you. If cntr is a value of 1 (‘r’), we insert the character for the length of the email + 68 and then the offset character, which using our example would be iYt. The next time we go through the loop, cntr will equal 2, but we already have 3 characters in the email. That’s where we want to insert the checksum character (‘F’) and then the third character offset. From there, we simply add each offset character to the string, and when the loop is done, we return the key (top right).** 
 + 
 +Maintenant, la routine EncodeCle. Elle paraît simple, mais elle nécessite une certaine concentration donc faites bien attention ! La variable decalage est mise à l'état « global », pour qu'on puisse la modifier dans la fonction et l'utiliser ensuite dans d'autres fonctions. Nous réglons ensuite la variable decalage à la somme de contrôle moins 68. Pour l'exemple présenté au début de l'article, cela ferait 75-68 donc 7. Nous modifions ensuite chaque caractère de l'adresse en ajoutant le décalage à sa valeur ascii. Pour le « p » de « pierredupont », cela fait 112 + 7 soit 119 ce qui équivaut à « w ». En utilisant la variable  « compteur », nous construisons la chaîne « NouvelleAdresse » caractère par caractère. Remarquez dans le code que nous allons de 0 à la longueur de l'adresse, donc le caractère 0 est « p », le caractère 1 est « i » et ainsi de suite. Maintenant vient la partie qui pourrait en perdre quelques-uns parmi vous. Lorsque compteur vaut 1 (« i »), nous insérons le caractère correspondant à la longueur de l'adresse + 68 puis le caractère « décalé », ce qui fait pour notre exemple w_p. La prochaine fois que nous passerons dans la boucle, compteur sera égal à 2, mais nous avons déjà 3 caractères dans l'adresse. C'est là que nous voulons insérer le caractère somme de contrôle (« K ») puis le troisième caractère « décalé ». De là, nous ajoutons simplement chaque caractère « décalé » à la chaîne, et lorsque la boucle est terminée, nous retournons la clé (en haut à droite).
  
 ====== 10 ====== ====== 10 ======
-The DecodeKey routine (bottom right) basically reverses the process we used in the EncodeKey routine. One thing you might notice here is that in the first ‘if debug’ statement of this function, I used ‘!= 0’ rather than ‘== 1’, simply to remind you that the two can be interchangeable.+**The DecodeKey routine (bottom right) basically reverses the process we used in the EncodeKey routine. One thing you might notice here is that in the first ‘if debug’ statement of this function, I used ‘!= 0’ rather than ‘== 1’, simply to remind you that the two can be interchangeable.
  
 The DoIt function (below) asks for an email address using ‘raw_input’, then calls the functions in order to create the license key. The DoIt function (below) asks for an email address using ‘raw_input’, then calls the functions in order to create the license key.
Ligne 104: Ligne 106:
  
 if __name__ == "__main__": if __name__ == "__main__":
-    DoIt()+    DoIt()** 
 + 
 +La routine DecodeCle (en bas à droite) renverse simplement le processus utilisé dans la routine EncodeCle. Une chose à remarquer ici, c'est que dans la première déclaration « if debug » de cette fonction, j'ai utilisé « != 0 » plutôt que « == 1 », tout simplement pour vous rappeler que les deux sont interchangeables. 
 + 
 +La fonction FaisLe (ci-dessous) demande une adresse de courrier électronique en utilisant « raw_input », puis appelle les fonctions afin de créer la clé de licence. 
 + 
 +Enfin, nous appelons la routine FaisLe. 
 + 
 +if __name__ == "__main__": 
 +    FaisLe()
  
 ====== 11 ====== ====== 11 ======
-Now, obviously the output is not super-encrypted, and if someone were to put in a fair amount of time, they could figure out what we used to create the key fairly easily. However, it should give you enough of a starting point that you could simply modify the code to make it much harder to break. You could, for example, use a random number rather than the ‘D’ (68). If you do that, set a seed in the code so that it will always generate the same random number. You could also go a bit deeper and put the offset value somewhere into the license key, maybe the last character so you could use that as the decryption offset.+**Now, obviously the output is not super-encrypted, and if someone were to put in a fair amount of time, they could figure out what we used to create the key fairly easily. However, it should give you enough of a starting point that you could simply modify the code to make it much harder to break. You could, for example, use a random number rather than the ‘D’ (68). If you do that, set a seed in the code so that it will always generate the same random number. You could also go a bit deeper and put the offset value somewhere into the license key, maybe the last character so you could use that as the decryption offset.
  
-As always, the full source is available at http://pastebin.com/MH9nVTNK. Until next time, enjoy.+As always, the full source is available at http://pastebin.com/MH9nVTNK. Until next time, enjoy.**
  
 +Bon, bien sûr le résultat n'est pas super-crypté et, si quelqu'un voulait y passer pas mal de temps, il pourrait comprendre assez facilement comment nous avons créé la clé. Cependant, cela devrait vous donner un bon point de départ pour que vous puissiez simplement modifier le code pour le rendre beaucoup plus difficile à casser. Vous pourriez, par exemple, utiliser un nombre aléatoire plutôt que le « D » (68). Si vous faites cela, indiquez une « graine » (« seed ») dans le code pour qu'il génère toujours le même nombre aléatoire. Vous pouvez aussi aller un peu plus loin et placer la valeur de decalage quelque part dans la clé de licence, par exemple le dernier caractère, pour pouvoir l'utiliser comme decalage de décryptage.
  
-version française : http://pastebin.com/ipFm77XJ+Comme toujours, la source complète est disponible à http://pastebin.com/ipFm77XJ. En attendant la prochaine fois, amusez-vous bien.
  
 ====== Encadrés orangés ====== ====== Encadrés orangés ======
issue84/python_p._53.1413571160.txt.gz · Dernière modification : 2014/10/17 20:39 de fredphil91