Cryptage vernam

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
microdevweb
Messages : 1798
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Cryptage vernam

Message par microdevweb »

Bonjour à tous,

Pour un site internet j'ai eu besoins de crypté des mots de passes, mais je devait également me garder la possibilité de pouvoir les décrypté (pour les envoyer par email).

J'ai trouvé la méthode de Vernam, qui me semble correcte.

Voici son principe de fonctionnement.
  • La clé de cryptage doit être aussi longue que le mot à crypter
  • On convertir les caractères de la clé et du mot caractère par caractère en code ascii
  • On effectue un xor en les deux code ascii
La méthode fonctionne dans les 2 sens.

Voici un code Pb pour le faire de 1 à 24 caractères, vous pouvez changer la clé comme bon vous semble.

Code : Tout sélectionner

Procedure.s vernam(code.s)
  Protected key.s="AsOfJvmzaNfDesFOmZpbNwKs"
  Protected lCode = Len(code) 
  Protected result.s,i,c,ck
  If lCode > Len(key)
    MessageRequester("Error","The of this code can't be has len over "+Str(Len(key))+" !",#PB_MessageRequester_Error)
    ProcedureReturn ""
  EndIf
  For i = 1 To lCode
    c = Asc(Mid(code,i,1))
    ck = Asc(Mid(key,i,1))
    result + Chr(c ! ck)
  Next
  ProcedureReturn result
EndProcedure
Global code.s
Debug "CODE AVANT mh6589"
code = vernam("mh6589")
Debug "CODE CRYPTE "+code
Debug "CODE DECRYPTE "+vernam(code)
Debug "CODE AVANT nous somme tous pb"
code = vernam("nous somme tous pb")
Debug "CODE CRYPTE "+code
Debug "CODE DECRYPTE "+vernam(code)
Debug "CODE AVANT _gfgfgOpm_trtrtr"
code = vernam("_gfgfgOpm_trtrtr")
Debug "CODE CRYPTE "+code
Debug "CODE DECRYPTE "+vernam(code)
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Cryptage vernam

Message par Ollivier »

DANGEREUX.
microdevweb a écrit :Bonjour à tous,

Pour un site internet j'ai eu besoins de crypté des mots de passes, mais je devait également me garder la possibilité de pouvoir les décrypté (pour les envoyer par email).

J'ai trouvé la méthode de Vernam, qui me semble correcte.

Voici son principe de fonctionnement.
  • La clé de cryptage doit être aussi longue que le mot à crypter
  • On convertir les caractères de la clé et du mot caractère par caractère en code ascii
  • On effectue un xor en les deux code ascii
La méthode fonctionne dans les 2 sens.

Voici un code Pb pour le faire de 1 à 24 caractères, vous pouvez changer la clé comme bon vous semble.

Code : Tout sélectionner

Procedure.s vernam(code.s)
  Protected key.s="AsOfJvmzaNfDesFOmZpbNwKs"
  Protected lCode = Len(code) 
  Protected result.s,i,c,ck
  If lCode > Len(key)
    MessageRequester("Error","The of this code can't be has len over "+Str(Len(key))+" !",#PB_MessageRequester_Error)
    ProcedureReturn ""
  EndIf
  For i = 1 To lCode
    c = Asc(Mid(code,i,1))
    ck = Asc(Mid(key,i,1))
    result + Chr(c ! ck)
  Next
  ProcedureReturn result
EndProcedure
Global code.s
Debug "CODE AVANT mh6589"
code = vernam("mh6589")
Debug "CODE CRYPTE "+code
Debug "CODE DECRYPTE "+vernam(code)
Debug "CODE AVANT nous somme tous pb"
code = vernam("nous somme tous pb")
Debug "CODE CRYPTE "+code
Debug "CODE DECRYPTE "+vernam(code)
Debug "CODE AVANT _gfgfgOpm_trtrtr"
code = vernam("_gfgfgOpm_trtrtr")
Debug "CODE CRYPTE "+code
Debug "CODE DECRYPTE "+vernam(code)
Avant de mettre une astuce de sécurité, bien en discuter au préalable. C'est important. Désolé d'envoyer le gâteau de fête dans les bas de Mémé, mais on ne peut pas jouer avec ça. (Et je ne veux pas de débat).

C'est ton sujet donc tu pourras demander aux modos de virer mon message. Mais discute-en d'abord en public ou en privé. Et après, poste quelque chose, si tu juges que c'est nécessaire de le faire.

Désolé. Pas trop le temps d'être constructif.
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: Cryptage vernam

Message par djes »

Oui, bon, ce n'est pas la méthode la plus fiable mais c'est une implémentation d'un algo très basique et archi connu et ça peut servir d'exemple aux débutants.
Avatar de l’utilisateur
Naheulf
Messages : 191
Inscription : dim. 10/mars/2013 22:22
Localisation : France

Re: Cryptage vernam

Message par Naheulf »

Alors oui le chiffrement par masque jetable peut être extrêmement sécurisé MAIS :
— Chaque clé doit impérativement être une suite aléatoire de niveau cryptographique (c’est-à-dire non généré par un générateur pseudo aléatoire)
— Chaque clé ne doit être utilisée qu’une seule fois
— Les clefs ne doivent PAS être stockées avec le contenu chiffré

Or dans ton code :
— tu utilises une chaine de caractère fixe comme clef…
— … pour tous les mots de passes
— et c’est encodé en dur sur le serveur (donc stocké avec les mots de passes ou les identifiants de la base de donnée ce qui revient au même)

Conclusion : Avec ta procédure c’est aussi PAS sécurisé qu’un chiffrement avec le code César : il suffit d’avoir 1 mot de passe et son résultat pour pouvoir déchiffrer tous les mots de passes.
Avatar de l’utilisateur
SPH
Messages : 4722
Inscription : mer. 09/nov./2005 9:53

Re: Cryptage vernam

Message par SPH »

... Je n'osais rien dire mais ta methode est archi faible... :?

Egalement, imagine que tu dois crypter un fichier de 10Mo. Où vas tu trouver une clé de 10Mo ?? (puisqu'il faut une clé de meme longueur) :x
http://HexaScrabble.com/
!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.00 - 64 bits
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: Cryptage vernam

Message par Zorro »

SPH a écrit :Egalement, imagine que tu dois crypter un fichier de 10Mo. Où vas tu trouver une clé de 10Mo ?? (puisqu'il faut une clé de meme longueur) :x

-----la clef > "Toto"
------------->"Message a chiffrer"
clef : ------> "TotoTotoTotoTotoT" <-- et voici comment faire qu'une clef de 4 lettres puisse chiffrer un fichier de 10Mo ....
;)

et a l'heure actuelle , (et je l'ai deja dit maintes fois ici) le Xor avec Clef aussi longue que le truc a chiffrer , est ... indéchifrable !!


on ne peut meme pas utiliser les Statistiques , puis un "R" par exemple, ne sera jamais codé de la meme façon !

bien sur , ne pas faire la connerie des magazine des années 90 qui distribuaient un CD avec des images XX ou il fallait appeler le 3617 pour avoir la clef
de dechifrage... ces idiots avaient cryptés toutes leur images avec une clef, plus petite que l'entete d'une image Jpg ...

or si caractere en clair XOR mot de passe = caractere Crypté

caractere Crypté
XOR caractere en clair = Mot de pass !!! il faut le savoir

comme on connaissait les premiers caracteres d'une image Jpg (toujours les meme a cause de l'entete )
il etait facile de trouver le mot de passe , et donc de déchiffrer toutes l'image :)


c'est pourquoi il est important d'avoir un mot de passe (une clef) aussi longue que possible.. et qu'elle soient répétée
et dans le cas d'une image, que la clef soit plus longue que l'entete LOL :)
Dernière modification par Zorro le lun. 09/sept./2019 8:42, modifié 2 fois.
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
Avatar de l’utilisateur
SPH
Messages : 4722
Inscription : mer. 09/nov./2005 9:53

