Bibm@th

Forum de mathématiques - Bibm@th.net

Bienvenue dans les forums du site BibM@th, des forums où on dit Bonjour (Bonsoir), Merci, S'il vous plaît...

Vous n'êtes pas identifié(e).

#1 21-08-2009 11:04:24

Dark
Invité

Cryptage et Decryptage.

Bonjour,

Je suis débutant dans ce domaine et j'aimerais apprendre à créer un programme pour crypter et décrypter un texte selon un algorithme que je vais vous expliquer.

mon algorithme se base sur la correspondance de chaque lettre a un numéro :

a=1
b=2
c=3
.....
z=26

et mon algorithme se resume a faire ceci:

Prenons l'exemple du prénom kévin:
K=11
E=5
V=22
I=9
N=14

Ensuite on utilise ceci:

[(valleur de la premiere lettre)x26^0 ]+[(valleur de la deuxième lettre)x26^1 ]+[(valleur de la troisieme lettre)x26^2 ]+.......

Ici ce la donnerais ceci:

[11x26^0]+[5x26^1]+[22x26^2]+[9x26^3]+[14x26^4]=11+130+14872+158184+6397664=6570861

Danc cette exemple le mot Kevin serais par cryptage 6570861.

Quelqu'un pourrais m'indiquer commant faire pour créer 1 programme pour crypter decrypter ou le faire en 2 programme séparé. J'ai un peu de connaissance en Langage C mais tres peu.

Merci d'avance à ceux qui voudrons m'aider.

