user@linuxtrack:~ $ python -c 'print("Soyez les bienvenus !")'

Vous n'êtes pas identifié(e).

#1 30-12-2013 00:51:21

WarLocG
#! modo de compet

Boite a outils :: chiffrement [make-passlist.py]

Description:

Application qui créé des mots de passe chiffres sur base d\'un code secret et d'options permettant de changer au grès.

Différents sels peuvent être spécifié par l'utilisateur: aucun, date, aléatoire, mot personnalisé avec différentes options pour chacunes.

Un fichier séparé contenant une liste de nom de domaine pourra être chargée afin de créer une liste chiffrée basée sur celle-ci.

Exemple de fichier liste; liste.txt

Pseudo1            gmail.com
Pseudo2            yahoo.fr
moncompte    paypal.net
mes.sources    sourceforge.net

En créant votre fichier, celui-ci devra répondre à l'expression regulière suivante '[0-9a-zA-Z._-]+[\t ]*[a-z]{4,}.[a-z]{2,3}'. Lorsque une ligne du fichier
ne rencontre pas l'expression régulière, il est filtré (voir dans les exemples d'utilisation)

Changelog:
* 29-12-2013 : version initiale
* 30-12-2013 : rajout des listes, un exemple est donné en bas de page

/!\ code source remis à jour le 30-12-2013 /!\

#! /usr/bin/python
# -*- coding: utf-8 -*-

''' Application qui créé des mots de passe chiffres sur base d\'un code secret '''
''' et d\'options permettant de changer au grès. '''
''' Différents sels peuvent être spécifié par l\'utilisateur: aucun, date, aléatoire, '''
''' mot personnalisé avec différentes options pour chacunes. '''
''' Un fichier contenant une liste de nom de domaine pourra être chargée afin de créer '''
''' une liste chiffrée basée sur celle-ci. '''

''' Exemple de fichier liste; liste.txt '''

''' Pseudo1	gmail.com '''
''' Pseudo2	yahoo.fr '''
''' moncompte	paypal.net '''
''' mes.sources	sourceforge.net '''

''' En construction. Projet futur => sortie cvs, xml, html '''

''' Remerciements: '''
''' * boost pour l'exemple sur "hasheur tools" http://linuxtrack.net/viewtopic.php?id=243 '''
''' * google, python.org et stackoverflow pour tout le reste. '''

''' Licensed under the GNU General Public License v3 '''
''' Sous Licence GNU General Public Licence v3 '''
''' Copyright (2013) by WarLocG '''

''' Dernière modification: 2013-12-30 (30 dec 2013) '''

from random import randrange
from commands import getoutput
from hashlib import md5
import sys		#système (exit, argv)
import re 		#expressions regulieres, pour la lecture des fichiers

