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).

Répondre

Veuillez composer votre message et l'envoyer
Nom (obligatoire)

E-mail (obligatoire)

Message (obligatoire)

Programme anti-spam : Afin de lutter contre le spam, nous vous demandons de bien vouloir répondre à la question suivante. Après inscription sur le site, vous n'aurez plus à répondre à ces questions.

Quel est le résultat de l'opération suivante (donner le résultat en chiffres)?
vingt et un plus onze
Système anti-bot

Faites glisser le curseur de gauche à droite pour activer le bouton de confirmation.

Attention : Vous devez activer Javascript dans votre navigateur pour utiliser le système anti-bot.

Retour

Résumé de la discussion (messages les plus récents en premier)

Moussa kone
14-05-2020 18:48:59

Bonsoir tt le monde je suis nouveau en matière d'apprentissage de programmation en c, et bien si quelqu'un s'y connaît dans le domaine j'aimerais savoir comment faire un programme permettant de coder et décoder un message.

yoshi
27-04-2017 10:03:04

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)

@+

yoshi
26-04-2017 18:24:45

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)

@+

ERIC MAKEMBO
26-04-2017 16:34:51

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

ERIC MAKEMBO
26-04-2017 16:27:04

Bonjour!

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

ERIC MAKEMBO
26-04-2017 16:22:01

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)]

ERIC MAKEMBO
26-04-2017 16:07:20

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

yoshi
26-08-2009 21:23:55

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...

darkarya
26-08-2009 21:16:51

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??

yoshi
26-08-2009 20:43:41

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 ?

darkarya
26-08-2009 20:30:11

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.

yoshi
26-08-2009 13:29:31

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 ?

SébastienB
26-08-2009 12:23:57

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 :)
@+

yoshi
24-08-2009 08:49:13

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.


@+

yoshi
23-08-2009 22:11:25

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('ç')...

Pied de page des forums