(je pense que ce type de cryptage est un cryptage arithmétique en base 26

#2 21-08-2009 12:50:28

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 16 943

Re : Cryptage et Decryptage.

Bien le Bonjour,

Le cryptage, c'est assez simple...
Le décryptage par contre, ça demande réflexion.
Tu veux coder un texte ? N'importe lequel ? Y compris un texte avec des caractères "spéciaux" type lettres accentuées, signes de ponctuation ?

En quel langage veux-tu écrire tes programmes ?
Je ne connais pas le C, seulement ce que j'en ai vu par ci par là...
Alors on fera ça en pseudo-langage en supposant que ton texte est en majuscules et débarassé de toutes les "scories" citées plus haut.

Déclarer la variable texteclair comme un String
Déclarer la variable longtext comme un Int
Déclarer le compteur de boucle i comme un Int
Déclarer un compteur de lettres j comme un Int
Déclarer la variable codetexte comme un Int
Déclarer la variable codelettre comme un Int

Prendre la longueur du texte (dans longtext)
Pour i 0 jusqu'à longtext
    Prendre le code ASCII de la lettre n° i de texteclair
    Si le code ASCIII de la lettre est >= 65
           lui enlever 65 et donner cette valeur à codelettre            ---> Le code ASCII de A est 65
           ajouter (codelettre +1)*26^j à codetexte
           incrémenter j de 1

Afficher codetexte

Voilà le code Python correspondant :

#!/usr/bin/env python
# -*- coding:UTF-8 -*-

texteclair, longtext, codetexte, codelettre, i,j='',0,0,0,0,0

texteclair='KEVIN'
longtext=len(texteclair)

for i in range(longtext):
    codelettre=ord(texteclair[i])
    if codelettre >=65:
        codelettre=codelettre-65
        codetexte=codetexte+(codelettre+1)*26**j
        j=j+1
       
print "Le code chiffré de "+texteclair+' est :', codetexte

Résultat 1 :

Le code chiffré de KEVIN est : 6570861

Résultat 2 :

Le code chiffré de LUKE SKYWALKER VS DARK VADOR est : 6508809702125968829363180664196434

Les limites ce codage font qu'il faut coder chaque mot, garder la valeur du mot et séparer chacun par un espace.
Je garderai ça dans un String de plus...
Donc je déclare en plus dans mon pseudo code :
Déclarer codetotal comme String

Nouveau pseudo-code :
Déclarer la variable texteclair comme un String
Déclarer la variable code comme un string
Déclarer codetotal comme String
Déclarer la variable longtext comme un Int
Déclarer le compteur de boucle i comme un Int
Déclarer un compteur de lettres j comme un Int
Déclarer la variable codemot comme un Int
Déclarer la variable codelettre comme un Int

Prendre la longueur du texte (dans longtext)
Pour i 0 jusqu'à longtext
    Prendre le code ASCII de la lettre n° i de texteclair
    Si le code ASCIII de la lettre est >= 65
           lui enlever 65 et donner cette valeur à codelettre            ---> Le code ASCII de A est 65
           ajouter (codelettre +1)*26^j à codemot
           incrémenter j de 1
   sinon                                                                                   ---> Cas où le code est est 32 (espace)
          Ranger dans code, codetexte converti en string
          Concaténer code + une espace à  codetotal
          réinitialiser j et codemot à 0                                                                     
Concaténer espace+codemot converti en string à codetotal
Afficher codetotal

Code Python

#!/usr/bin/env python
# -*- coding:UTF-8 -*-

texteclair, code, codetotal = '','',''
longtext, codetexte, codemot, i, j = 0,0,0,0,0

texteclair='LUKE SKYWALKER VS DARK VADOR'
longtext=len(texteclair)

for i in range(longtext):
    codelettre=ord(texteclair[i])
    if codelettre >=65:
        codelettre=codelettre-65
        codemot=codemot+(codelettre+1)*26**j
        j=j+1      
    else :
        code=str(codemot)
        print code
        codetotal=codetotal+code+' '
        j=0
        codemot=0
codetotal=codetotal+' '+str(codemot)      
print u"Le code chiffré de "+texteclair+' est :', codetotal

Résultat 1 :

Le code chiffré de KEVIN est :  6570861

Résultat 2 :

Le code chiffré de LUKE SKYWALKER VS DARK VADOR est : 95874 3802587741725 516 205534  8491960

Bon, j'ai codé vite fait, mais ça marche... A toi de jouer pour le passage en C
Je vais penser au décodage...

@+


Arx Tarpeia Capitoli proxima...

Hors ligne

#3 21-08-2009 14:18:46

ff
Invité

Re : Cryptage et Decryptage.

Ce cryptage a un nom, je suis presque sur de l'avoir déjà vu sur dcode mais je le retrouve pas.

En tout cas il s'agit d'une bête opération de changement de base, tu passes de la base 10 à la base 26. Aucun problème de décodage ou d'encodage.

#4 21-08-2009 14:45:56

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 16 943

Re : Cryptage et Decryptage.

Bonjour invité,

"A chi consiglia non duole il capo !"

@+


Arx Tarpeia Capitoli proxima...

Hors ligne

#5 21-08-2009 17:07:40

darkarya
Membre
Inscription : 21-08-2009
Messages : 3

Re : Cryptage et Decryptage.

Merci bien j'attend ta partie décryptage avec impatience!! Encore merci.

Excuse moi mais j'ai tester ton scrypte mais python me met qu'il y a une erreur a la ligne qui dit:
print code

Je n'y connais rien mais serais ce par ce que j'ai oublier quelque chose?

J'utilise la version 3.1.1 de python et sous IDLE si sa peut aider à résoudre mon problème.

Dernière modification par darkarya (21-08-2009 17:28:12)

Hors ligne

#6 21-08-2009 17:54:24

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 16 943

Re : Cryptage et Decryptage.

Salut,

Oui, c'est normal... Il y a des différences entre la 2.6 que j'utilise et la 3.1
Dans la version 3.x, print est devenu la fonction print().
On n'écrit plus :
print codetotal
mais
print(codetotal)

Je n'aurais jamais sinon mis en ligne un petit bout de code non testé...
Maintenant si tu veux vraiment travailler en Python et plus en C, alors je récrirais le code parce que je me suis forcé à n'utiliser que les instructions les plus basiques pour que ce soit le plus facilement transposable en C.

Pour le déchiffrement, je suis presque au bout...
Voilà comment en gros je vais procéder..
Je transforme codetotal en une liste de mots.
Avec le résultat2, j'obtiens :
["95874","3802587741725"," 516"," 205534"," 8491960"]
Je les extrais un par un.
Prenons "3802587741725".
Je transforme "3802587741725" en un entier long  que j'appelle motchiffre via la fonction int()
Ensuite, à combien de lettres cela correspond-t-il ?
Et bien je cherche nombrelettres tel que 26^nombrelettres >= motchiffre
Soit    nombrelettres*ln(26) >= ln(motchiffre)
Ou encore nombrelettres>= ln(motchiffre)/ln(26)
Donc ici je calcule nombrelettres=1+ ln(motchiffre)/ln(26) et j'obtiens 9.

Donc je calcule 3802587741725 % 26**8, soit le reste de la division euclidienne de 3802587741725 par 26^8 qui va remplacer 3802587741725 pour la suite, et aussi
(3802587741725-(3802587741725 % 26**8))/26**8 soit 18.
Et je prends le 18e caractère de l'alphabet, en python chr(64+18) soit le R de SKYWALKER
Et je recommence.
J'obtiens donc successivement R E K L A W Y K S

A bientôt j'espère

@+


Arx Tarpeia Capitoli proxima...

Hors ligne

#7 21-08-2009 19:43:19

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 16 943

Re : Cryptage et Decryptage.

Re,

Déchiffrage.

#!/usr/bin/env python
# -*- coding:UTF-8 -*-

from math import log,ceil

mots,mot,texteclair,codelettre,nombrelettres,motchiffres,mot1=[],'','',0,0,0,0
codetotal,lettres='142 151125748273 12978 7664042205',''
i=0
mots=codetotal.split(' ')

for mot in mots:
    motchiffres=int(mot)
    nombrelettres=1+int(log(motchiffres)/log(26))
    for i in range(nombrelettres,0,-1):
        mot1=motchiffres
        motchiffres=motchiffres%26**(i-1)
        codelettre=(mot1-motchiffres)/26**(i-1)
        lettres=chr(64+codelettre)+lettres
    texteclair=texteclair+lettres+' '
    lettres=''
texteclair=texteclair.strip(' ')
print u"Le texte clair correspondant à "+codetotal+" est :"
print '     ',texteclair

Résultat :

Le texte clair correspondant à 142 151125748273 12978 7664042205 est :
      LE SEIGNEUR DES ANNEAUX

Et si tu veux "jouer" avec Python, voilà un code de cryptage bien plus propre et plus court :

#!/usr/bin/env python
# -*- coding:UTF-8 -*-

from math import log
texte, texteclair,code, codetotal, lettre, mot='' =[], '','','','',''
codelettre, codemot, i = 0,0,0

texteclair='LUKE SYWALKER VS DARK VADOR'
texte=texteclair.split(' ')

for mot in texte:
    for lettre in mot:
        codelettre=ord(lettre)-65
        codemot=codemot+(codelettre+1)*26**i
        i+=1
    code=str(codemot)
    codetotal=codetotal+code+' '
    i=0
    codemot=0
       
print u"Le code chiffré de "+texteclair+' est :', codetotal

Je commenterai ces codes demain.

@+


Arx Tarpeia Capitoli proxima...

Hors ligne

#8 21-08-2009 21:46:48

ff
Invité

Re : Cryptage et Decryptage.

Rebonjour,
pour prouver que je ne parle pas pour rien dire voici la page sur l'hexagesimal (base 26) accompagné d'un applet dont je parlais réalisant le codage / décodage présenté ci dessus.

#9 21-08-2009 22:00:07

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 16 943

Re : Cryptage et Decryptage.

Bonsoir,

Je n'ai jamais douté que cela existe...
J'attendais une proposition.
"A chi consiglia  non duole il capo" = (littéralement) "A celui qui conseille la tête n'est pas douloureuse" ;-)

