Cryptage avec le chiffre de césar

Soyez le premier à donner votre avis sur cette source.

Snippet vu 21 223 fois - Téléchargée 16 fois

Contenu du snippet

Cryptage et decryptage basé sur le chiffre de césar ( voir http://fr.wikipedia.org/wiki/Chiffre_de_C%C3%A9sar )

Source / Exemple :


#!/usr/bin/python
# -*- coding:Utf-8 -*-
from string import upper

class Crypto:
	"""Cryptage utilisant le chiffre de césar
	ch = chaine, d = décalage"""
	def __init__(self, ch, d):
		self.ch, self.d = ch, d
		#On initialise les dictionnaires. Correspondance pour crypter, decorrespondance pour décoder
		self.correspondance = {}
		self.decorrespondance = {}
		
		#On construit les listes. alpha = alphabet normal. ald = alphabet avec le décalage
		self.alpha = [chr(x) for x in xrange(97, 123)]
		self.ald = [self.alpha[(i+self.d)%26] for i in xrange(26)] #Utilisation du modulo pour éviter le OutOfRange
		#Construction de correspondance
		for x in xrange(26):
			self.correspondance[self.alpha[x]] = self.ald[x]
		
	def inverser_dico(self):
		"""Construction du dictionnaire decorrespondance en inversant clé/valeur de correspondance afin d'accéder à la traduction"""
		for (k, v) in self.correspondance.items():
			self.decorrespondance[v] = k
		return self.decorrespondance

	def code(self, p):
		"""Coder et décoder le texte"""
		self.new_ch = []
		self.inverser_dico()
		for car in self.ch:
			if car is ' ':
				self.new_ch.append(' ')
			else:
				if p is True:
					self.new_ch.append(self.correspondance[car])
				else: 
					self.new_ch.append(self.decorrespondance[car])

		return self.new_ch

if __name__ == "__main__":
	while 1:
		chx = raw_input("Voulez (C)rypter ou (D)écrypter votre texte : ")
		if chx.upper() == 'C':
			x = True
		elif chx.upper() == 'D':
			x = None
		else:
			print "Mauvais choix !"
			break
		
		decalage = raw_input("De combien de lettres voulez vous décaler votre code : ")
		if decalage.isdigit():
			txt = raw_input("Veuillez entrer votre texte :\n")
			a = Crypto(txt.lower(), int(decalage))
		else:
			print "Vous devez entrer un nombre !"
			break
		
		try:
			a.code(x)
			print ''.join(a.code(x))
		except:
			print "Vous ne devez rentrer que des lettres !"
			break
				
		r = raw_input("Autre texte à coder ( 1: Oui, Entrée: Non ) : ")
		if r == '1':
			continue
		else:
			break

Conclusion :


Voilà, c'est ma toute première source et un de mes tout premiers vrais programmes ( même si je fais quelques autres petits trucs autour, c'est le seul utile )

J'ai vu qu'il existait d'autre source portant sur le même thème, mais ce n'est pas la même méthode je crois.
Donc voilà, j'attend vos commentaires

A voir également

Ajouter un commentaire

Commentaires

poof65
Messages postés
89
Date d'inscription
samedi 19 avril 2003
Statut
Membre
Dernière intervention
26 janvier 2008
-
En plus court il y a ça

def cesar(ch, d): return ''.join([chr(ord(l)+d) for l in ch])
cs_ara3n
Messages postés
5
Date d'inscription
mercredi 7 novembre 2007
Statut
Membre
Dernière intervention
8 juin 2019
-
Merci de ton commentaire. Effectivement, je m'en suis rendu compte après, mais j'ai estimé qu'il était préférable de la laisser ainsi. J'ai pensé que certains débutants pourraient être intéressé par la technique, et si j'avais utiliser ord() ou chr(), elle aurait été identique à une autre source de ce site :)

Cordialement :)
mumupy
Messages postés
3
Date d'inscription
mercredi 28 novembre 2007
Statut
Membre
Dernière intervention
7 janvier 2008
-
Bonjour,
Je pense que tu aurais pu simplifier ton code en utilisant la fonction ord(). Elle retourne la valeur ascii d'un caractère.
Ex: print ord('a') affiche 97.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

Du même auteur (cs_ara3n)