def main(argv):
	args = sys.argv
	if (len(args)<3):
		usage()
		sys.exit()
	else:
		cmd = ['-d','--date','-l','--listdn=','-m','--manual=','-n','--none','-r','--random=']
		if str(args[1])[0]!='-':
			data = str(args[1])
		else:
			usage()
			sys.exit()
		salt=''
		dnfile=''
		dncontent=''
		fflag = 0 #flag fichier pour -l / --listdn
		atteint=0

		for arg in args:
			pos = args.index(arg)
			if arg[:9] in cmd:
				if atteint >= 1: break

				#options completes

				
				#print(arg+' '+arg[:9]+' '+str(args)+' '+str(pos)+' '+str(len(args))+' '+str(atteint)) #debug test

				if (arg == '--date') or (arg == '-d'):
					dateoptions = '%b-%Y'
					# a venir
					salt = getoutput('date +'+dateoptions)
					atteint += 1
					break
				elif (arg[:9] == '--listdn=') and (len(arg[9:]) > 0) and (fflag == 0):
					dnfile = str(args[pos])[9:]
					fflag = 1
				elif (arg[:9] == '--manual=') and (len(arg[9:]) > 0):
					salt = str(args[pos])[9:]
					atteint += 1
					break
				elif (arg == '--none') or (arg == '-n'):
					salt = ''
					atteint += 1
					break
				elif (arg[:9] == '--random=') and (arg[9:].isdigit()):
                                	taille=int(args[pos][9:])
					salt = rnddigit(taille)
					atteint += 1
					break

				#options minimales avec valeur

				if (arg == '-l') and (pos+1 < len(args)) and (str(args[pos+1])[0]!='-') and (fflag == 0):
					dnfile = str(args[pos+1])
					fflag = 1
				if (arg == '-m') and (pos+1 < len(args)) and (str(args[pos+1])[0]!='-'):
					salt = str(args[pos+1])
					atteint += 1
					break
				if (arg == '-r') and (pos+1 < len(args)) and (str(args[pos+1])[0]!='-'):
					taille = int(args[pos+1])
					salt = rnddigit(taille)
					atteint += 1
					break
		if fflag == 1:
			print('fichier ouvert: '+dnfile) #debug test
			print
			dncontent = openfile(dnfile)

		if atteint == 0:
			usage()
			sys.exit()

		algo = 'md5'
		if dncontent != '':
			filtre=''
			contents = dncontent.split('\n')
			for line in contents:
				if (line != '') and (line[0] != '#'):
					#print(line)
					line = line.replace('\t','@')
					line = line.replace('@@','@')
					words = line.split('@')
					passphrase = md5(data+salt+line).hexdigest()
					print "%-15s\t%-15s\t%-50s" % (words[0],words[1],passphrase)
				else:
					filtre += line+'\n'
			if filtre != '':
				print
				print('Les éléments du fichier qui ont été filtrés:')
				print
				contents = filtre.split('\n')
				for line in contents:
					print(line)
		else:
			passphrase = md5(data+salt).hexdigest()
			if salt=='':salt='(aucun)'
			print("secret="+data+" sel="+salt+" algorithme="+algo+" => "+passphrase)

def rnddigit(taille):
	digits=''
	for i in range(taille):
		digit = ['0','1','2','3','4','5','6','7','8','9',
			'a','b','c','d','e','f','g','h','i','j','k','l','m',
			'n','o','p','q','r','s','t','u','v','w','x','y','z',
			'A','B','C','D','E','F','G','H','I','J','K','L','M',
			'N','O','P','Q','R','S','T','U','V','W','X','Y','Z'
			]
		digits += digit[randrange(len(digit))]
	return digits

def openfile(f):
	tmp = ''			# tampon pour ecriture vers fichier dst
	try:
		domainfile = open(f,'r')
		for line in domainfile:
			#print(line.encode('hex')) #debug test: en hexa pour trouver les caracteres invisibles
			if re.match('[0-9a-zA-Z._-]+[\t ]*[a-z]{4,}.[a-z]{2,3}',line):
				#print('* matches => '+line) # debug test: concordance
				tmp += line
			else:
				tmp += '# '+line
		domainfile.close
	except IOError:
		print('erreur le fichier spécifié ne peut être lu ou n\'existe pas.')
		sys.exit()
	return tmp

def usage():
	print('Usage:')
	print(' make-passlist SECRET OPTIONS')
	print
	print('SECRET			mot de passe servant au chiffrement')
	print
	print('OPTIONS')
	print(' -a,--algo=algorithme	algorithme de chiffrement (md5, sha1)')
	print(' -d,--date		sale le chiffrement avec une date au format de date')
	print('			(voir man date)')
	print('			exemples: %b-%Y => dec-2013 ou %m-%Y => 12-2013')
	print(' -l,--listdn=file	fichier contenant la liste des domaines a chiffrer')
	print(' -m,--manual=key	sale le chiffrement manuellement avec key')
	print(' -n,--none		ne pas saler le chiffrement')
	print(' -r,--random		sale le chiffrement avec des caractères aléatoires')
	print
	print('NOTES')
	print(' Les options -d,-m,-n et -r ne peuvent être utilisées ensemble et cesseront')
	print(' l\'activité des autres options si plusieurs sont utilisées ensembles. La')
	print(' première option valide utilisée sera déterminante pour les autres.')
	print

if (__name__ == '__main__'):
	main(sys.argv)