Mon but était de faire de la "pédagogie"...
Le site m'a permis, si besoin était, de constater que mes scripts Python fonctionnent correctement.
D'ailleurs, ils sont sûrement perfectibles et je tâcherai de les améliorer encore...

@+


Arx Tarpeia Capitoli proxima...

Hors ligne

#10 22-08-2009 09:35:38

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 16 943

Re : Cryptage et Decryptage.

Hello,

Cryptage. Méthode plus concise utilisant un dictionnaire.

#!/usr/bin/env python
# -*- coding:UTF-8 -*-

# Initialisations (pas toutes nécessaires : le "typage" est dynamique en Python)
texte, texteclair, codetotal, lettre =[], '','',''

# Dictionnaire avec les positions des lettres dans l'alphabet
Dico={'A':1,'B':2,'C':3,'D':4,'E':5,'F':6,'G':7,'H':8,'I':9,'J':10,
      'K':11,'L':12,'M':13,'N':14,'O':15,'P':16,'Q':17,'R':18,'S':19,'T':20,
      'U':21,'V':22,'W':23,'X':24,'Y':25,'Z':26}

texteclair='LUKE SKYWALKER VS DARK VADOR'
# Transformation de la chaine en liste de chaînes
texte=texteclair.split(' ')

for mot in texte:                       # Pour chaque élément de la la liste
    codemot,i=0,0                       # Initialisations à zéro
    for lettre in mot:                  # Pour chaque lettre du mot
        codemot+=Dico[lettre]*26**i     # Incrémendation de la valeur du code
        i+=1                            # Incrémentation de la position
    codetotal+=str(codemot)+' '         # concaténation du codemot converti en string
codetotal=codetotal.strip(' ')          # Suppression de l'espace final en trop

# Affichage : le u à cause de la déclaration d'encodage en UTF-8
print u'     Le code chiffré de'
print texteclair
print '            est :'
print codetotal

Des questions ?

Quelques explications de plus sur le mode déchiffrage : j'ai éliminé des calculs inutiles (j'ai l'esprit plus clair ce matin).
De même que 9*10^0+9*10^1+9*10^2 = 999 < 1000 (= 10^3), on a aussi
25*26^0+25*26^1+25*26^2 = 17575 < 17576 (= 26^3)
code correspondant à Z...
De même le code de AAA correspond à 1+26+676 = 703
et E(n(703)/ln(26))=2... Il y a donc bien 3 chiffres.

