Crypte et decrypte un fichier (avec hash pour vérification)

Soyez le premier à donner votre avis sur cette source.

Snippet vu 22 646 fois - Téléchargée 16 fois

Contenu du snippet

Cryptage avec plusieurs niveaux.

Description rapide du fonctionnement du script:
CRYPTE
0/ lire le fichier d origine
1/ hash du fichier
2/ ralonge le fichier pour qu il soit d'une longeur multiple de 16 !
3/ ajout du hash à la fin du fichier
4/ cryptage 1er niveau: AES avec la clé fournit
5/ cryptage 2eme niveau: ARC2 avec la clé*2
6/ cryptage 3eme niveau: ARC4 avec la clé*3
7/ ecrire le fichier de destination

DECRYPT
0/ lire le fichier d origine
1/ decryptage 3eme niveau: ARC4 avec la clé*3
2/ decryptage 2eme niveau: ARC2 avec la clé*2
3/ decryptage 1er niveau: AES avec la clé fournit
4/ enleve la ralonge et recupe le hash
5/ verification du hash
6/ ecrit le fichier de destination

Source / Exemple :


#argument 1: ['c','C','Crypt','CRYPT'] pour crypter
#	      quoique ce soit d'autre pour decrypter
#
#argument 2: cle à utiliser pour crypter ou decrypter (multiple de 16 caractères) (A-Z/a-z/1-9)
#
#argument 3: fichier d origine (a crypter)
#
#argument 4: fichier de destination (crypter)
######

####importation des librairies:
import Crypto,hashlib,os,sys,string,gtk
from Crypto.Cipher import AES
from Crypto.Cipher import ARC2
from Crypto.Cipher import ARC4

####definition pour le hash
def checksum(message):
	return hashlib.sha224(message).hexdigest()
####definition pour le cryptage
def crypt( message, Key='1a3b4c5e6d7f8g9h0i1j2k3l4m5n6o7p' ):
	if len(message)==0:
		return ""
	else:
		AESobj=AES.new(Key,AES.MODE_ECB) 	
		ARC2obj=ARC2.new(Key + Key ) 
		ARC4obj=ARC4.new(Key + Key + Key) 
		m3=ARC4obj.encrypt(ARC2obj.encrypt(AESobj.encrypt(message)))			
		return m3
####defintion pour le decryptage
def decrypt( message, Key='1a3b4c5e6d7f8g9h0i1j2k3l4m5n6o7p'):
	if len(message)== 0:
		return ""
	else:
		AESobj=AES.new(Key,AES.MODE_ECB)
		ARC2obj=ARC2.new(Key + Key )
		ARC4obj=ARC4.new(Key + Key + Key)
		m3=AESobj.decrypt(ARC2obj.decrypt(ARC4obj.decrypt(message)))	
		return m3

####adaptation de la longeur du message pour qu il soit multiple de 16 (plus ajout du hash)	
def   adaptline(line,div):
	pre_chk=checksum(line)
	lena=len(line+pre_chk)
	addnb=((((lena/div)+1)*div)-lena) 
	if addnb>0 and addnb<10: addnb=addnb+div 
	lenad=len(str(addnb))
	nline= str(addnb) + ((addnb-lenad) * " ") + line + pre_chk
	return nline
####suppression des caracteres ajouter lors de l'adaptation (plus verification du hash)
def  realeaseline(line):
	n=line[0:2:1]
	new=line[int(n):int(len(line)):1]
	message=new[0:len(new)-56:1]
	chk=new[len(new)-56::1]
	if checksum(message)==chk:	
		return message
####fonction de cryptage pour un fichier		
def cryptfile(original_filename, Key , destination_filename): 
	line_file= ""
	FILE_O = open(original_filename,"r")
	FILE_D = open(destination_filename,"w")	
	for line in FILE_O:
		line_file= line_file + line		
	line_file=adaptline(line_file,16)
	crypt_line=crypt(line_file,Key)		
	FILE_D.writelines(crypt_line)

	FILE_O.close()
	FILE_D.close()	

#fonctionde decryptage pour un fichier
def decryptfile(original_filename, Key, destination_filename):
	line_file= ""
	FILE_O = open(original_filename,"r")
	FILE_D = open(destination_filename,"w")	
	for line in FILE_O:
		line_file= line_file + line				
	crypt_line=decrypt(line_file,Key)		
	crypt_line=realeaseline(crypt_line)		
	FILE_D.writelines(crypt_line)
	FILE_O.close()
	FILE_D.close()    

#fonction main
if sys.argv[1] in ["c","C","Crypt","CRYPT"]:
	cryptfile(sys.argv[3],sys.argv[2],sys.argv[4])
else:	
	decryptfile(sys.argv[3],sys.argv[2],sys.argv[4])

