conversion cpp vers autoit

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
FF2Damien
Niveau 1
Niveau 1
Messages : 14
Enregistré le : jeu. 17 mars 2016 15:24
Status : Hors ligne

conversion cpp vers autoit

#1

Message par FF2Damien »

Bonjour a tous,

Je souhaite ré écrire un encodeur de mot de passe que j'ai trouvé en cpp vers autoit, mais je n'ai clairement pas le niveau en cpp pour comprendre le code.
Ce code appartient a utrafunk popcorn, un reader d'email en open source.
Peut être pourriez vous m'aider ? voici le code :

Code : Tout sélectionner

void EncodePassword(char *string, char *dest)
{
	ULONG rnd = 12345;
	int cnt = 0;
	for(;;)
	{
		rnd = rnd * 11863283 + 1;
		ULONG val = *string++;
		if (val == 0)
		{
			string--;
			if (cnt >= 8)
				break;
		}
		val ^= rnd >> 15;
		*dest++ = (char)('A' + ((val/16)&15));
		*dest++ = (char)('A' + (val&15));
		cnt++;
	}
	*dest = 0;
}
Ces 3 lignes me pausent un problème de compréhension :

Code : Tout sélectionner

		val ^= rnd >> 15;
		*dest++ = (char)('A' + ((val/16)&15));
		*dest++ = (char)('A' + (val&15));
merci
Avatar du membre
orax
Modérateur
Modérateur
Messages : 1479
Enregistré le : lun. 23 mars 2009 04:50
Localisation : ::1
Status : Hors ligne

Re: conversion cpp vers autoit

#2

Message par orax »

Pour te mettre un peu sur la voie :
>> correspond à BitShift.
^ correspond à BitXOR.
& correspond à BitAND.
; val ^= rnd >> 15;
$val = BitXOR($val, BitShift($rnd, 15))
; (char)('A' + ((val/16)&15));
Chr(Asc("A") + BitAND(($val / 16), 15))
Modifié en dernier par orax le dim. 14 août 2016 00:07, modifié 1 fois.
Raison : Correction d'une erreur dans le code ! => BitAND(($val / 16)... au lieu de BitOR(($val / 16)...
De petits détails peuvent faire toute la différence. — Quand la boule de neige commence à rouler… poussez-la. (Columbo)
FF2Damien
Niveau 1
Niveau 1
Messages : 14
Enregistré le : jeu. 17 mars 2016 15:24
Status : Hors ligne

Re: conversion cpp vers autoit

#3

Message par FF2Damien »

Merci Orax,
Je suis entrain de plancher dessus.
Mais ce n'est vraiment pas évident pour moi.
Effectivement effectuer des opérations sur la valeur binaire du mot de passe est un bonne méthode d'encryptage.

que signifie les

Code : Tout sélectionner

 *dest++
Est ce pour définir une variable (le préfixe *) seulement accessibple en cpp (le suffixe ++)
?
FF2Damien
Niveau 1
Niveau 1
Messages : 14
Enregistré le : jeu. 17 mars 2016 15:24
Status : Hors ligne

Re: conversion cpp vers autoit

#4

Message par FF2Damien »

il y a quelque chose qui m'échappe

Code : Tout sélectionner

#include <MsgBoxConstants.au3>

$val = "1"
$rnd = 12345
$dest = 0
$i=0;

MsgBox(64, 'Finished', 'mot de passe = ' & $val)

For $i = 0 to 8
   $rnd = $rnd * 11863283 + 1
   $val = $val + 1
   if ($val = 0) Then
	  			$val = $val - 1;
			if ($i >= 8) Then break;
   EndIf


; val ^= rnd >> 15;
$val = BitXOR($val, BitShift($rnd, 15))
; (char)('A' + ((val/16)&15));
$dest = Chr(Asc("A") + BitOR(($val / 16), 15))
; (char)('A' + (val&15));
$dest = Chr(Asc("A") + BitOR(($val), 15))
$i = $i + 1

Next

MsgBox(64, 'Finished', 'mot de passe = ' & $dest)

avec un mot de passe = 1, je devrais avoir comme encryptage EGCNHEHHGJGGKDGO, et pas un caractère chinois comme réponse...
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: conversion cpp vers autoit

#5

Message par mikell »

Il me semble qu'orax a parlé de BitAND et pas de BitOR pour le & en c++
et ça : " *dest++ = " ça ressemble à une concaténation ( &= pour une string )
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Avatar du membre
orax
Modérateur
Modérateur
Messages : 1479
Enregistré le : lun. 23 mars 2009 04:50
Localisation : ::1
Status : Hors ligne

Re: conversion cpp vers autoit

#6

Message par orax »

Oui, c'est bien BitAND, je m'étais trompé dans le code. J'avais corrigé ça hier. :oops:

J'ai effectivement remplacé le *dest++ par &= dans le script.
FF2Damien a écrit :Est ce pour définir une variable (le préfixe *) seulement accessibple en cpp (le suffixe ++) ?
En fait, on pourrait écrire *dest++ sur deux lignes :
*dest = ...
dest++ // ou dest = dest + 1
dest est un pointeur (la valeur de dest est une adresse mémoire).
Dans *dest, l'astérisque (*) permet d'accéder à la valeur pointée.
dest++ incrémente l'adresse mémoire du pointeur (le pointeur pointera sur le caractère suivant de la chaîne).
ULONG val = *string++;
      if (val == 0)
val = le caractère pointé par string
fait pointer le pointeur string sur le caractère suivant
si val = le caractère NUL (Chr(0) en AutoIt)
Ce caractère sert de marqueur (en C et C++) pour indiquer la fin de la chaîne. Ce n'est pas le chiffre 0 (zéro).

Remarque : les opérations sont faites sur des nombres trop grand, $rnd est parfois négatif donc le résultat est faussé. Si l'on prend une valeur beaucoup moins grande que 11863283, il n'y a pas ce problème.
#include <StringConstants.au3>

$r = EncodePassword("1")
ConsoleWrite($r & @CRLF)

Func EncodePassword($string)
   Local $dest
   Local $rnd = 12345, $cnt = 0, $val
   Local $arrayStr = StringSplit($string, "", $STR_NOCOUNT)
   Local $len = UBound($arrayStr)
   Local $i = 0
   While 1
      $rnd = $rnd * 11863283 + 1
      ConsoleWrite($rnd & @CRLF) ; attention ! 11863283 est trop grand, car on a des nombres négatifs - le résultat est faussé
      If $i < $len Then
         $val = Asc($arrayStr[$i])
         $i += 1
      Else
         ; si c'est la fin de la chaîne
         $val = 0
         If $cnt >= 8 Then ExitLoop
      EndIf
      $val = BitXOR($val, BitShift($rnd, 15))
      $dest &= Chr(Asc("A") + BitAND(($val / 16), 15))
      $dest &= Chr(Asc("A") + BitAND($val, 15))
      $cnt += 1
   WEnd

   Return $dest
EndFunc   ;==>EncodePassword
De petits détails peuvent faire toute la différence. — Quand la boule de neige commence à rouler… poussez-la. (Columbo)
Répondre