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

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

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.