Conclusion :


Attention il faut utiliser une clé de 16 ou 32 caracteres !

Exemple
test1.dat contient : 'It s work !'

Lancer:'python cryde.py c aaaaaaaaaaaaaaaa test1.dat test2.dat'
pour crypté le contenu du fichier 'test1.dat' avec la clé 'aaaaaaaaaaaaaaaa' et mettre le resultat dans test2.dat

test2.dat contient alors: 'ɼGºé˜-áÅ;”‰©¤‡P”·à^L¸>A°Æ›aѲüe^ÕJ­à 6Z"S¦všÏ%—K5ìðæ¾0¼*#"Ô­ Í°“n«'

Lancer:python cryde.py c aaaaaaaaaaaaaaaa test2.dat test1.dat
pour décrypter le contenu du fichier 'test2.dat' avec la clé 'aaaaaaaaaaaaaaaa' et mettre le résultat dans test1.dat


Bonne journée à vous !

A voir également

Ajouter un commentaire

Commentaires

Messages postés
45
Date d'inscription
samedi 3 mai 2003
Statut
Membre
Dernière intervention
25 janvier 2011

Merci pour ces infos précieuses Bacterius :-)
Messages postés
3793
Date d'inscription
samedi 22 décembre 2007
Statut
Membre
Dernière intervention
3 juin 2016
8
Remarques niveau crypto :
- on dit "salt" :p
- ne jamais, JAMAIS, rajouter des "couches" de chiffrement. Ca semble plus sûr, mais dans la grande majorité des cas, la sécurité ne change pas du tout, et parfois même elle diminue (exemple : si ARC est plus faible que AES, et c'est probable, il est peut-être possible de récupérer la clef de chiffrement depuis cet algo en contournant complètement AES ... et si la clef de ARC est liée à la clef d'AES, game over).
- bien pour l'utilisation de SHA224, faut arrêter avec le mythique md5 maintenant, pour un checksum ok mais dans le cadre de ta source il s'agit davantage d'un contrôle d'intégrité, qui ne doit pas être mis à mal par les récentes (ou pas) faiblesses de MD5. Donc +1 pour un bon hash. Si ça t'intéresse tu peux te renseigner sur Skein, c'est une fonction de hashage et un algorithme de chiffrement à bloc, peut aussi servir de générateur pseudo-aléatoire ou de chiffrement à flux .. (il y a une implémentation en Python, pySkein, qui fait à peu près tout ce que tu veux mais en encore plus efficace).
- "Attention il faut utiliser une clé de 16 ou 32 caracteres !" non, on ne doit pas restreindre l'utilisateur sur la clef, en général on prend le mot de passe textuel de l'utilisateur, on y ajoute un petit salt et on hash tout ça avec SHA256, et le hash résultat sert de clef pour le reste du programme. Ca fonctionne !

Bref quelques maladresses ici ou là, mais c'est normal quand on débute en crypto, sinon c'est un bon début :)

Cordialement, Bacterius !
Messages postés
382
Date d'inscription
mercredi 23 août 2006
Statut
Membre
Dernière intervention
8 novembre 2010
11
Oui, j'en ai oublier la source !! :)
Sorry

Heu, je manque d'expérience en cryptage pour un bon critique, cela dit, ca fonctionne. Je vois que tu utilise le module Crypto (trop facile :p) c'est dommage toute la partie intéressante est cacher :(
Ça a l'intérêt de simplifier le code c'est sur.
Plein de petite amélioration possible a droite a gauche, comme par exemple lower pour tester des arguments (ca évide de devoir distinguer majuscules et minuscules) + quelques test pour vérifier la véracité des arguments.

Sinon bien trouver [::], ca fait plaisir a voir.
Messages postés
45
Date d'inscription
samedi 3 mai 2003
Statut
Membre
Dernière intervention
25 janvier 2011

Ma source n'est pas utile à cet fin là !
Messages postés
382
Date d'inscription
mercredi 23 août 2006
Statut
Membre
Dernière intervention
8 novembre 2010
11
Ah c'est pas possible, je part une semaine en vacance et à mon retour CS est devenu un repère de H4ckers ... Non mais franchement, il faut pas abusé, demander sur une source comment cracker Messenger ...

Qui puis est, je ne pense pas qu'il faille aider les script kiddies dans leurs problèmes ...

Xeolin a très bien expliqué le problème du sand (ou appeler technique du salage ...) que Microsoft utilise bien sur (oui ils font parfois de la merde, mais ce ne sont pas non plus des noobs).

Une attaque par dico me semble l'unique solution facile. Pas la peine de pleuré pour le script, tu l'auras pas de moi ...

Il y a une époque où il était dangereux de se dire Hackers ...
Afficher les 17 commentaires

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.