Le code est encore en cours de construction mais pour montrer un peu ce qu il fait je vais étayer par quelques exemple d'utilisations.

Démonstration:

D'abord l'usage:

[warlocg][linux][~/Desktop/Scripts][00:31:37][user mode]
Enter command here -> python make-passlist.py
Usage:
 make-passlist SECRET OPTIONS

SECRET		mot de passe servant au chiffrement

OPTIONS
 -a,--algo=algorithme	algorithme de chiffrement (md5, sha1)
 -d,--date		sale le chiffrement avec une date au format de date
			(voir man date)
			exemples: %b-%Y => dec-2013 ou %m-%Y => 12-2013
 -l,--listdn=file	fichier contenant la liste des domaines a chiffrer
 -m,--manual=key	sale le chiffrement manuellement avec key
 -n,--none		ne pas saler le chiffrement
 -r,--random		sale le chiffrement avec des caractères aléatoires

NOTES
 Les options -d,-m,-n et -r ne peuvent être utilisées ensemble et cesseront
 l'activité des autres options si plusieurs sont utilisées ensembles. La
 première option valide utilisée sera déterminante pour les autres.

[warlocg][linux][~/Desktop/Scripts][00:35:36][user mode]
Enter command here -> 

Ensuite quelques exemples de ce que fait déjà mon code:

* possibilité de chiffrer un message en md5 (pour le moment) avec différents sels:

** sans => option -n ou --none

[warlocg][linux][~/Desktop/Scripts][00:35:36][user mode]
Enter command here -> python make-passlist.py monsecret -n
secret=monsecret sel=(aucun) algorithme=md5 => 08ae5cfdbf2fda81090109b3f783f235
[warlocg][linux][~/Desktop/Scripts][00:37:35][user mode]
Enter command here -> python make-passlist.py monsecret --none
secret=monsecret sel=(aucun) algorithme=md5 => 08ae5cfdbf2fda81090109b3f783f235
[warlocg][linux][~/Desktop/Scripts][00:37:43][user mode]
Enter command here -> 

** digits aléatoires (valeur entière pour la taille) => option -r $nombre ou --random=$nombre

[warlocg][linux][~/Desktop/Scripts][00:37:43][user mode]
Enter command here -> python make-passlist.py monsecret -r 5
secret=monsecret sel=rFCRr algorithme=md5 => 143ac46a858a5c537d71827c0479f497
[warlocg][linux][~/Desktop/Scripts][00:40:07][user mode]
Enter command here -> python make-passlist.py monsecret --random=5
secret=monsecret sel=zsNil algorithme=md5 => 5ee98a08200fe6ab1bd6c86273b94c87
[warlocg][linux][~/Desktop/Scripts][00:40:17][user mode]
Enter command here -> 

** date depuis la commande `date +FORMAT`, pour le moment elle ne gere que le format +%b-%Y => option -d ou --date

[warlocg][linux][~/Desktop/Scripts][00:40:17][user mode]
Enter command here -> python make-passlist.py monsecret -d
secret=monsecret sel=déc-2013 algorithme=md5 => e417f9f2aba1b91f5caed08aec5d1fc3
[warlocg][linux][~/Desktop/Scripts][00:42:21][user mode]
Enter command here -> python make-passlist.py monsecret --date
secret=monsecret sel=déc-2013 algorithme=md5 => e417f9f2aba1b91f5caed08aec5d1fc3
[warlocg][linux][~/Desktop/Scripts][00:42:28][user mode]
Enter command here -> 

** un sel personnalisé => -m $message ou --manual=$message

[warlocg][linux][~/Desktop/Scripts][00:42:28][user mode]
Enter command here -> python make-passlist.py monsecret -m biencache
secret=monsecret sel=biencache algorithme=md5 => bdb3fab9a7dc99356308074f89d81c1e
[warlocg][linux][~/Desktop/Scripts][00:44:19][user mode]
Enter command here -> python make-passlist.py monsecret --manual=biencache
secret=monsecret sel=biencache algorithme=md5 => bdb3fab9a7dc99356308074f89d81c1e
[warlocg][linux][~/Desktop/Scripts][00:44:31][user mode]
Enter command here -> 