Re: Cryptage vernam

Message par SPH »

Zorro a écrit : -----la clef > "Toto"
------------->"Message a chiffrer"
clef : ------> "TotoTotoTotoTotoT" <-- et voici comment faire qu'une clef de 4 lettres puisse chiffrer un fichier de 10Mo ....


;)
Hahahahaha, il n'y a pas plus facile a casser !! :lol:
http://HexaScrabble.com/
!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.00 - 64 bits
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: Cryptage vernam

Message par Zorro »

lis mon text jusqu'au bout ;)
plus la clef est longue, plus c'est secure ;)

j'ai pris 4 lettres, pour te montrer le principe d'encodage avec clef courte d'un texte bien plus long ....

mais si tu code un fichier en utilisant 10 pages de la bible , t'es pas pres de retrouver le texte en clair :)

mais.... je dirai meme avec un clef de 4 caractere, ce sera pas evident !!

prenons l'exemple suivant :

"le texte a coder"
clef ="loti"

ce code va faire le boulot :

Code : Tout sélectionner



a$="le texte a coder"
clef$="loti"

for i=1 to len(a$)
		m=m+1
		if m=len(clef$)+1:m=1:endif
		l_m$=mid(clef$,m,1)
		l_a$=mid(a$,i,1)
		encod=asc(l_m$)*2 ! asc(l_a$)*2
		if l_a$="e"
				debug "clef="+l_m$ +"  letr clair= "+l_a$+" encodé="+encod	+"<------------"
		Else
				debug "clef="+l_m$ +"  letr clair= "+l_a$+" encodé="+encod	
				
		Endif
