Cryptage d'images pixel par pixel

Résolu
delrama Messages postés 1 Date d'inscription samedi 10 mai 2008 Statut Membre Dernière intervention 27 juillet 2008 - 27 juil. 2008 à 00:43
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 - 30 juil. 2008 à 14:22
bonjour,
je veux  crypte une image pixel par pixel, l'utilise la librairie lockbox, alors j'ai cree le code suivant:
.
.
.
.procedure TMainForm.btncptClick(Sender: TObject);<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" /??>

var ImgCpt:TMDIChild;

     Str,StrC:String;

     i,j:Integer;

     P:PByteArray;

     cl:BytePixel;

     R:RealPixel;

 

begin

 //Apparence de l'enfant ImgCpt

ImgCpt:=(ActiveMDIChild as TMDIChild);

 Str:='Image cryptée';

 

 //transfert des pixels de l'image vers la zone memoire

  for j:=0 to ht-1 do

  begin

    for i:=0 to wd-1 do

      begin

        cl:=getrvalue(ImgCpt.Image1.Picture.Bitmap.Canvas.Pixels[i,j]);

        setbyte(cl,Pimt,i+j*wd);

      end;

   end;

 

  //traitement (cryptage de l'image)

  for j:=0 to ht-1 do //ht = hauteur de l'image
  begin

    for i:=0 to wd-1 do //wd= largeur de l'image

      begin

      cl:=getbyte(Pimt,i+j*wd); //balayage de l'image ligne par ligne

      StrC:=IntToStr(cl);      //Contiendra la valeur cryptée  (0…..255)

      StrC:=LbRijndael1.EncryptString(StrC);//cryptage avec la composant AES 

                        //StrC=’ fgC7VcLjPJc05ejq30gOvA==’ pour cl=255 (exemple)

      Edit2.Text:=StrC;   //Pour le test

      ShowMessage('');  //Pour le test

      Cl:=StrtoInt(strc);  //pas efficace ...........(*)

 

     //le text strc=’ fgC7VcLjPJc05ejq30gOvA==’ doit etre converti en integer!!!!! maiiiiiiiis     //comment

 

      setrealtype(cl,Pimt,i+j*wd);

      end;

  end;

 //Affichage

 PointerToBitmap1(Pimt,p,0,ImgCpt,Str);

 ImgCpt.Invalidate;

 

end;

le probleme est dans la ligne (*): je veux convertir le text  strc=’ fgC7VcLjPJc05ejq30gOvA==’
en byte pour ne pas perdre l'information dans la phase de decryptage.

Merci d'avance.

4 réponses

Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
28 juil. 2008 à 14:44
Salut,

@Bacterius:
je suis pas certain que ton code crypte réellement quelque chose ^^

Voici un exemple très simple avec un accès 100 fois plus rapide aux pixels qu'avec l'utilisation "Canvas.Pixels"

L'utilisation de RandSeed n'est "normalement" pas conseillé pour le cryptage de données. Grace a RandSeed et à Random on a la possibilité de reproduire la même suite "aléatoire" de nombres à la condition que la valeur passée à RandSeed soit la même et que le code soit compilé avec la même version du compilateur. Comme dans l'exemple ci-dessous ces deux points sont respectés .... par contre toutes les vérifications ne sont pas faites, en particulier sur l'existence de BMPOut dans la procédure CrypteBMPEx ce n'était pas le but recherché

Pour l'exemple il faut :
1 TButton
3 TImage (1 pour afficher l'originale, 2 pour la cryptée, 3 pour la descryptée)
1 OpenPictureDialog

procedure CrypteBMPEx(const BMPIn, BMPOut: TBitmap; const Key: Cardinal);
var
  PData       : PInteger;
  MaxPixels,
  ActualPixel : Integer;
begin
  if not Assigned(BMPIn) then Exit;
  BMPOut.Assign(BMPIn);
  BMPOut.PixelFormat := pf32bit;
  MaxPixels :=  BMPOut.Width * BMPOut.Height;
  ActualPixel := 0;
  PData := BMPOut.ScanLine[BMPOut.Height-1];
  RandSeed := Key;
  Repeat
    PData^ := PData^ xor Random($FFFFFF) ;
    Inc(PData);
    Inc(ActualPixel);
  Until ActualPixel >= MaxPixels;
end;

procedure TForm2.Button1Click(Sender: TObject);
begin
  if OPD1.Execute then
  begin
    // charge le Bitmap dans Image1
    Image1.Picture.Bitmap.LoadFromFile(OPD1.FileName);
    // Crypte et affiche dans Image2
    CrypteBMPEx(Image1.Picture.Bitmap, Image2.Picture.Bitmap, 235689);
    // descrypte et affiche dans Image3
    CrypteBMPEx(Image2.Picture.Bitmap, Image3.Picture.Bitmap, 235689);
  end;
end;
 
@+
Cirec

<hr siz="" />
3
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
27 juil. 2008 à 11:23
Bonjour,
tu n'as pas besoin d'utiliser la librairie lockbox ! d'ailleurs pour un algorithme de cryptage il vaut mieux travailler son propre système, sinon ça ne sert à rien ^^

Je te montre un exemple de cryptage simple (a ne pas prendre, faut en trouver un plus hard à casser) :

On récupère les valeurs R,G,B du pixel en cours (on est dans une double boucle, qui scanne et longueur + en hauteur)

R := GetRValue(MonCanvas.Pixels[XDeMonPixEnCours, YDe...]);
G := GetGValue(MonCanvas.Pixels[XDeMonPixEnCours, YDe...]);
B := GetBValue(MonCanvas.Pixels[XDeMonPixEnCours, YDe...]);

R := R + 5;
G := G + 3;
B := R - 2;

MonCanvas.Pixels[XDeMonPixEnCours, YDe...] := rgb(R, G, B);

// On a crypté le pixel

// Pour le decryptage : on prend l'image cryptée :

R := GetRValue(MonCanvas.Pixels[XDeMonPixEnCours, YDe...]);
G := GetGValue(MonCanvas.Pixels[XDeMonPixEnCours, YDe...]);
B := GetBValue(MonCanvas.Pixels[XDeMonPixEnCours, YDe...]);

R := R - 5;
G := G - 3;
B := R + 2;

MonCanvas.Pixels[XDeMonPixEnCours, YDe...] := rgb(R, G, B);

// Et on inverse l'algorithme

Et voila tu as réalisé ton crypteur d'images !
Si tu as des questions, n'hesites-pas à les poser !
Bonne chance pour la suite !

Cordialement, Bacterius !
0
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
28 juil. 2008 à 18:45
Bonjour,

euh ouais ... ouais ... [cherche un truc à répondre] ... hmm attends ... [se rabat sur Delrama] ouais Delrama pense me à mettre réponse acceptée, et préfères la solution de Cirec à la mienne (en changeant l'algorithme sinon Cirec verra toutes tes photos p ... non je me tais -- c'etait tentant).
Et euh bravo Cirec pour cette démonstration de cryptage avec brio !
Et Delrama, oublie les librairies de cryptage, on n'est jamais mieux servi que par soi-même ! (non ce n'est pas un lien ...)

Cordialement, Bacterius !

PS : cette signature devient horripilante ! personne n'a jamais de problème d'envoi avec une signature ?
Il faudrait en toucher deux mots aux webmasters de CS si cela touche beaucoup de monde ...
0
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
30 juil. 2008 à 14:22
@Delrama:

c'est bien de poser des questions mais c'est mieux quand on prend 5mn pour répondre aux membres qui ont pris le temps de se pencher sur ton problème

 
@+
Cirec

<hr siz="" />
0
Rejoignez-nous