Je reprends la formule : [tex]{\ln(17575)\over \ln(26) }\approx 2,9999825...[/tex]
Donc j'arrondis à 3 = 1+partie entière de 2,9999...
Prenons 6494.
[tex]{\ln(6494)\over \ln(26) }\approx 2,6944...[/tex]
Il y a 3 lettres, et la dernière puissance de 26 utilisée est 2.
6494 s'écrit donc : 6494 = x * 26^0 + y* 26^1 + z * 26^2 = (x + 26y)+26^2 * z
Le reste de la division de 6494 par 26^2 est donc  x + 26y.
Et le quotient entier est z = 6494/26^2 = 9.
Et le reste est  6494%26^2 = 410
(Attention à partir de Python 3.0 le quotient entier s'obtient avec  //...)
Le 9 m'indique que la dernière lettre du mot est la 9e lettre de l'alphabet, soit I.
Maintenant on repart de x + 26y = 410.
j'ai donc y = 410/26 = 15 et x = 410 mod 26 = 20
Les 15e et 20 e lettres de l'alphabet sont donc O et T, le déchiffrage m'a donc donné I O T et à la concaténation, je dois mettre la lettre trouvée devant les précédentes et non derrière, soit le mot TOI
Et je vais concaténer les mots trouvées l'un derrière l'autre (cette fois), mais j'aurais un espace en trop à la fin que je supprime en sortie de boucles.
Voilà le code et j'ai l'impression qu'il est légèrement améliorable.

#!/usr/bin/env python
# -*- coding:UTF-8 -*-

# Importation du log depuis le module math (pas présent par défaut)
from math import log                      

mots,mot,texteclair,codelettre,nombrelettres,motchiffres,i=[],'','',0,0,0,0
codetotal,lettres='95874 3802587741725 516 205534 8491960',''

# Transformation de la chaîne en une liste de chaînes
mots=codetotal.split(' ')

# Liste des lettres de l'alphabet
# Ajout de @ dans l'alphabet pour que l'indice de début corresponde à la position
# Ainsi on élimine une soustraction de 1 ultérieurement : gain en vitesse d'exécution

alphabet=['@','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z']


for mot in mots:                  # Pour chaque élément de liste
    motchiffres=int(mot)          # Conversion de chaque élément en nombre entier
    nombrelettres=1+int(log(motchiffres)/log(26))
    for i in xrange(nombrelettres,0,-1):
        codelettre=motchiffres/26**(i-1)       # En Python 3.x remplacer / par //
        motchiffres=motchiffres%26**(i-1)      # Calcul du reste modulo 26^(i-1)                    
        lettres=alphabet[codelettre]+lettres
    texteclair+=lettres+' '
    lettres=''
texteclair=texteclair.strip(' ')               # Elimination de l'espace final en trop
       
print u"Le texte clair correspondant à "+codetotal+" est :"
print '     ',texteclair
print

Questions ?

@+


Arx Tarpeia Capitoli proxima...

Hors ligne

#11 23-08-2009 21:44:43

SébastienB
Membre
Lieu : Annecy
Inscription : 16-06-2008
Messages : 55

Re : Cryptage et Decryptage.

Bonjour,

Merci pour cette solution de cryptage. Ça m'a donné des idées mais je rencontre un petit problème technique:

-Comment faire pour utiliser un dictionnaire implicite, par exemple la table de caractères latin1 (ISO8859-1) qui comprend les 127 caractères du code ASCII + les caractères accentués et des caractères spéciaux, soit 255 caractères en tout ?

Avec mon code, si le mot dépasse 8 caractères, ça ne marche pas:

#include<iostream>
#include<string>
#include<cmath>
#include<cstdlib>
#include<sstream>
#include<algorithm>

using namespace std;


int main(){
    //char dico[26] = {'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};
    string s;            //Texte à crypter    
    int j,l;            //Indice de chaque caractère et longeur de la chaîne de caractères
    long long enc=0;    //Mot encodé en base 10      
    long long k;        //Coefficient multiplicateur
    ostringstream o;    //Flux de sortie
    unsigned char uc;    //Caractère non signé utilisé pour obtenir le code du caractère en base 10 sur la page de code latin1
    char buffer[64];    //Mémoire tampon de changement de base du mot encodé

    cout << "Tapez un mot "<< char(0x85) << " crypter:"; getline ( cin , s );
    l = s.length();
   
    for (j=0;j<39;j++) cout << "--";
    cout << endl;

    /* CRYPTAGE
     *
     **************/
    for ( j=0; j<l; j++ ){
        uc = s.at(j);                    //Récupérer le caractère uc dans la chaîne s à l'indice j
        k = long long(pow(255.0,j));    //Calculer un coefficient multiplicateur
        enc += int(uc) * k;                //Calculer le mot encodé en base 10

        cout << s.at(j) << ":" << int(uc) << "*" << k << ";u(n-1)+u(i)=" << enc << endl;        
    }
   
    for (j=0;j<39;j++) cout << "--";
    cout << endl;

    cout << "MOT CRYPT"<<char(0x90)<<" en base 10: "<< enc << endl;

    for (j=0;j<39;j++) cout << "--";
    cout << endl;
   
    //_itoa(enc,buffer,36);                //Convertir en base 36 pour raccourcir le mot
    //o << buffer;
    //cout << endl << o.str() << endl;

   
    //s = o.str();
    //cout << s.c_str() << endl;
    //enc = strtol(s.c_str(),NULL,36);    //Convertir en base 10 pour retrouver le mot encodé
    //cout << enc <<endl;

    /* DÉCRYPTAGE
     *
     **************/
    l = floor(log(double(enc)) / log(255.0)) + 1;                //Retrouver la longeur du mot

    for (j=0;j<39;j++) cout << "--";
    cout << endl;

    cout <<"LONGEUR DU MOT : " << l << endl;
   
    for (j=0;j<39;j++) cout << "--";
    cout << endl;
   
    long long d;
    while (l > 0) {
        d = enc / pow(255.0,(l-1));
        enc = enc % (long long(pow(255.0,(l-1))));
        cout << enc << endl;
        cout << d << " " << char(d) << endl;
        o << char(d);
        l--;
    }
    s = o.str();
    reverse(s.begin(),s.end());


    cout << "MOT D"<<char(0x90)<<"CRYPT"<<char(0x90)<<" : " << s << endl;

    for (j=0;j<39;j++) cout << "--";
    cout << endl;
    return 0;
}

Tapez un mot à crypter:bonjour
------------------------------------------------------------------------------
b:98*1;u(n-1)+u(i)=98
o:111*255;u(n-1)+u(i)=28403
n:110*65025;u(n-1)+u(i)=7181153
j:106*16581375;u(n-1)+u(i)=1764806903
o:111*4228250625;u(n-1)+u(i)=471100626278
u:117*1078203909375;u(n-1)+u(i)=126620958023153
r:114*274941996890625;u(n-1)+u(i)=31470008603554403
------------------------------------------------------------------------------
MOT CRYPTÉ en base 10: 31470008603554403
------------------------------------------------------------------------------
------------------------------------------------------------------------------
LONGEUR DU MOT : 7
------------------------------------------------------------------------------
126620958023153
114 r
471100626278
117 u
1764806903
111 o
7181153
106 j
28403
110 n
98
111 o
0
98 b
MOT DÉCRYPTÉ : bonjour
------------------------------------------------------------------------------
Appuyez sur une touche pour continuer...

Ensuite, je me demandais comment faire disparaitre les blancs dans un un long texte crypté et faire idéalement qu'il soit + court que le texte initial en clair ?

Merci bien en tous cas pour votre aide.
@+

Hors ligne

#12 23-08-2009 22:11:25

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 16 943

Re : Cryptage et Decryptage.

Salut Seb,

J'essaierai de te répondre demain, même s'il faudrait que j'apprenne le C++, parce que je comprends pas grand chose...

As-tu essayé d'écrire ton code C++ en 'pseudo-code' ou as-tu essayé simplement de transposer le mien ?
As-tu essayé, calculette à la main, d'effectuer tes calculs tout seul sur du papier en suivant pas à pas l'exécution de ton code pour un mot de 9 lettres ? Cela te permettrait de voir ce qui cloche au delà du 8e caractère (codage ou décodage ?)...
Sinon, modifie ton code pour qu'il affiche d'autres infos de ton choix à chaque itération, tu pourrais ainsi contrôler sans effort si ce qui se passe est conforme à tes attentes...
Message d'erreur ou pas ? Si oui, lequel ?
As-tu pensé à la limitation des nombres en longueur (typage) ?

Par ta question en gras, tu fais allusion à ceci :

<< char(0x85)

?
c'est un à ?
Parce qu'alors le code à afficher serait plutôt 0xe0...
Tu veux pouvoir utiliser les 255 caractères dans ton texte ? Je ne sais pas si ça fonctionne comme en Python, mais en Python il faut déclarer l'encodage au début du script. Un petit tour sur Google devrait te dire comment faire.

Supprimer les espaces dans un texte ?
Y a une fonction (une "méthode" est plus exact) en Python : replace().
texte.replace(' ','') = remplace dans texte les espaces par du vide ...
Doit bien y en avoir une en C++

@+

[EDIT]
Je vois pow(255.0,j), tu codes avec des puissances de 255 ?
Et comme numéro de lettre, tu prends (ou voudrais prendre) son code ascii étendu.
En python pour l'avoir, on fait simplement :
print ord('ç') --> 231
en Hexa
print hex(ord('ç')) --> 0xe7

Avec d'autres langages c'est ASC('ç')...

Dernière modification par yoshi (24-08-2009 07:23:10)


Arx Tarpeia Capitoli proxima...

Hors ligne

#13 24-08-2009 08:49:13

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 16 943

Re : Cryptage et Decryptage.

Bonjour,

Je n'ai pas encore cherché pourquoi ton script coince au delà de 8 caractères (même avec les caractères majuscules "standards" ?)...
Ca va pô être simple.  Bon, je vais faire comme si je n'allais pas avoir de réoponse à mes demandes d'éclaircissement d'ici un certain temps...
Au cas où j'aie une idée fulgurante, je reposterai.

Mais pour ton histoire de "dictionnaire implicite", jette un oeil sur cette discussion :
http://forum.hardware.fr/hfr/Programmat … 9860_1.htm
J'ai cherché char buffer[], ce qui m'amène à d'autres questions :
char buffer[64], ton buffer il te sert à stocker l'entrée clavier  ou ton code chiffré ? Pas très clair !
64 quoi ? bits ? octets ? ko ? Est-ce suffisant ?
Parce que le code ascii à la puissance 255 ça fait vite de gros nombres...
Pourquoi une conversion en "base" 36, puis en "base" 10 ? Je ne comprends pas ce que tu fais.

Je pense que si tu essayais la conversion en C++ de mon programme de codage via les 26 caractères de A à Z, et leur position de 1 à 26 dans l'alphabet, sur ta même base de programmation, alors on pourrait comparer les fonctionnements. Lorsqu'il marcherait, il serait alors toujours temps d'étendre le fonctionnement à ton propos initial : allons du simple au compliqué...

Je vais quand même attendre tes réponses.


@+


Arx Tarpeia Capitoli proxima...

Hors ligne

#14 26-08-2009 12:23:57

SébastienB
Membre
Lieu : Annecy
Inscription : 16-06-2008
Messages : 55

Re : Cryptage et Decryptage.

Bonjour,

J'ai pris la base 255 car il y a 255 caractères dans mon alphabet. La première de mes problématiques sur ce sujet était de trouver une table de caractères disponible sur tous les ordis et j'ai utilisé celle qui correspond en fait à Windows OEM - cp850 (multilingual Latin I) (http://pythonfacile.free.fr/python/codepages.html)

Ensuite, j'ai utilisé un entier long (long long = __int64 = entier codé sur 64 bits) qui permets donc de stocker une valeur maximum de [tex]2^{65} - 1 = 36893488147419103231[/tex]

et [tex]255^9 - 1 = 4558916353692287109374[/tex] , donc il y avait bien un dépassement de capacité.

par contre [tex]\frac{\ln{(\text{mot représenté en décimal})}}{\ln{(\text{base})}} = \text{longeur du mot}[/tex]

et  [tex]\frac{\ln{(\text{nombre en base 10})}}{\ln{(10)}} = \text{longeur du nombre = nombre de chiffres}[/tex]

?

En utilisant un long double pour ma variable 'enc', je n'ai plus le problème de limite et je peux calculer des mots de plus de 26 lettres et ensuite calculer le modulo avec la fonction fmodl, mais là, ça décrypte bien la fin du mot mais pas le début (perte de précision paradoxalement). Donc il faut bien que j'utilise exclusivement des types entiers, pourquoi ça ne marche plus avec des réeels ?
                                                               

Pour finir, je passerai le code en base 36 à la prochaine étape et j'esserai de poster un code un peu + propre...
Mais dans l'absolu, je pense qu'un alphabet disponible sur toutes les machines est bien [tex]\mathbb{B} = \{0,1\}[/tex] et que toute problématique en informatique revient en fait à faire des décalages avec les mots de cet alphabet dans [tex]\mathbb{B}^*[/tex].

Merci :)
@+

Hors ligne

#15 26-08-2009 13:29:31

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 16 943

Re : Cryptage et Decryptage.

Salut,


Pour la suite, pourrais-tuouvrir un topic spécifique,avec un sujet genre :  [C++]Cryptage et décryptage en bases diverses ?
Merci pour Dark, qui reste ainsi "propriétaire" de son topic à lui, sans "bruit e fond" extérieur
..

1.

je peux calculer des mots de plus de 26 lettres

Le mot le plus long de la langue française est "ANTICONSTITUTIONNELLEMENT" et il a 21 lettres...

2.
Je ne comprends pas ce qui ne va pas pas quand tu écris

par contre [tex]\frac{\ln{(\text{mot représenté en décimal})}}{\ln{(\text{base})}} = \text{longeur du mot}[/tex]

et  [tex]\frac{\ln{(\text{nombre en base 10})}}{\ln{(10)}} = \text{longeur du nombre = nombre de chiffres}[/tex]

?

A partir du moment où en base dix, on utilise que dix lettres numérotées de 0 à 9, longueur du nombre et longueur du mot coïncident. Dans le cas où j'utilise les 26 lettres de l'alphabet (et au delà), je ne vois pas ce que tu reproches à ma formule...

3. J'ai beau regarder ton code, je ne vois pas de raison objective pour qu'il ne marche pas au delà de 8 caractères, au niveau programmation, j'entends.
Pour ma part, mon code fonctionne en "base 26" (abus de langage !). Pour preuve :

Le code chiffré de
ANTICONSTITUTIONNELLEMENT
            est :
187111517476497409201280668547528373

et  (clin d'oeil au film "Mary Poppins") :

Le texte clair correspondant à 662824705633582139949295619227331095854993081039613 est :
      SUPERCALIFRAGILISTICEXPEDIALIDOCIOUS

4. Donc ton problème se produit au décodage.

Pourquoi ça marche plus avec des réels ?

Là, je ne vois pas ? Peut-être est-ce dû aux limitations (?) d'utilisation du modulo en C++ ? Si ça n'est "que" cela, ça peut se contourner...

5. Abus de langage. Je préfère préciser pour ceux qui me liraient que à strictement parler :
* La base deux utilise deux symboles de base (chiffres) pour écrire tous les nombres : 0,1
* La base dix utilise dix symboles de base (chiffres) pour écrire tous les nombres : 0,1,2,3,4,5,6,7,8,9
* La base seize utilise seize symboles de base pour écrire les nombres  0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F
Il a bien fallu utiliser 6 symboles supplémentaires... Ainsi le nombre &FED écrit en base seize s'écrit lui, en base dix : 256*15+16*14+13 = 4077.
Au passage, l'écriture en base dix est plus longue qu'en base seize...

6.

La première de mes problématiques sur ce sujet était de trouver une table de caractères disponible sur tous les ordis

tu aurais dû préciser : munis de Windows...
Or il y a le monde Linux et le monde Mac. Je ne sais pas si les scripts C++ sont portables directement sur Linux, par exemple, mais Python, si ! A condition de prendre quelques précautions dans l'écriture du code. Je pense que, au moins mes deux derniers scripts sont exécutables tels quels sous Linux.

@+

[EDIT] Je viens de reprendre le problème du décodage 'à l'endroit' :

#!/usr/bin/env python
# -*- coding:UTF-8 -*-

# Importation du log depuis le module math (pas présent par défaut)
from math import log                      

mots,mot,texteclair,cdelettre,nombrelettres,motchiffres,i=[],'','',0,0,0,0
cdetotal='95874 3802587741725 516 205534 8491960 343438 158187586719'

# Transformation de la chaîne en une liste de chaînes
mots=cdetotal.split(' ')
# Liste des lettres de l'alphabet
alphabet=['@','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z']

for mot in mots:                  # Pour chaque élément de liste
    motchiffres=int(mot)          # Conversion de chaque élément en nombre entier
    nombrelettres=1+int(log(motchiffres)/log(26))
    for i in xrange(1,nombrelettres):
        motchiffres,cdelettre=motchiffres/26, motchiffres%26                
        texteclair+=alphabet[cdelettre]
    texteclair+=alphabet[motchiffres]+' '      #ajout du dernier caractère et d'une espace
texteclair=texteclair.strip(' ')               # Elimination de l'espace final en trop
       
print u"Le texte clair correspondant à "+cdetotal+" est :"
print '     ',texteclair
print

Ca fonctionne (apparemment plus rapide) :

Le texte clair correspondant à 95874 3802587741725 525 205534 8491960 361393 343438 158187586719 est :
      LUKE SKYWALKER ET DARK VADOR SONT DANS STARWARS

Est-ce que ça résout le problème de perte ?


Arx Tarpeia Capitoli proxima...

Hors ligne

#16 26-08-2009 20:30:11

darkarya
Membre
Inscription : 21-08-2009
Messages : 3

Re : Cryptage et Decryptage.

Oua quel travail gigantesque je te remercie beaucoup et désolé de pas avoir répondu plus tot j'était en droit de visite chez ma mère en tout cas merci beaucoup je vais essayé sa dessuite.

Encore merci!!

Edit:

Avec la version que j'utilise de python il y a encore une erreur mais je comprend pas pourquoi peut tu encore m'aider??

Code:
#!/usr/bin/env python
# -*- coding:UTF-8 -*-

texteclair, code, codetotal = '','',''
longtext, codetexte, codemot, i, j = 0,0,0,0,0

texteclair='LUKE SKYWALKER VS DARK VADOR'
longtext=len(texteclair)

for i in range(longtext):
    codelettre=ord(texteclair[i])
    if codelettre >=65:
        codelettre=codelettre-65
        codemot=codemot+(codelettre+1)*26**j
        j=j+1       
    else :
        code=str(codemot)
        print (code)
        codetotal=codetotal+code+' '
        j=0
        codemot=0
codetotal=codetotal+' '+str(codemot)       
print (u"Le code chiffré de "+texteclair+' est :', codetotal)


Le probleme est a la dernière ligne j'ai ramplacé comment tu m'a dit les print part print ().
Mais l'erreur se trouve au niveau du +qui précède texteclaire (je suppose que l'autre apres ne fonctionne pas aussi mais je sais pas).

Merci d'avance.

Dernière modification par darkarya (26-08-2009 20:47:44)

Hors ligne

#17 26-08-2009 20:43:41

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 16 943

Re : Cryptage et Decryptage.

re,

Quand on aime, on ne compte pas... c'est bien connu !
N'oublie pas, avec Python 3.x on écrit
print("Le texte clair correspondant à "+codetotal+" est :")
print( '     ',texteclair)

print est devenu une fonction...

T'as toujours la ressource de virer python 3.x pour remettre python 2.6 : beaucoup sont restés à Python 2.5/2.6 en attendant d'y voir un peu plus clair avec la nouvelle version et surtout de pouvoir disposer des même bibliothèques.
Par exemple, avec Python 3.x, je ne peux pas encore "compiler" mes programmes pour qu'ils fonctionnent seuls, sans Python préinstallé... ;-)

Tiens-moi au courant.

@+

PS
j'ai trouvé comment tester print() et // à l'intérieur de 2.6, si ça plante toujours...
Je n'avais pas vu ton post...

Essaie d'écrire ça alors :
print ("Le code chiffré de",texteclair," est :", codetotal)
En mettant des virgules (à la place des +) qui génèrent automatiquement un espace tout en restant sur la même ligne...
Essaie aussi avec et sans le u : j'ai vu que Python 3.0 était en unicode par défaut...
As-tu bien remplacé la division /  par // ?

Peux-tu copier/coller le message d'erreur s'il te plaît ?

Dernière modification par yoshi (26-08-2009 21:08:08)


Arx Tarpeia Capitoli proxima...

Hors ligne

#18 26-08-2009 21:16:51

darkarya
Membre
Inscription : 21-08-2009
Messages : 3

Re : Cryptage et Decryptage.

je me suis mis a python 2.6 je pense qu'il n'y aura plus de problème merci beaucoup!!

PS: les 2 programme marche tres bien merci beaucoup.

Mais j'ai encore une question tu as dis qu'avec python 2.6 on pouvé créer un programme de cryptage ne dépendant plus de python comment puis-je faire svp??

Dernière modification par darkarya (26-08-2009 21:22:06)

Hors ligne

#19 26-08-2009 21:23:55

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 16 943

Re : Cryptage et Decryptage.

Bonsoir,

Ok !
Rappels versions définitives améliorées
Codage :

#!/usr/bin/env python
# -*- coding:UTF-8 -*-

# Initialisations (pas toutes nécessaires : le "typage" est dynamique en Python)
texte, texteclair, codetotal, lettre =[], '','',''

# Dictionnaire avec les positions des lettres dans l'alphabet
Dico={'A':1,'B':2,'C':3,'D':4,'E':5,'F':6,'G':7,'H':8,'I':9,'J':10,
      'K':11,'L':12,'M':13,'N':14,'O':15,'P':16,'Q':17,'R':18,'S':19,'T':20,
      'U':21,'V':22,'W':23,'X':24,'Y':25,'Z':26}

texteclair='LUKE SKYWALKER VS DARK VADOR'
# Transformation de la chaine en liste de chaînes
texte=texteclair.split(' ')

for mot in texte:                       # Pour chaque élément de la la liste
    codemot,i=0,0                       # Initialisations à zéro
    for lettre in mot:                  # Pour chaque lettre du mot
        codemot+=Dico[lettre]*26**i     # Incrémendation de la valeur du code
        i+=1                            # Incrémentation de la position
    codetotal+=str(codemot)+' '         # concaténation du codemot converti en string
codetotal=codetotal.strip(' ')          # Suppression de l'espace final en trop

# Affichage : le u à cause de la déclaration d'encodage en UTF-8
print u'     Le code chiffré de'
print texteclair
print '            est :'
print codetotal

Décodage :

#!/usr/bin/env python
# -*- coding:UTF-8 -*-

# Importation du log depuis le module math (pas présent par défaut)
from math import log                      

mots,mot,texteclair,cdelettre,nombrelettres,motchiffres,i=[],'','',0,0,0,0
cdetotal='95874 3802587741725 516 205534 8491960 343438 158187586719'

# Transformation de la chaîne en une liste de chaînes
mots=cdetotal.split(' ')
# Liste des lettres de l'alphabet
alphabet=['@','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z']

for mot in mots:                  # Pour chaque élément de liste
    motchiffres=int(mot)          # Conversion de chaque élément en nombre entier
    nombrelettres=1+int(log(motchiffres)/log(26))
    for i in xrange(1,nombrelettres):
        motchiffres,codelettre=motchiffres/26, motchiffres%26                
        texteclair+=alphabet[cdelettre]
    texteclair+=alphabet[motchiffres]+' '      #ajout du dernier caractère et d'une espace
texteclair=texteclair.strip(' ')               # Elimination de l'espace final en trop
       
print u'        Le texte clair correspondant à :'
print cdetotal
print '                     est :'
print texteclair

Attention aussi à l'indentation (décalage de 4 caractères) très important en Python : un décalage incorrect et tout devient faux !

@+

PS il faut utiliser le programme py2exe.exe
voir
http://www.py2exe.orgtélécharger l'installateur pas le zip
http://www.afpy.org/Members/jbj/py2exe
http://www.developpez.net/forums/f927/a … on/py2exe/

Mais à ce moment là, il faudra modifier le code pour charger soit le message clair, soit le message codé depuis un fichier extérieur, soit poser la question à l'utilisateur pour qu'il tape les caractères au clavier, ce qui nous mène plus loin parce qu'il faut penser à gérer les fautes de frappe éventuelles...

A demain...


Arx Tarpeia Capitoli proxima...

Hors ligne

#20 26-04-2017 16:07:20

ERIC MAKEMBO
Invité

Re : Cryptage et Decryptage.

13, 9, 14, 9, 19, 20, 5, 18, 5-4, 5-12; 5, 14, 19, 5, 9, 7, 14, 5, 13, 5, 14, 20-19, 21, 16, 5, 18, 9, 3, 21,18-21, 14, 9, 22, 5, 18, 19, 9, 20, 1, 9, 18, 5

#21 26-04-2017 16:22:01

ERIC MAKEMBO
Invité

Re : Cryptage et Decryptage.

13, 9, 14, 9, 19, 20, 5, 18, 5-4, 5-12; 5, 14, 19, 5, 9, 7, 14, 5, 13, 5, 14, 20-19, 21, 16, 5, 18, 9, 3, 21,18-21, 14, 9, 22, 5, 18, 19, 9, 20, 1, 9, 18, 5
Et voilà ce que ça donne écrit via LaTeX :
1x2+(y+1)2×[x+i(y−2)][x−i(y+1)]=1x2+(y+1)2×[x2+(y+1)(y−2)+i.(−3x)]

#22 26-04-2017 16:27:04

ERIC MAKEMBO
Invité

Re : Cryptage et Decryptage.

Bonjour!

s'il vous plaît!!!! donnez moi la réponse des codes chiffrés ci-dessus avec le code ASCII

#23 26-04-2017 16:34:51

ERIC MAKEMBO
Invité

Re : Cryptage et Decryptage.

Bonjour,
OK !

Rappels versions définitives améliorées

Codage faites le décryptage des codes chiffrés ci-dessus sans reprendre les virgules qui séparent les codes chiffrés en Microsoft office Word code ASCII EM

#24 26-04-2017 18:24:45

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 16 943

Re : Cryptage et Decryptage.

Bonsoir,

Je veux bien t'aider, mais tu n'es pas clair...
Déjà, quand tu écris :

Et voilà ce que ça donne écrit via LaTeX :
1x2+(y+1)2×[x+i(y−2)][x−i(y+1)]=1x2+(y+1)2×[x2+(y+1)(y−2)+i.(−3x)]

c'est inexact, ce n'est pas du Latex...
Le x c'est $x$ ou [tex]\times[/tex] ?
Le y correspond à quoi ?
Quand tu écris 1x2, tu veux dire [tex]1\times 2[/tex] ou [tex]1x^2[/tex] ?

Ensuite,
Pourquoi un ; ?
Pourquoi un - entre deux nombres ? j'ai remplacé les virgules par des espaces ainsi que le ; et j'ai donc aussi supprimé les groupes de 4 chiffres contenant le -...

Moyennant quoi, le texte clair est à peu près :
MINISTERE ENSEIGNEMENT UPERIC UNIVERSITAIRE
ou
peut être :
MINISTERE ENSEIGNEMENT SUPERIEUR UNIVERSITAIRE ?

Mon programme de décodage récrit pour Python 3.5 est

#!/usr/bin/env python
# -*- coding:UTF-8 -*-

# Importation du log depuis le module math (pas présent par défaut)
from math import log                      

mots,mot,texteclair,cdelettre,nombrelettres,motchiffres,i=[],'','',0,0,0,0
#cdetotal='95874 3802587741725 516 205534 8491960 343438 158187586719'
cdetotal= '13 9 14 9 19 20 5 18 5 14 19 5 9 7 14 5 13 5 14 21 16 5 18 9 3 21 14 9 22 5 18 19 9 20 1 9 18 5'

# Transformation de la chaîne en une liste de chaînes
mots=cdetotal.split(' ')
# Liste des lettres de l'alphabet
alphabet=['@','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z']

for mot in mots:                  # Pour chaque élément de liste
    motchiffres=int(mot)          # Conversion de chaque élément en nombre entier
    nombrelettres=1+int(log(motchiffres)/log(26))
    for i in range(1,nombrelettres):
        motchiffres,cdelettre=divmod(motchiffres,26)                
        texteclair+=alphabet[cdelettre]
    texteclair+=alphabet[motchiffres]+' '      #ajout du dernier caractère et d'une espace
texteclair=texteclair.strip(' ')               # Elimination de l'espace final en trop
       
print ('        Le texte clair correspondant à :')
print (cdetotal)
print ('                     est :')
print (texteclair)

@+


Arx Tarpeia Capitoli proxima...

Hors ligne

#25 27-04-2017 10:03:04

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 16 943

Re : Cryptage et Decryptage.

Re,

Au cas où le message en clair était bien celui trouvé, le codage donné était incorrect...

Le code chiffré de
MINISTERE ENSEIGNEMENT SUPERIEUR UNIVERSITAIRE
            est :
1190498962887 75413135920392405 3929215012157 544491172352275845

obtenu avec :


!/usr/bin/env python
# -*- coding:UTF-8 -*-
 
# Initialisations (pas toutes nécessaires : le "typage" est dynamique en Python)
texte, texteclair, chiffrescode, lettre =[], '','',''
 
# Dictionnaire avec les positions des lettres dans l'alphabet
Dico={'A':1,'B':2,'C':3,'D':4,'E':5,'F':6,'G':7,'H':8,'I':9,'J':10,
      'K':11,'L':12,'M':13,'N':14,'O':15,'P':16,'Q':17,'R':18,'S':19,'T':20,
      'U':21,'V':22,'W':23,'X':24,'Y':25,'Z':26}
 
#texteclair='LUKE SKYWALKER VS DARK VADOR'
texteclair='MINISTERE ENSEIGNEMENT SUPERIEUR UNIVERSITAIRE'

# Transformation de la chaine en liste de chaînes
texte=texteclair.split(' ')
 
for mot in texte:                       # Pour chaque élément de la la liste
    cdemot,i=0,0                       # Initialisations à zéro
    for lettre in mot:                  # Pour chaque lettre du mot
        cdemot+=Dico[lettre]*26**i     # Incrémendation de la valeur du code
        i+=1                            # Incrémentation de la position
    chiffrescode+=str(cdemot)+' '         # concaténation du codemot converti en string
chiffrescode=chiffrescode.strip(' ')          # Suppression de l'espace final en trop
 
# Affichage : le u à cause de la déclaration d'encodage en UTF-8
print ('     Le code chiffré de')
print (texteclair)
print ('            est :')
print (chiffrescode)

@+


Arx Tarpeia Capitoli proxima...

Hors ligne

Pied de page des forums