From 378f2c7bbfc7441d81505510d15a75d7c6ece8a3 Mon Sep 17 00:00:00 2001 From: xdrm-brackets Date: Sat, 23 May 2015 17:00:52 +0200 Subject: [PATCH] =?UTF-8?q?+prise=20en=20compte=20n'importe=20quel=20srv?= =?UTF-8?q?=20smtp=20+fichier=20config=20+un=20seul=20fichier=20d=C3=A9pen?= =?UTF-8?q?dance=20[stable~60]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bucket-file | 4 +- enigmail.config | 3 ++ enigmail.py | 106 +++++++++++++++++++++++++++++++++++++++++++++--- enigmail.pyc | Bin 0 -> 4897 bytes interface.py | 47 ++++++++------------- mail.py | 22 ---------- mail.pyc | Bin 0 -> 1578 bytes test.py | 0 8 files changed, 123 insertions(+), 59 deletions(-) create mode 100644 enigmail.config create mode 100644 enigmail.pyc create mode 100644 mail.pyc create mode 100644 test.py diff --git a/bucket-file b/bucket-file index e75d99a..730a63b 100644 --- a/bucket-file +++ b/bucket-file @@ -1 +1,3 @@ -coucou à tous !!! \ No newline at end of file +blablabla +bliblibli +blobloblo \ No newline at end of file diff --git a/enigmail.config b/enigmail.config new file mode 100644 index 0000000..1d40562 --- /dev/null +++ b/enigmail.config @@ -0,0 +1,3 @@ +smtp_server = smtp.gmail.com +smtp_port = 587 +mail_address = doowap31@gmail.com \ No newline at end of file diff --git a/enigmail.py b/enigmail.py index 959edb7..3e42fbc 100644 --- a/enigmail.py +++ b/enigmail.py @@ -1,5 +1,61 @@ # -*- coding: utf-8 -*- +import smtplib +from email.MIMEMultipart import MIMEMultipart +from email.MIMEText import MIMEText + + + + +# cette fonction récupère toutes les lignes du fichier enigmail.config et les stocke dans un dictionaire qui est retourné +def getConf(): + fConf = open('enigmail.config', 'r'); + lines = fConf.readlines(); + fConf.close(); + + conf = {}; + + for i in lines: + confKey = i[:i.index('=')].replace(' ', ''); + confVal = i[i.index('=')+1:].replace(' ', '').replace('\n', ''); + conf[confKey] = confVal; + + if( len(conf) >= 3 ): # si le fichier de config est bien récupéré et qu'il est complet (3 entrées) + return conf; + else: + return False; + + + +# cette fonction envoie un mail +def sendMail(pPass, pTo, pSubject, pMessage): + conf = getConf(); # on récupère les informations du fichier de config + + if( not conf ): # si enigmail.config est imcomplet ou a une erreur on envoie pas le mail + print "> Fichier enigmail.config incomplet ou contient une erreur" + else: # si tout est ok => envoi du mail + pMsg = MIMEMultipart(); + pMsg['From'] = conf['mail_address']; + pMsg['To'] = pTo; + pMsg['Subject'] = pSubject; + + pMsg.attach( MIMEText(pMessage.encode('utf-8')) ); + + srv = smtplib.SMTP(conf['smtp_server'], conf['smtp_port']); + srv.ehlo(); + srv.starttls(); + srv.ehlo(); + srv.login(conf['mail_address'], pPass); + + srv.sendmail( conf['mail_address'], pTo, pMsg.as_string() ); + srv.quit(); + + print "> Mail envoye !"; + + + + + # fonction qui calcule le nombre de rotors en fonction de la clé pKey et qui retourne un entier def calcLevel(pKey, pSIGMA): xN = 1; @@ -64,12 +120,50 @@ def printRotors(pROTOR): # fonction qui code un caractere pChar via les rotors def encodeChar(pChar, pSIGMA, pROTOR): - for r in range(1, len(pROTOR)): # parcourt les rotors - pChar = pSIGMA[ pROTOR[r].index(pChar) ]; # le caractere devient celui au rang de l'alphabet correspondant au rang du caractere dans le rotor r - return pChar; + try: + for r in range(1, len(pROTOR)): # parcourt les rotors + pChar = pSIGMA[ pROTOR[r].index(pChar) ]; # le caractere devient celui au rang de l'alphabet correspondant au rang du caractere dans le rotor r + return pChar; + except ValueError: # si un caractère n'est pas dans l'alphabet + print "[ERREUR] Caractere non present dans l'alphabet"; + raise SystemExit(0); # fonction qui decode un caractere pChar via les rotors def decodeChar(pChar, pSIGMA, pROTOR): - for r in reversed(range(1, len(pROTOR))): # parcourt les rotors - pChar = pROTOR[r][ pSIGMA.index(pChar) ]; # le caractere devient celui au rang de l'alphabet correspondant au rang du caractere dans le rotor r - return pChar; + try: + for r in reversed(range(1, len(pROTOR))): # parcourt les rotors + pChar = pROTOR[r][ pSIGMA.index(pChar) ]; # le caractere devient celui au rang de l'alphabet correspondant au rang du caractere dans le rotor r + return pChar; + except ValueError: # si un caractère n'est pas dans l'alphabet + print "[ERREUR] Caractere non present dans l'alphabet"; + raise SystemExit(0); + + + + +# fonction qui encode une chaine +def encodeStr(pM, pSIGMA, pROTOR): + encodedStr = ''; + for c in pM: + encodedStr += encodeChar(c, pSIGMA, pROTOR); + rotateRotorsClockwise(pROTOR); # on pivote les rotors dans le sens horaire + return encodedStr; + + + + + +# fonction qui decode une chaine +def decodeStr(pM, pSIGMA, pROTOR): + decodedStr = ''; + # decalage des rotor en position de fin d'encodage (taille du message -1) + for r in pM[1:]: + rotateRotorsClockwise(pROTOR); + + # pour chaque caractere en partant du dernier + for c in pM[::-1]: + decodedStr += decodeChar(c, pSIGMA, pROTOR); # on lit le caractere + rotateRotorsAnticlockwise(pROTOR); # on tourne les rotors dans le sens inverse + + # on retourne la chaine + return decodedStr[::-1]; \ No newline at end of file diff --git a/enigmail.pyc b/enigmail.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f4bda303744fb4909d00cc7d28add8ef9b502345 GIT binary patch literal 4897 zcmcIo-EtdA6+S(ZWlOQ0|6~;stPNF*3P?;*3)vrUHo1C2p$FlDMV9DTz<1Fe~w_3Udk{Ld(sk-@KL#3?7v7vg8QA#gQ}Pm5 zATR5(wErV{;y;@BJ2X|y&=w);_%-t6VsRpQJf~3t+2I7FU>2fQj*0$j`K@fq*2d0E|B6a z&bt?-mF*Hz?QSjO6e{_pxC0NSM@e)Qb|2WovHbHW?P8W_Q~emyVqUn#H0l?{;*N{+ zUbQ%k%l?fQWz^fVu3Gde-z*MC5|l6edfV3V0H?4>b%~3b(`MGRf<`cB7R;iV56+o- z(BrA75Pz3(SN}i*oM7iyuv=ZK%cR)a{p|08lXDp6fVl!`!%Q&u5?DY9)}qmr^h@~J z4FvFj7&LB!tnilsCc6z?V;XDV;f%CNH;gr8cba<`N;6~Wc&s_z8%Koaab9aYrU%(Q z#rIy<{KHvY1U|NQKPFpRP;aC92<`38y`;C3*s}8$Z#qfV%lk!YT_+!OU?Z2n!ks~8 zJGLzCpmei%okV*c#c^q?O4)O-%=?ZZ<8iJA-5k8wwLMpn8Uwd=;{&I*=)2;1Wy=Fw zD%C3Xi@bEo;M<*bEQo@awwKzWhKxu~}js++TKaoE`Ej$A8EUg&8y z*B?Jp!S1BFqvKZ&aloaX(`mk)WPaFYF?G??MAh@kl}Wa(ukH^L=e>hE6ptckTB8IF zxneO=(RbDXM6_)~dZNBwtXJDQzbX$VLTl9m$0bG!*rn>A5z`DBW+rHwdD8;FuLf86 zi+>k_Yv}iA60&>D@D+4GX@;;{Cj#Eev-dQX;rw8d@)h(w&zSQuiHtY)FUcd^PZ)u^ z#9~9kNdj(3mpiG$mr({FXzng|^=Q!1X|Q7Rv$gfR%9P4RZ3Z^$5W>(B7*_c|ZdYX~nfol<~y( zmJsjan%u%l8N!~%-&+jGxBxz^!L9axFd`_y+(5Pl&WwAN%Zuj+Q97_nT5koiH2fhN z_4M!tC#w-2to|~5pFMT{he_oW@Kga0nVcqqIWG!8$1{CTJm zv!5T>4b&5pivbt0OPRaK*)Vr`SuLk|Z|}EBWqWu~kpe{aD(-hDgrt#$Bg{Og{{=}_ z3qGv;ZzOp{Eo2qRa0%VFPz*oe*ljiwi=Az(_9kw3k@8XXdF)W~|3~bO@`?rly3O!C z5|R8}J=44M|$ z8N1XDI)|Ui@clRRK_(da(>2W(P*HF%Y~k_4h_HBfogdjjEg2_gAZ7xcX)Itg{@U#&x!|oh;8f1ZN4dBrSsqoSDh5;7d zG(cSqkQ^I86UO8Xz@kD!T8ZMLtZe+2HNu}_LP$qZe0)ZRpLDVgsV#=2jlGmiOlr~&7XE5NbpQ1D1~O^@)?g_UP# z`0YpCm3L)H-)#MMzkO~tD508mfAbf%435LMW(c2#?OebC)WlzP-7tmT3 z)^HjHE@bT$-a(^PVR)b2F<}%yZ)XCic_925C*$_bH~4rah< zv3S7lI+|l0Rr&^s&S15rejX1}dz;8t)Mpmu)|p20Li1YlRI}AQ*W}+6q`BtozX3`7 B%J~2Q literal 0 HcmV?d00001 diff --git a/interface.py b/interface.py index e2b4752..915dcd2 100644 --- a/interface.py +++ b/interface.py @@ -1,6 +1,5 @@ # -*- coding: utf-8 -*- from enigmail import * -from mail import * import getpass @@ -15,18 +14,19 @@ SIGMA += 'éèêàùç'; # accents SIGMA = SIGMA.decode('utf-8'); # ALPHABET FORMATE EN LISTE SIGMA = list(SIGMA); -# NOMBRE DE ROTORS -LEVEL = 3; # valeur par defaut + + # CHOIX DE LA CLE userkey = int( raw_input('Cle (hex ou int): '), 0); -# CALCUL de LEVEL en fonction de la clé + +# CALCUL de LEVEL en fonction de la clé (LEVEL = nombre de rotors) LEVEL = calcLevel(userkey, SIGMA); # DECOMPOSITION DE LA CLE PRIMAIRE EN CLES SECONDAIRES KEY = decomposeKey(userkey, len(SIGMA), LEVEL); # CREATION DES ROTORS EN FONCTION DES CLES SECONDAIRES ROTOR = []; ROTOR.append( [] ); -# on cree les rotors grace a sigma et aux cles recuperees +# on cree les rotors grace a SIGMA et aux cles recuperees for i in range(0, LEVEL): ROTOR.append( shuffle( SIGMA, KEY[i]) ); # on creer le rotor et le melange suivant la cle ROTOR[0].append( ROTOR[i+1][0] ); # on enregistre la l&ettre en premiere position dans la premiere entree du rotor @@ -43,40 +43,27 @@ inFile.close(); # CHOIX DU TYPE (ENCODE+MAIL / ENCODE / DECODE) type = ''; while( type != 'M' and type != 'C' and type != 'D' ): - type = ( raw_input('[M] Crypter et envoyer par mail\n[C] Crypter\n[D] Décrypter\n > ') ).upper(); + type = ( raw_input('[M] Crypter et envoyer par mail\n[C] Crypter\n[D] Décrypter\n> ') ).upper(); + print; # VARIABLE DU HASH M = ''; -# ENCODAGE DU MESSAGE + if( type == 'M' or type == 'C' ): - for c in range(0, len(m)): - M += encodeChar(m[c], SIGMA, ROTOR); - rotateRotorsClockwise(ROTOR); # on pivote les rotors dans le sens horaire -# DECODAGE DU MESSAGE -else: - # decalage des rotor en position de fin d'encodage (taille du message -1) - for r in range(1, len(m)): - rotateRotorsClockwise(ROTOR); - - # pour chaque caractere en partant du dernier - for c in reversed(range(0, len(m))): - M += decodeChar(m[c], SIGMA, ROTOR); # on lit le caractere - rotateRotorsAnticlockwise(ROTOR); # on tourne les rotors dans le sens inverse - - # on retourne la chaine - M = M[::-1]; + M = encodeStr(m, SIGMA, ROTOR); # ENCODAGE DU MESSAGE +else: + M = decodeStr(m, SIGMA, ROTOR); # DECODAGE DU MESSAGE -# [TYPE = M] ENVOI DU MAIL +# ENVOI DU MAIL if( type == 'M' ): - From = str( raw_input('Votre adr. gmail: ') ); - Pass = str( getpass.getpass('Mot de passe : ') ); - print To = str( raw_input('Destinataire : ') ); Subj = str( raw_input('Objet : ') ); - print - print 'Envoi en cours'; - sendMail(From, Pass, To, Subj, M); + Pass = str( getpass.getpass('Mot de passe : ') ); + print '...'; + + sendMail(Pass, To, Subj, M); + # ECRITURE FICHIER else: outFile = open('bucket-file', 'w'); diff --git a/mail.py b/mail.py index a8f9052..633f866 100644 --- a/mail.py +++ b/mail.py @@ -1,24 +1,2 @@ # -*- coding: utf-8 -*- -import smtplib -from email.MIMEMultipart import MIMEMultipart -from email.MIMEText import MIMEText - -def sendMail(pFrom, pPass, pTo, pSubject, pMessage): - pMsg = MIMEMultipart(); - pMsg['From'] = pFrom; - pMsg['To'] = pTo; - pMsg['Subject'] = pSubject; - - pMsg.attach( MIMEText(pMessage.encode('utf-8')) ); - - srv = smtplib.SMTP('smtp.gmail.com', 587); - srv.ehlo(); - srv.starttls(); - srv.ehlo(); - srv.login(pFrom, pPass); - - srv.sendmail( pFrom, pTo, pMsg.as_string() ); - srv.quit(); - - print "[*] Mail envoye !"; \ No newline at end of file diff --git a/mail.pyc b/mail.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dcb7e44ca3aea722239e79969619d633f14b1543 GIT binary patch literal 1578 zcmbtU&2Ah;5U%bSuXi`L6CffA3d(R>A;l{=A!ICsg8`wnBCi9IB{1We_PRGcKk4qZ zY-xQmN1lWuFTi{78azPws>X4Cj%0VbrmDKT`m3t1C;4}M_~MV>o)&cd(|CW45x#*a z@hEachn=p;DXKIbYEnFxkV~ja=`e+z((hQfLgk7mJ>EJU^$^Csz;AD)pvHBG$q$on zCkq#CoBPp z{^eJ?OlT?3JYlp~in4i1fC`WtCw+Um?9si4uPk^gY_1?5DFHGbB4!d~WZtjASR)~4B0~Dflq4)#_ zCQz(IVe?0Gaijl~yAf8Ai0~P-anr`J%d55>pT@E&!uY)O)uUsd7tc%#<1XdR_F^oF zw-@m}?3$U#huhh%b>?v%b8dY25Q5ZgwWfx;r`Od(HC7w?eU<8hv2j}b-oXg}K%iRa zHg_+jaF2=h-S_q11pMqqQ_wU`_t7jgeG6P*4L#%52|>5;nrlLlKo4$lkGau33YD4n zB*rRYV6sp5nJn=2Xuis4DAxKn+AH7S=4?R3E#Y;;8=nA~-{O5&NjJGBLCOI#D48=u zq_-Eogxt<{ZEq&`c)>Ped`Nu8G2eh_69(9kX3Cvvub- zb;-F1nminZ=xsfdtVvJ#m<=!yHa(y1)gpfgy8t9(t>w(%(LvZ_n{)pfB-_;+(7V!JLJaQ2Y=ehaD*RiYX o#v7CTjg