Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente |
issue84:python_p._53 [2014/10/17 21:42] – [10] fredphil91 | issue84:python_p._53 [2014/10/20 12:34] (Version actuelle) – andre_domenech |
---|
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 le caractère 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 : |
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 ====== |
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 ====== |
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 ====== |
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 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 décalage à 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 passons 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). | 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 ====== |
| |
====== 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 ====== |