Next i
j'ai souligné les "e" de la phrase , aucun ne donne le meme resultat :)
donc pas possible d'apres le crypter de savoir qu'elle lettre ça va donner :)

ne pas ooublier que 4 lettres (repetées) ça suffit pour coder l'ADN ;)
Dernière modification par Zorro le lun. 09/sept./2019 9:16, modifié 1 fois.
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
Avatar de l’utilisateur
microdevweb
Messages : 1798
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Re: Cryptage vernam

Message par microdevweb »

Je suis conscient que cette méthode n'est peut'être pas la plus efficace et q'un hachage doit l'être bien plus mais malheureusement à sens unique.

Je suis preneur d'autres possibilités et souhaite bon courage à celui qui voudrais décrypter ce type de sécurité sans la clé.

Maintenant il à toujours moyen de faire mieux ça c'est sure.
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: Cryptage vernam

Message par Zorro »

oui on peut faire legerement mieux en y ajoutant justement du pseudo aléatoire :)


sachant qu'un random Seed , donne toujours la meme liste de chiffre aléatoire
on peut s'en servir pour encoder (et qu'on pourra aussi decoder) en plus .... vu que pour le decodage on pourra se servir du meme seed :)


dans l'exemple du Xor , on peut se servir du seed pour par exemple choisir un lettre de la clef :)

donc au lieu d'encoder XOR avec la clef "TURO" repétée a l'infini
(exemple trivial il faudra utiliser plus que 4 lettres quand meme )

tu peux utiliser le Seed pour utiliser l'une des lettres de la clef , donc au lieu d'encoder avec

T ,puis U , puis R , puis O , on utilise le Seed pour tirer aléatoirement la lettre a utiliser pour encoder

du coup, on encode avec une clef qui elle meme est encodé Pseudo aléatoirement :)
imagine qu'on fasse ça avec 10 ou 50 pages de la bible ou du coran ... LOL :) ça deviens de l’hébreu
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
Avatar de l’utilisateur
Naheulf
Messages : 191
Inscription : dim. 10/mars/2013 22:22
Localisation : France

Re: Cryptage vernam

Message par Naheulf »

microdevweb a écrit :Je suis conscient que cette méthode n'est peut'être pas la plus efficace et q'un hachage doit l'être bien plus mais malheureusement à sens unique.

Je suis preneur d'autres possibilités et souhaite bon courage à celui qui voudrais décrypter ce type de sécurité sans la clé.

Maintenant il à toujours moyen de faire mieux ça c'est sure.
Vu que tu n'a pas l'air de prendre conscience de l'absence de sécurité de ton code, voici un exemple.
(Je me suis permis de refaire la fonction de chiffrement pour externaliser la clef et la rendre fonctionnelle avec n'importe quel type de données)

Code : Tout sélectionner

EnableExplicit

Procedure UseMask(*data, *mask, size)
   Protected offset.i = 0
   Protected dataq.q, maskq.q
   
   ; On encode les permiers octets 8 par 8 (c'est plus rapide)
   While (offset + 8) <= Size
      dataq = PeekQ(*data + offset)
      maskq = PeekQ(*mask + offset)
      dataq ! maskq
      PokeQ(*data + offset, dataq)
      offset + 8
   Wend
   
   ; On termine les derniers octets 1 par 1 pour ne pas faire de dépassement de mémoire
   While offset <= Size
      dataq = PeekB(*data + offset)
      maskq = PeekB(*mask + offset)
      dataq ! maskq
      PokeB(*data + offset, dataq)
      offset + 1
   Wend
EndProcedure

Procedure Demo1()
   Debug "Demo1()"
   ; J'externalise la clef car elle n'a rien à faire dans la procédure de chiffrement
   Protected key.s="AsOfJvmzaNfDesFOmZpbNwKs"
   Protected code.s
   
   code = "mh6589"
   Debug "CODE AVANT <<"+code+">>"
   UseMask(@code, @key, StringByteLength(code))
   Debug "CODE CRYPTÉ <<"+code+">>"
   UseMask(@code, @key, StringByteLength(code))
   Debug "CODE DÉCRYPTÉ <<"+code+">>"
   
   code = "nous somme tous pb"
   Debug "CODE AVANT <<"+code+">>"
   UseMask(@code, @key, StringByteLength(code))
   Debug "CODE CRYPTÉ <<"+code+">>"
   UseMask(@code, @key, StringByteLength(code))
   Debug "CODE DÉCRYPTÉ <<"+code+">>"
   
   code = "_gfgfgOpm_trtrtr"
   Debug "CODE AVANT <<"+code+">>"
   UseMask(@code, @key, StringByteLength(code))
   Debug "CODE CRYPTÉ <<"+code+">>"
   UseMask(@code, @key, StringByteLength(code))
   Debug "CODE DÉCRYPTÉ <<"+code+">>"
   
   Debug "Attention c'est bogué si le mot de passe à un caractère en commun avec la clef :"
   code = "_sfgfgOpm_trtrtr"
   Debug "CODE AVANT <<"+code+">>"
   UseMask(@code, @key, StringByteLength(code))
   Debug "CODE CRYPTÉ <<"+code+">>"
   UseMask(@code, @key, StringByteLength(code))
   Debug "CODE DÉCRYPTÉ <<"+code+">>"
   Debug ""
EndProcedure

Procedure Demo2()
   Debug "Demo2()"
   ; J'externalise la clef car elle n'a rien à faire dans la procédure de chiffrement
   Protected key.s="AsOfJvmzaNfDesFOmZpbNwgJqlP" ; J'ai légèrement allongé la clef pour cet exemple
   
   Debug "Voila pourquoi il ne faut pas réutiliser le même masque :"
   Protected code1.s = "Tu ne me trouveras pas"
   Debug "CODE1 AVANT <<"+code1+">>"
   UseMask(@code1, @key, StringByteLength(code1))
   Debug "CODE1 CRYPTÉ <<"+code1+">>"
   
   Protected code2clair.s = "nous allons vérifier ça..." ; code2clair ne doit pas être plus court que code1
   Protected code2crypt.s = code2clair
   Debug "CODE2 AVANT <<"+code2clair+">>"
   UseMask(@code2crypt, @key, StringByteLength(code2clair))
   Debug "CODE2 CRYPTÉ <<"+code2crypt+">>"
   
   Debug "CODE1 TOUJOURS CRYPTÉ <<"+code1+">>"
   UseMask(@code1, @code2crypt, StringByteLength(code2clair));
   UseMask(@code1, @code2clair, StringByteLength(code2clair));
   Debug "CODE1 HACKÉ <<"+code1+">>"
   Debug ""
EndProcedure

Demo1()
Demo2()
Explications du bug :
Si la chaîne à encoder possède un caractère en commun avec la clé, cela donne le caractère nul (que des zéros). Or ce caractère sert à indiquer une fin de chaîne. Toutes les opérations suivantes voient donc la chaîne comme étant plus courte qu'elle ne devrait l'être.


Comment le hack fonctionne :
La fonction XOR binaire possède trois propriétés singulières :
- variableA XOR variableA = 0 (C'est ce qui cause le bug du dessus)
- variableA XOR 0 = variableA
- c'est une opération commutative

Dans notre cas on à :
- code1 (crypté) = code1 XOR clef
- code2crypt = code2clair XOR clef (<=> clef XOR code2clair)

Le hack fait :
- (code1 (crypté) XOR code2crypt) XOR code2clair
Si on remplace par les valeurs cela donne :
((code1 XOR clef) XOR (clef XOR code2clair)) XOR code2clair
Comme c'est une opération commutative, on peut faire sauter toutes les parentheses, mettre les opérandes dans l'ordre de notre choix et faire les opérations dans l'ordre que l'on veut:
code1 XOR (clef XOR clef) XOR (code2clair XOR code2clair)
Je vous laisse simplifier ;)

Édit : Amémioration et correction du texte de débogage
Dernière modification par Naheulf le dim. 26/janv./2020 8:29, modifié 1 fois.
Avatar de l’utilisateur
MLD
Messages : 1097
Inscription : jeu. 05/févr./2009 17:58
Localisation : Bretagne

Re: Cryptage vernam

Message par MLD »

Bonjour a tous
Le problème du codage d'un texte ou d'un mot de passe est un vaste sujet.
Tout dépend de la dureté a la tenue d'une éventuel tentative de décodage.
Si c'est pour donner rendez vous a ma maitresse pour le soir même , et que j’efface ou quelle efface le code dans l'heure qui suit. Un code césar un peu amélioré suffit .
Si c'est la protection du mot de passe de mon compte en banque qui ne contient que 5€. Un xor suffit
Si le même compte contient plusieurs million € (Le rêve) un Xor simple ne suffit plus.
Si vous fixer un RV ultra secret et que le texte peut être lu que dans quelques jours Un Xor même complexe ne suffira pas
Quant a un message secret de type militaire ultra top secret , il faudra penser a un code que les plus gros ordis du monde mettrons 100 ans a déchiffrer. Je n'est même pas idée d'un tel code. (Pourtant il parait que cela existe au USA.)
Amuser vous bien cela est passionnant.
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: Cryptage vernam

Message par Zorro »

comme ça , ça corrige le probleme eventuel qu'une lettre soit = a une lettre du mot de passe

autre point positif, on ne gere pas le mot de passe !! c'est le code qui le genere via Random ...

apres, pour decoder un truc comme ça , il faut connaitre(et ne pas oublier ) le Seed !!

un seed de 10 codera la ligne ou le text d'une certaines façon
un seed , de 1575986523456 le codera d'une autre ....
perdre le seed , c'est perdre la possibilité de decoder le texte :)

il faudra juste faire une interface, qui demande le seed avant de lancer le codage ou le décodage :)
chaque seed genere une liste infini de numero aléatoire, tu peux toujours courrir pour avoir le texte en clair si tu ne connais pas le seed
(seed qui peut avoir une longueur.... tres.... longue :) )

Code : Tout sélectionner


Declare.s encode_xor(text.s,seed)
Declare.s decode_xor(text.s,seed)

text.s="le texte a coder"
seed=130

encode.s= encode_xor(text.s,seed)	
debug encode.s
;
decode.s=encode_xor(encode.s,seed)	
debug decode.s


Procedure.s encode_xor(text.s,seed)		
		;by Dobro
		RandomSeed(seed)
		for i=1 to len(text.s)
				car_clef.s=chr(random(90,65  )) 
				l_a$=mid(text.s,i,1)
				if car_clef.s=l_a$ : 	car_clef.s="" :endif  ; cas ou la lettre du mot = la lettre de la clef 
				sortie.s=sortie.s+chr(asc(car_clef.s) ! asc(l_a$))		
		Next i		
		ProcedureReturn sortie.s
EndProcedure

Procedure.s decode_xor(text.s,seed)	
		;by Dobro
		RandomSeed(seed)
		for i=1 to len(text.s)
				car_clef.s=chr(random(90,65))    
				l_a$=mid(text.s,i,1)
				if car_clef.s=l_a$ : 	car_clef.s=""  :endif  ; cas ou la lettre du mot = la lettre de la clef 
				sortie.s=sortie.s+chr(asc(car_clef.s) ! asc(l_a$))	
		Next i		
		ProcedureReturn sortie.s
EndProcedure
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
Avatar de l’utilisateur
SPH
Messages : 4722
Inscription : mer. 09/nov./2005 9:53

Re: Cryptage vernam

Message par SPH »

"Les meme causes donnent les meme consequences" : FAUX

Est ce qu'un fichier "x" crypté avec le mdp "toto" peux donner un resultat different a chaque fois ?
Oui, je l'ai fait :

https://www.purebasic.fr/french/viewtop ... te#p205005

Je crypte tous mes mots de passe avec et je les mets sur internet car je suis sur de mon coup. Seul le brute force attack peux le vaincre (mais ca prendrait des tas d'annees)

8)
http://HexaScrabble.com/
!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.00 - 64 bits
Avatar de l’utilisateur
Ar-S
Messages : 9472
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Cryptage vernam

Message par Ar-S »

Ce qui me gêne dans ce que tu as dit, c'est que tu es amené à envoyer des mots de passe en clair par email. Et là tu vas à l'encontre du rgpd. J'espère t'avoir mal compris. Mais on envoie pas de mots de passes en clair. Au pire un lien pour le renouveler en ligne.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Répondre