Novembre 2024 | Lun | Mar | Mer | Jeu | Ven | Sam | Dim |
---|
| | | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | | Calendrier |
|
|
| Cryptage/décryptage | |
| | Auteur | Message |
---|
JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Cryptage/décryptage Mar 18 Aoû 2009 - 16:41 | |
| Un petit programme de cryptage/décryptage d'une chaîne ascii (et donc d'un fichier ascii, par extension, en traitant ligne par ligne). Ce n'est pas très élégant, vu qu'il me manquait la fonction XOR, alors ça a alourdi le code: - Code:
-
Rem Codage/décodage d'une chaîne Ascii (par extension, d'un fichier) LABEL Codeco, Xor DIM Txi$, Txo$, Key$ DIM i, j, k, v1, v2, bi, s1, s2
Txi$ = "Voyez Le Brick Géant Que J'Examine Près Du Wharf 0123456789" Key$ = "QaZdSuPk"
PRINT Txi$ GOSUB Codeco: Rem codage PRINT Txo$: Rem chaîne cryptée Txi$ = Txo$ GOSUB Codeco: Rem décodage PRINT Txo$: Rem chaîne décryptée (respecte la "casse", pour Jean Claude) PRINT: PRINT " Une touche svp..." WHILE INKEY$ = "": END_WHILE TERMINATE
Codeco: Rem Cryptage/décryptage de Txi$ -> Txo$, clé Key$ Txo$ = "" FOR i = 1 TO LEN(Txi$) STEP LEN(Key$) FOR j = 1 TO LEN(Key$) k = i + j - 1: IF k > LEN(Txi$) THEN EXIT_FOR v1 = ASC(MID$(Txi$, k, 1)): v2 = ASC(MID$(Key$, j, 1)) GOSUB Xor Txo$ = Txo$ + CHR$(bi) NEXT j NEXT i RETURN
Xor: Rem émulation de la fonction XOR entre les octets v1 et v2, résultat bi bi = 0 FOR k = 0 TO 7 IF v1/2 = INT(v1/2) s1 = 0 ELSE s1 = 1 END_IF IF v2/2 = INT(v2/2) s2 = 0 ELSE s2 = 1 END_IF IF s1 <> s2 THEN bi = bi + POWER(2, k) v1 = INT(v1/2): v2 = INT(v2/2) NEXT k RETURN | |
| | | Jean Claude
Nombre de messages : 5950 Age : 70 Localisation : 83 Var Date d'inscription : 07/05/2009
| Sujet: Re: Cryptage/décryptage Mar 18 Aoû 2009 - 16:57 | |
| Un exemple de codage bien pratique qui peut être réutilisé facilement, et en plus "il respecte la casse" Merci JL35 A+ | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Cryptage/décryptage Mar 18 Aoû 2009 - 17:41 | |
| Salut Jean Claude, Pour une phrase, ça marche, mais j'émets cependant un bémol, concernant le codage d'un fichier entier. En effet, le résultat du codage d'un caractère peut très bien être un code 10 ou 13, pas de problème pour les écrire, mais à la relecture ça fiche le bazar, c'est considéré comme une fin de ligne. Et le résultat n'a plus figure humaine. Il faudrait trouver une combine, considérer le fichier codé comme un fichier binaire, mais pas facile de retrouver ses repères. | |
| | | Jean Claude
Nombre de messages : 5950 Age : 70 Localisation : 83 Var Date d'inscription : 07/05/2009
| Sujet: Re: Cryptage/décryptage Mar 18 Aoû 2009 - 18:12 | |
| Je pensais juste coder un mot de passe avant de le mettre dans un fichier et ensuite le récupérer pour le décoder. La je pense que ton code modifié ferait parfaitement l'affaire. A+ | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Cryptage/décryptage Mar 18 Aoû 2009 - 20:28 | |
| Pour cet usage-là c'est parfait. Mais ça y est, j'ai trouvé la combine pour coder et décoder un fichier texte complet, il faut simplement le traiter comme si c'était un fichier binaire (en fait tous les fichiers sont binaires...). L'idée c'était de lire tout le fichier d'un coup dans une seule variable, d'envoyer celle-ci au sous-programme et de réécrire le résultat d'un coup. En fait, contrairement au QBasic (c'est une obsession), il faut lire et réécrire le fichier binaire octet par octet, ce qui est très long. Il faut sans doute que le fichier ne dépasse pas quelques milliers de caractères, sinon ça risquerait de ne pas tenir dans la variable (indépendamment de la durée de traitement, qui est proportionnelle). Sur demande, je donnerai le code... | |
| | | Georges
Nombre de messages : 290 Age : 55 Localisation : Martinique Date d'inscription : 29/05/2009
| Sujet: re Mar 18 Aoû 2009 - 20:49 | |
| salut oui, je suis cuirieux de le voir georges @+ | |
| | | Jean Claude
Nombre de messages : 5950 Age : 70 Localisation : 83 Var Date d'inscription : 07/05/2009
| Sujet: Re: Cryptage/décryptage Mar 18 Aoû 2009 - 20:54 | |
| Je suis preneur également. A+ | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Cryptage/décryptage Mar 18 Aoû 2009 - 21:04 | |
| Voilà voilà, il suffit de demander: - Code:
-
Rem Codage/décodage d'un fichier quelconque LABEL Codeco, Xor DIM fi$, fc$, fd$ DIM Txi$, Txo$, Key$, a$ DIM t, i, j, k, v1, v2, bi, s1, s2
Key$ = "QaZdSuPk": REM n'importe quoi, par exemple
REM fi$ = "C:\Textes\Lorem.txt" fi$ = "C:\UTIL\ZIP.EXE" fc$ = "Z:\Fichcod": Rem ... on met les fichiers résultat où on veut fd$ = "Z:\Fichdec": Rem ... et avec n'importe quel nom
PRINT " - Test de CRYPTAGE/DÉCRYPTAGE de fichier -" PRINT FILEBIN_OPEN_READ 1, fi$ t = FILEBIN_SIZE(1) Txi$ = "" FOR i = 1 TO t FILEBIN_READ 1, v1: Txi$ = Txi$ + CHR$(v1) NEXT i FILEBIN_CLOSE 1 PRINT "Codage de " + fi$ + " dans " + fc$ + ", " + STR$(t) + " octets ..." GOSUB Codeco FILEBIN_OPEN_WRITE 1, fo$ FOR i = 1 TO LEN(Txo$) FILEBIN_WRITE 1, ASC(MID$(Txo$, i, 1)) NEXT i FILEBIN_CLOSE 1 PRINT "Codage terminé." PRINT "Prêt pour le décodage de vérification ?" PRINT: PRINT " Une touche svp..." WHILE INKEY$ = "": END_WHILE
FILEBIN_OPEN_READ 1, fo$ Txi$ = "" FOR i = 1 TO t FILEBIN_READ 1, v1: Txi$ = Txi$ + CHR$(v1) NEXT i FILEBIN_CLOSE 1 PRINT "Décodage de " + fc$ + " dans " + fd$ + " ..." GOSUB Codeco FILEBIN_OPEN_WRITE 1, fd$ FOR i = 1 TO LEN(Txo$) FILEBIN_WRITE 1, ASC(MID$(Txo$, i, 1)) NEXT i FILEBIN_CLOSE 1 PRINT PRINT "Terminé." WAIT 2000 TERMINATE REMARQUES: - Les S/P Codeco et Xor sont les mêmes que plus haut, je ne les ai pas répétés. - Ici, le codage et le décodage sont faits dans la foulée, pour tester. Normalement il n'y a qu'un appel au s/p Codeco. - Les noms de fichiers sont les miens, ils sont évidemment à adapter pour vous. Logiquement il faudra soit prévoir de les récupérer en paramètres, ainsi que la clé, à l'activation du programme, soit de les demander en début (je fournis le moteur, à vous de mettre la carrosserie). Trois paramètres à fournir: Fichier d'entrée, Fichier de sortie, Clé. - Le programme est symétrique: si on lui donne un fichier en clair il va le coder, et si on lui donne un fichier codé il va le décoder ! - On peut sûrement optimiser le code pour l'accélérer, mais cette lecture/écriture octet par octet m'a un peu bloqué. Des questions, ou des suggestions ?
Dernière édition par JL35 le Mer 19 Aoû 2009 - 21:00, édité 4 fois | |
| | | Jean Claude
Nombre de messages : 5950 Age : 70 Localisation : 83 Var Date d'inscription : 07/05/2009
| Sujet: Re: Cryptage/décryptage Mer 19 Aoû 2009 - 8:49 | |
| Salut JL,
2 questions:
Si j'ai bien compris on peut changer la clé comme on veut ?
Le chemein d'accès du fichier "C:\TEXTES\Lorem.txt" est C:\ au début du code et ensuite c'est Z:\. Si je remplace le nom de fichier par fi$ comment dois-je faire ?
Merci et A+ | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Cryptage/décryptage Mer 19 Aoû 2009 - 14:00 | |
| 2 réponses:
- Evidemment on peut mettre la clé qu'on veut, de la longueur qu'on veut, majuscules et/ou minuscules. Mais bien entendu la même clé pour coder et décoder, sinon c'est du charabia. Si tu perds la clé pour décoder, là il faudra faire appel au FBI.
- pour les noms de fichiers, tu les mets bien sûr tous en paramètres: fi$ = "C:\....\Monfichier.xxx" ... FILEBIN_OPEN_READ 1, fi$ Là comme j'ai fait, en dur, c'était juste pour les tests. Et évidemment le fichier résultat doit être différent du fichier source. Si on a vraiment confiance dans le programme on peut supprimer la source après... mais il vaut mieux bien tester si ça se décode bien avant toute chose, ne va pas détruire des données importantes sans précautions. Il est quand même conseillé de garder quelque part une copie de sauvegarde du fichier non codé (un recoin du disque, une clé usb ...).
Allez, une 3ème réponse annexe pour le même prix: - En C: et Z: c'était des fichiers différents. En fait, Z: est une partie de ma mémoire vive (32M) déclarée comme un volume disque (Ramdisk). C'est bien pratique quand on fait des essais pour y stocker des fichiers temporaires, ou pour passer un fichier de paramètres d'un programme à un autre, ça évite de laisser des traces sur le disque, c'est plus rapide d'accès et ça ne fait pas travailler la mécanique. Et 32M sur 2 ou 3G, ce n'est rien du tout. Mais il faut rester bien conscient que si on éteint la machine, tout est perdu. Par contre c'est un peu acrobatique à installer, surtout sous Vista, mais on y arrive, la preuve. | |
| | | Jean Claude
Nombre de messages : 5950 Age : 70 Localisation : 83 Var Date d'inscription : 07/05/2009
| Sujet: Re: Cryptage/décryptage Mer 19 Aoû 2009 - 15:11 | |
| RE, Donc si j'ai bien compris il suffit à la fin (si le décryptage est ok) de faire FILE_RENAME "Z:\Loremdec.txt","C:\TEXTES\Lorem.txt" et tu retrouve ton source. A+ | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Cryptage/décryptage Mer 19 Aoû 2009 - 16:50 | |
| Bien sûr, le fichier résultat du décodage doit être identique au fichier d'origine avant codage.
Tiens, il faudrait que j'essaye sur un fichier binaire et non ascii, pour voir. Juste pour l'expérience, parce que le but c'est quand même les fichiers texte.
Une remarque pour le Rename, il peut changer le fichier de nom, mais dans le même répertoire, donc ta syntaxe est incorrecte, il faudrait faire une copie.
Mais pourquoi se compliquer la vie ? pourquoi ne pas donner directement en paramètre de résultat au programme le nom du fichier final ? Tout ça après avoir bien testé le programme, évidemment.
PS: J'ai un peu modifié mon code ci-dessus, pour le codage des fichiers, pour montrer le paramétrage, c'est plus pratique pour les tests. Je n'ai toujours pas joint les s/p Codeco et Xor qui sont identiques à ce qui est en tête du topic. Je répète que la deuxième partie (décodage), n'est là que pour les tests, tout se fait (codage ET décodage) dans la première partie. Je n'ai pas rajouté la partie dialogue initial, pour ne pas alourdir, chacun fera à sa façon. J'ai cherché dans Panoramic quelque chose pour mesurer le temps d'exécution (genre TIMER du Basic), pour les tests, mais je n'ai rien trouvé. J'ai donc essayé un fichier en binaire (ZIP.EXE), et à priori ça marche très bien, ce qui est logique. Ce fichier fait un peu plus de 7600 octets, et à vue de nez (la montre), ça met une vingtaine de secondes à coder. C'est long.
J'attends vos remarques, et pourquoi pas, les résultats de vos essais... (Jean Claude ?) | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Cryptage/décryptage Jeu 20 Aoû 2009 - 22:56 | |
| J'ai fait une nouvelle version du programme, un peu plus propre. Toujours pas adaptée aux longs fichiers (disons plus d'une dizaine de milliers d'octets), sinon la durée d'exécution (que je ne m'explique pas trop) devient trop gênante. J'aurais bien une méthode pour traiter les très longs fichiers, mais la durée de traitement dans le S/P Codeco devient rhédibitoire. Au passage, j'ai corrigé une anomalie dans le traitement des fichiers binaires uniquement: s'il y avait une longue série de zéros dans le fichier, on retrouvait la clé en clair aux mêmes emplacements dans le fichier codé, ce qui est logique vu le procédé, mais un peu gênant ! Du coup dans ce cas je laisse les zéros tels quels, c'est un moindre mal. J'ai utilisé la fonction TIME$ pour mesurer le temps, donc précision de la seconde, mais ici ça suffit vu que ça peut durer 20 à 30 secondes. Allez, le voici, complet cette fois, le dernier avant les vacances (encore perfectible, comme toujours, notamment pour l'acquisition des noms de fichiers et de la clé, paramètres ou dialogue initial): - Code:
-
Rem Codage/décodage d'un fichier quelconque, Texte ou Binaire LABEL Debut, Fin, Decod, Codfich, Codeco, Secondes DIM fi$, fc$, fd$, f1$, f2$ DIM Txi$, Txo$, Key$, a$ DIM t, i, j, k, v1, v2, bi, s, s1, s2, n, v, nb, t1, duree CAPTION 0, " - Test de CRYPTAGE/DÉCRYPTAGE de fichier -"
BUTTON 1: TOP 1, 10: LEFT 1, 10: WIDTH 1, 430: HEIGHT 1, 25 CAPTION 1, "Lancer le codage" ON_CLICK 1, Debut BUTTON 2: TOP 2, 10: LEFT 2, 450: WIDTH 2, 80: HEIGHT 2, 25 CAPTION 2, "Quitter" ON_CLICK 2, Fin BUTTON 3: TOP 3, 72: LEFT 3, 10: WIDTH 3, 1 BUTTON 4: TOP 4, 130: LEFT 4, 10: WIDTH 4, 1 ON_CLICK 4, Decod
Key$ = "QaZdSuPk": Rem clé de codage/décodage, longueur quelconque fi$ = "C:\Textes\Lorem.txt": Rem fichier à coder, Ascii (Texte) ou binaire fi$ = "C:\UTIL\ZIP.EXE" fc$ = "Z:\Fichcod": Rem fichier résultat: fichier codé fd$ = "Z:\Fichdec": Rem fichier résultat: fichier décodé END
Debut: f1$ = fi$ f2$ = fc$ PRINT_Y_LOCATE 56 PRINT "Codage de " + f1$ + " dans " + f2$ + ", " + STR$(t) + " octets" GOSUB Codfich PRINT_Y_LOCATE 102: PRINT "Codage terminé, durée: " + Str$(s-t1) + " secondes." WIDTH 4, 430: CAPTION 4, "Décodage de vérification": Rem pour tests END
Decod: CAPTION 3, "": WIDTH 3, 1: TOP 3, 176 f1$ = fc$ f2$ = fd$ PRINT_Y_LOCATE 160: PRINT "Décodage de " + f1$ + " dans " + f2$ GOSUB Codfich PRINT_Y_LOCATE 206: PRINT "Décodage terminé." END
Fin: TERMINATE
Codfich: FILEBIN_OPEN_READ 1, f1$ t = FILEBIN_SIZE(1): Rem taille du fichier en octets Txi$ = "" : Rem chaîne, image du fichier entier FOR i = 1 TO t FILEBIN_READ 1, v: Txi$ = Txi$ + CHR$(v) NEXT i FILEBIN_CLOSE 1 GOSUB Secondes: t1 = s GOSUB Codeco FILEBIN_OPEN_WRITE 1, f2$ FOR i = 1 TO LEN(Txo$) FILEBIN_WRITE 1, ASC(MID$(Txo$, i, 1)) NEXT i FILEBIN_CLOSE 1 GOSUB Secondes: duree = s - t1: Rem en secondes RETURN
Codeco: Rem Cryptage/décryptage de Txi$ -> Txo$, clé Key$ nb = INT(LEN(Txi$)/LEN(Key$)): n = 0: Rem pour la barre de progression Txo$ = "" FOR i = 1 TO LEN(Txi$) STEP LEN(Key$) FOR j = 1 TO LEN(Key$) k = i + j - 1: IF k > LEN(Txi$) THEN EXIT_FOR v1 = ASC(MID$(Txi$, k, 1)) IF v1 = 0 bi = 0: Rem octets à 0 non codés (fichiers binaires) ELSE v2 = ASC(MID$(Key$, j, 1)) bi = BIN_XOR(v1, v2): Rem = v1 XOR v2 END_IF Txo$ = Txo$ + CHR$(bi) NEXT j Rem barre de progression, d'après une idée de Georges (merci !): n = n + 1: v = INT(100*n/nb): IF v < 1 THEN v = 1 WIDTH 3, v*5: CAPTION 3, STR$(v) + " %" NEXT i RETURN
Secondes: s = 3600*VAL(LEFT$(TIME$,2)) + 60*VAL(MID$(TIME$,4,2)) + VAL(RIGHT$(TIME$,2)) RETURN
Dernière édition par JL35 le Lun 24 Aoû 2009 - 23:16, édité 1 fois | |
| | | Jean Claude
Nombre de messages : 5950 Age : 70 Localisation : 83 Var Date d'inscription : 07/05/2009
| Sujet: Re: Cryptage/décryptage Ven 21 Aoû 2009 - 10:16 | |
| Je suis en admiration, on sent bien la maitrise de la programmation. Un jour, tu verras je serais plus fort que toi. Bravo A+ | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Cryptage/décryptage Ven 21 Aoû 2009 - 11:16 | |
| Merci Jean Claude, je suis tout confus Mais je l'espère bien pour toi que tu seras plus fort que moi, moi je ne fais que de l'artisanat et du bricolage, vieille habitude des débuts du basic. Maintenant, avec Panoramic entre autres, il y a des outils autrement plus sérieux. A bientôt, après les vacances (15 jours)... je jetterai quand même un coup d'oeil ici, j'ai acheté une clé 3G ! | |
| | | Jean Claude
Nombre de messages : 5950 Age : 70 Localisation : 83 Var Date d'inscription : 07/05/2009
| Sujet: Re: Cryptage/décryptage Ven 21 Aoû 2009 - 14:22 | |
| Bonnes Vacances à toi, pour ma part je reprends le boulot lundi. A+ | |
| | | Georges
Nombre de messages : 290 Age : 55 Localisation : Martinique Date d'inscription : 29/05/2009
| Sujet: re Ven 21 Aoû 2009 - 14:29 | |
| Salut Ou est-ce qu'on trouve le fichier ZIP.exe Georges @+ | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Cryptage/décryptage Ven 21 Aoû 2009 - 14:53 | |
| @Jean Claude, merci et puis... bon courage à toi pour la reprise !
@Georges, le fichier ZIP.EXE n'a aucun intérêt, c'était juste pour avoir un fichier binaire à coder pour les tests, tu peux mettre ce que tu veux (mais pas trop long, disons moins de 10000 octets si tu ne veux pas attendre 2 heures). (en fait c'est un utilitaire que j'avais écrit en QuickBasic pour voir le contenu d'un fichier zip. Et C:\UTIL est le répertoire qui regroupe plein d'utilitaires sous Dos, les miens et d'autres, accumulés au fil des ans). Je répète que les noms de fichiers donnés en tête du module sont tout à fait arbitraires, il faut les remplacer par des fichiers à soi.
On peut aussi très bien coder le fichier sur lui-même, (nom résultat = nom d'origine) il faut pour ça coder dans un fichier temporaire, recopier le résultat dans le fichier d'origine puis supprimer le fichier temporaire. Facile. | |
| | | Georges
Nombre de messages : 290 Age : 55 Localisation : Martinique Date d'inscription : 29/05/2009
| Sujet: cryptage / décryptage Ven 21 Aoû 2009 - 15:08 | |
| Salut Si je comprend bien (en survol) ,tu pourrait remplace cette ligne par un appel de procédure OPEN_DIALOGUE ? ou bien non J'essayerai avec un autre nom de fichier. Georges @+ | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Cryptage/décryptage Ven 21 Aoû 2009 - 15:16 | |
| Evidemment, on peut tout ce qu'on veut, l'essentiel c'est de se retrouver avec deux noms de fichiers valides pour attaquer le codage ! Le Open_Dialog est évidemment une bonne solution, entre autres. Tout ce qui est avant l'étiquette Debut est modulable à sa façon, moi ce que j'ai fait c'était pour les tests. | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Cryptage/décryptage Lun 24 Aoû 2009 - 23:20 | |
| J'ai édité mon dernier source pour remplacer l'émulation de XOR par la fonction BIN_XOR que je ne connaissais pas, et ça va bien plus vite (une boucle imbriquée en moins) J'en ai profité pour corriger un lapsus dans le s/p Codfich, j'avais laissé fc$ au lieu de f2$, ce qui faussait le résultat. Maintenant ça doit marcher. | |
| | | Contenu sponsorisé
| Sujet: Re: Cryptage/décryptage | |
| |
| | | | Cryptage/décryptage | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |