Programme cryptage simple

Discutez d'informatique ici !
t.itou29
Membre Rationnel
Messages: 601
Enregistré le: 22 Jan 2013, 17:20

programme cryptage simple

par t.itou29 » 15 Avr 2014, 11:42

Bonjour,
Je débute en python (et en programmation tout court!) et j'ai essayé de créer un programme qui crypte un message en décalant chaque lettre de n rangs. Je suis arrivé à ceci:
Code: Tout sélectionner
d=int(input("decalage"))
x=raw_input("texte (en minuscules, sans accents)")
y=len(x)
z=list(x)
i=0
for i in range (y): #décale chaque lettre de d rangs#
    p=ord(z[i])
    if p>96 and p122:             
        p=p-26
    a=chr(p)   
    z[i]=a   
print("".join(z))
print(x)

Il fonctionne correctement sauf pour les espaces et caractères spéciaux, ils sont aussi décalés mais je ne comprends par pourquoi normalement le décalage n'a lieu que si le code du caractère correspond à une lettre en minuscule... :mur:

EDIT: finalement c'est bon j'avais mis 0<96 au lieu 96<p ... par contre si quelqu'un a des conseils pour réduire la taille du programme (il doit avoir une méthode plus directe) je suis preneur !



joel76
Membre Relatif
Messages: 230
Enregistré le: 11 Fév 2013, 16:31

par joel76 » 15 Avr 2014, 11:51

Je ne connais pas python, mais djà je pense qu'on peux évrire directement z(i) = chr(p) sans passer par a = chr(p) !

t.itou29
Membre Rationnel
Messages: 601
Enregistré le: 22 Jan 2013, 17:20

par t.itou29 » 15 Avr 2014, 11:55

joel76 a écrit:Je ne connais pas python, mais djà je pense qu'on peux évrire directement z(i) = chr(p) sans passer par a = chr(p) !

Effectivement ! Je me demande comment j'ai pu écrire ça !

Iroh
Membre Relatif
Messages: 374
Enregistré le: 14 Oct 2008, 20:24

par Iroh » 15 Avr 2014, 18:19

Salut.

Code: Tout sélectionner
d = int(raw_input('Decalage: '))
texte = raw_input("Texte (en minuscules, sans accents)")
lettres = [chr(i) for i in xrange(127)]
length = len(lettres)
print(''.join((lettres[(lettres.index(l)+d)%length] for l in texte)))


Voir aussi le module string

Edit: ajout de `modulo length` suite à la remarque de @fatal_error.

Avatar de l’utilisateur
fatal_error
Modérateur
Messages: 6610
Enregistré le: 22 Nov 2007, 13:00

par fatal_error » 15 Avr 2014, 19:15

hello,

j'imagine qu'il faut caller un modulo sur le index(l)+d, sinon dépassement de tableau
la vie est une fête :)

t.itou29
Membre Rationnel
Messages: 601
Enregistré le: 22 Jan 2013, 17:20

par t.itou29 » 15 Avr 2014, 21:56

fatal_error a écrit:hello,

j'imagine qu'il faut caller un modulo sur le index(l)+d, sinon dépassement de tableau

C'est le même principe qu'en maths les modulos dans python ?

Iroh
Membre Relatif
Messages: 374
Enregistré le: 14 Oct 2008, 20:24

par Iroh » 15 Avr 2014, 22:00

fatal_error a écrit:hello,

j'imagine qu'il faut caller un modulo sur le index(l)+d, sinon dépassement de tableau


Modif. Merci vieux.

joel76
Membre Relatif
Messages: 230
Enregistré le: 11 Fév 2013, 16:31

par joel76 » 15 Avr 2014, 22:21

J'ai pas tout suivi mais, ça donne quoi si (lettres.index(l)+d)%length est égal à 0, il faudrait pas rajouter 96 par hasard ?
Ça donne un cryptage bizarre ça.

nana2014
Messages: 9
Enregistré le: 11 Avr 2014, 15:58

par nana2014 » 16 Avr 2014, 01:07

voilà un cryptage qui fonctionne bien : :we:
def cryptage(msg, d):
msgCryp=""; d = d%26
msg = msg.upper() #i, n =0, len (msg)
for L in msg: #while i < n
if 'A' <= L <= 'Z': #if 'A'<= msg[i]<='Z':
p = ord(L) + d # p = ord(msg[i]) + d
if p > ord('Z'): p = p - 26
elif p < ord('A'): p = p + 26
msgCryp = msgCryp + chr(p)
else :
msgCryp = msgCryp + L #msgCryp += msg[i]
#i = i + 1
return msgCryp
MyTxt = input("Entrer votre message à crypter: ")
dec = int (input ("Entrer la clé: "))
s = cryptage(MyTxt, dec)
print("Le txt crypté est:",s)

nana2014
Messages: 9
Enregistré le: 11 Avr 2014, 15:58

par nana2014 » 16 Avr 2014, 01:17

fait attention à l'indentation

Iroh
Membre Relatif
Messages: 374
Enregistré le: 14 Oct 2008, 20:24

par Iroh » 16 Avr 2014, 08:30

joel76 a écrit:J'ai pas tout suivi mais, ça donne quoi si (lettres.index(l)+d)%length est égal à 0, il faudrait pas rajouter 96 par hasard ?
Ça donne un cryptage bizarre ça.


Si tu prends comme lettre:

Code: Tout sélectionner
import string
lettres = string.letters


T'as lettres = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ".

Et si t'appliques le prog avec "decalage=3" et "texte=XYZ", t'obtiens "abc".

joel76
Membre Relatif
Messages: 230
Enregistré le: 11 Fév 2013, 16:31

par joel76 » 16 Avr 2014, 09:15

OK, ça vient de ma méconnaissance de python.

t.itou29
Membre Rationnel
Messages: 601
Enregistré le: 22 Jan 2013, 17:20

par t.itou29 » 16 Avr 2014, 14:57

nana2014 a écrit:voilà un cryptage qui fonctionne bien : :we:
def cryptage(msg, d):
msgCryp=""; d = d%26
msg = msg.upper() #i, n =0, len (msg)
for L in msg: #while i ord('Z'): p = p - 26
elif p < ord('A'): p = p + 26
msgCryp = msgCryp + chr(p)
else :
msgCryp = msgCryp + L #msgCryp += msg[i]
#i = i + 1
return msgCryp
MyTxt = input("Entrer votre message à crypter: ")
dec = int (input ("Entrer la clé: "))
s = cryptage(MyTxt, dec)
print("Le txt crypté est:",s)

Ca devient compliqué pour moi, je débute tout juste. :ptdr:
Je vais essayer de le comprendre quand même et chercher les fonction que je ne connais pas (comme upper() )

nana2014
Messages: 9
Enregistré le: 11 Avr 2014, 15:58

par nana2014 » 17 Avr 2014, 19:49

upper() est une fonction qui convertit toutes les lettres minuscules dans la chaine de caractéres en majuscules et elle est utilisé ici juste pour éviter le probleme de codage (ascii ) tu peut aussi convertit tout les lettres en minuscule en utilisant la fonction lower()
pour assurer que vous etes bien soit dans l'intervalle des minuscules ou de majuscules (ord)

 

Retourner vers ϟ Informatique

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité

Tu pars déja ?



Fais toi aider gratuitement sur Maths-forum !

Créé un compte en 1 minute et pose ta question dans le forum ;-)
Inscription gratuite

Identification

Pas encore inscrit ?

Ou identifiez-vous :

Inscription gratuite