* Pas encore géré:

** les dates aux formats personnalisés
** les autres algorithmes, le sha1 notamment
** la lecture d un fichier de liste contenant des comptes, qui seront ensuite chiffrés et ecrit dans un fichier séparé => mise a jour du 30-12-2013

* Les conditions testés:

** les cas ou plusieurs options sont utilisés en meme temps => dans le cas d'un -d -n -m ou -r, lorsque l un est utilisé er reussi, un break est effectué, si l option echoue, le suivant sera utilisé

[warlocg][linux][~/Desktop/Scripts][00:44:31][user mode]
Enter command here -> python make-passlist.py monsecret --manual= --random= -d
secret=monsecret sel=déc-2013 algorithme=md5 => e417f9f2aba1b91f5caed08aec5d1fc3
[warlocg][linux][~/Desktop/Scripts][00:48:50][user mode]
Enter command here -> 

Ici --manual= a échouvé car aucune chaine n'a été passé a l option, ensuite --random a échoué car aucune taille n'a été donné, et c'est -d qui a pris le relais

** il tiens compte de l'ordre des options

[warlocg][linux][~/Desktop/Scripts][00:48:50][user mode]
Enter command here -> python make-passlist.py monsecret -n -d
secret=monsecret sel=(aucun) algorithme=md5 => 08ae5cfdbf2fda81090109b3f783f235
[warlocg][linux][~/Desktop/Scripts][00:55:27][user mode]
Enter command here -> python make-passlist.py monsecret -d -n
secret=monsecret sel=déc-2013 algorithme=md5 => e417f9f2aba1b91f5caed08aec5d1fc3
[warlocg][linux][~/Desktop/Scripts][00:55:31][user mode]
Enter command here -> 

Les fichiers

Fichier d'exemple (de test)

[warlocg][linux][~/Desktop/Scripts][20:39:43][user mode]
Enter command here -> cat tmp
Pseudo1		googlemail.com
pseudo2		yahoo.fr
={(^_^)}=	amail.com
YA_seudo_41	usenet.nl
monPseudo	h3ll0.fr
[warlocg][linux][~/Desktop/Scripts][20:39:47][user mode]
Enter command here -> 

Test sur mon fichier 'tmp' (contenant 2 lignes à filtrer)

[warlocg][linux][~/Desktop/Scripts][20:39:47][user mode]
Enter command here -> python make-passlist.py secret -l tmp -r 9
fichier ouvert: tmp

Pseudo1        	googlemail.com 	9c34668876ae25c26453e34aaf3bf4d7                  
pseudo2        	yahoo.fr       	5acd7f040a634fc472878b3c7b39d5f2                  
YA_seudo_41    	usenet.nl      	0b11b9449fdaa3274fa9843b7f51a537                  

Les éléments du fichier qui ont été filtrés:

# ={(^_^)}=	amail.com
# monPseudo	h3ll0.fr


[warlocg][linux][~/Desktop/Scripts][20:40:51][user mode]
Enter command here -> 

Code réalisé sous python 2.7, si vous rencontrez un bug veuillez le signaler que je tente de reproduire la cause du soucis et la corriger.


Avant de poser vos questions, jeter un oeil ici
Mon CodeVault et Wiki : ici
Les messages privés envers le staff sont uniquement pour les cas d'urgence ou affaires privées (personnelles). Les demandes se feront exclusivement sur le forum. Merci de respecter cette clause sous peine de sanctions.

Hors ligne

#2 30-12-2013 07:08:53

IceF0x
#! Gourou Linux

Re : Boite a outils :: chiffrement [make-passlist.py]

Je vais tester en 3.3 voir si il tourne également. ou si il faut beaucoup modifier.
Merci


Utiliser des logiciels propriétaires, c'est comme les plats préparés, on est incapable de dire les conservateurs qu'ils contiennent, on dira toujours que c'est bon, mais ça ne remplacera jamais le repas fait maison par sa maman.
]:D #! Crunchbang & Archlinux GNU/Linux User ]:D

Hors ligne

Pied de page des forums