Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

CRYPTAGE AVEC LE CHIFFRE DE CÉSAR


Information sur la source

Catégorie :Sécurité & cryptage Classé sous : césar, cryptage, cryptographie, chiffre, simple Niveau : Débutant Date de création : 07/11/2007 Date de mise à jour : 07/11/2007 20:51:10 Vu : 2 806

Note :
Aucune note

Commentaire sur cette source (3)
Ajouter un commentaire et/ou une note

Description

Cliquez pour voir la capture en taille normale
Cryptage et decryptage basé sur le chiffre de césar ( voir http://fr.wikipedia.org/wiki/Chiffre_de_C%C3%A9sar )
 

Source

  • #!/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
#!/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
 

Historique

07 novembre 2007 20:51:10 :
Léger problème de commentaire ^^

Commentaires et avis

signaler à un administrateur
Commentaire de mumupy le 28/11/2007 21:04:56

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.

signaler à un administrateur
Commentaire de ara3n le 05/12/2007 20:25:53

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

signaler à un administrateur
Commentaire de poof65 le 26/01/2008 23:06:52

En plus court il y a ça

def cesar(ch, d): return ''.join([chr(ord(l)+d) for l in ch])

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

Librairie graphique vectoriel [ par DoudouBidou ] Bonjour, j'ai depuis quelques jour un projet en tête, celui de réaliser un logiciel de saisi de schéma électrique en python. Cryptage DES [Python] [ par Kadaj676 ] Bonjour j'aimerais savoir si vous aviez de la documentation sur des algo's de cryptage. Principalement DES, et je voudrais vosu demander, si il est po Cryptage xor [ par sorcier0011 ] Bonjour,J'aimerais bien faire un petit crypteur de texte xor mais je n'arrive pas a trouver comment convertir des lettres en Ascii. Parce que apart fa calcul matriciel simple [ par gwenc_hlan ] bonjour,    comment peut on faire sous Python du calcul matriciel simple ? (additionner, multiplier ou inverser des matrices). faut - il impérativeme


Nos sponsors

Sondage...

CalendriCode

Octobre 2008
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,25 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.