Programme cryptage simple
Discutez d'informatique ici !
-
t.itou29
- Membre Rationnel
- Messages: 601
- Enregistré le: 22 Jan 2013, 17:20
-
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 stringEdit: ajout de `modulo length` suite à la remarque de @fatal_error.
-
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)
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 2 invités