Designed by Derf !
91 en ligne   Boutique | Sites | Bar | Forum | PhpBB | Actu | Glossaire | Codes | Tips | Liens | Livres | Lettre  


 Recherche

 NewsLetter





   

CACHER UNE SIGNATURE DANS UNE IMAGE

Sténographie d'images





visualight
Si la cryptographie est l'art du secret, la stéganographie est l'art de la dissimulation ...

A quoi sert ce code ? A publier par exemple vos photos de vacances en étant capable de prouver que vous en êtes le propriétaire si quelqu'un vous les vole.

Ce code est fonctionnel mais n'est pas utilisable en l'état, il faut le customizer, l'adapter à vos besoins ...


Une petite explication:

Chaque pixel d'une image est sur 24 bit. Si un pixel est (255,200,100), ce qui donne (11111111 11001000 1100100) en binaire, on peut se permettre d'utiliser le ce que l'on appelle le bit de poids faible.

En effet, pour l'oeil (11111111 11001000 1100100) et (11111110 11001001 1100101) soit (254,201,101), c'est kif-kif-bourricot!

Du coup, on stocke l'image "signature" avec le dernier bit:
- chaque fois que c'est un pixel blanc, on met à 1
- chaque fois que c'est un pixel noir on met à 0
... et on ne voit pas de différence :)

Du coup, si vous virez les 7 bits de poids fort de l'image signées, il vous reste une liste de 0 (à traduire par 00000000) et de 1 (à traduire par 11111111), ce qui donne comme résultat une image en Noir et Blanc.

<?php

// Comment prouver qu'on est bien proprio d'une image??? 
// En la signant!

// provient d'un formulaire par exemple
$signature = 'Copyright Visualight 2006';

 // pour faire lisible
$signature = '* '.$signature.' *';

// on récupère la taille de l'image à signer qui est image.jpg ici
// (image dans mon répertoire courant en l'occurence)
$im_prot = imagecreatefromjpeg('image.jpg');
list($width,$height) = getimagesize('image.jpg');

// on crée la signature en fonction.
// Il s'agit d'une image en noir et blanc avec le message $signature en redondance
// (ceux qui suivent comprendront pourquoi l'image DOIT être en noir et blanc...)

$sig= imagecreate($width, $height);
$bg = imagecolorallocate($sig, 255, 255, 255);
$tc = imagecolorallocate($sig, 0, 0, 0);

// Pour la redondance, on part du principe qu'un caractère prend 5 pixels de large et 10 de haut
$sig_size = round($width/(strlen($signature)*5));
for ($i = 0;$i< $sig_size;$i++) $signature .= $signature;

$sig_size = round($height/10);
for ($i = 0;$i< $sig_size;$i++) imagestring($sig, 1, 5, 5+$i*10, $signature, $tc);

// l'image de signature est prête.
imagepng($sig,'sig.png');

// on va signer...
$image = imagecreatetruecolor($width,$height);

for ($i=0;$i<$width;$i++) {
for ($j=0;$j<$height;$j++) {

// on récupère rgb de l'image à signer
$rgb = imagecolorat($im_prot,$i,$j);
$r=($rgb>>16)&0xFF;
$g=($rgb>>8)&0xFF;
$b=$rgb&0xFF;

// et celui de la signature
$rgb = imagecolorat($sig,$i,$j);

// si c'est 0 on met le bit de droite à 0 à r, g et b (rappel: 8 bits chacun)
if ($rgb == 0){

// xxxxxxx0 AND 11111110 = xxxxxxx0
// xxxxxxx1 AND 11111110 = xxxxxxx0

$r = $r&0xFE;
$g = $g&0xFE;
$b = $b&0xFE;

// si c'est 1, on met le bit de droite à 1 à r, g et b
} else {
// xxxxxxx0 OR 00000001 = xxxxxxx1
// xxxxxxx1 OR 00000001 = xxxxxxx1

$r=$r|1;
$g=$g|1;
$b=$b|1;
}
$color = imagecolorallocate($image,$r,$g,$b);
imagesetpixel($image,$i,$j,$color);
}}

// voici l'image portant la signature
imagepng($image, 'signed.png');

/**************************************************/

// Maintenant, on va faire le chemin inverse et récupérer la signature dissimulée

$protected_pic = imagecreatefrompng('signed.png');
list($width,$height) = getimagesize('signed.png');

$restored_sig = imagecreatetruecolor($width,$height);

for ($i=0;$i<$width;$i++) {
for ($j=0;$j<$height;$j++) {

$rgb=imagecolorat($protected_pic,$i,$j);

// on regarde chaque rgb,
// si xxxxxxxy & 1 = 0, c'est que le dernier bit y est à 0.
// si xxxxxxxy & 1 = 1, c'est que le dernier bit y est à 1.

$r=($rgb>>16)&0xFF;
$g=($rgb>>8)&0xFF;
$b=$rgb&0xFF;

// on fait donc comme avant, mais dans l'autre sens!
if(($r&1)==0) $r=255;else $r=0;
if(($g&1)==0) $g=255;else $g=0;
if(($b&1)==0) $b=255;else $b=0;

$color=imagecolorallocate($restored_sig,$r,$g,$b);
imagesetpixel($restored_sig,$i,$j,$color);
}}

imagepng($restored_sig,'back.png'); // et voilà !

// affichage des résultats.
echo '<table><tr><td>Image à dissimuler<br />';
echo '<img src="sig.png"></td><td>Image à protéger<br /><img src="image.jpg"></td></tr>';
echo '<tr><td>Image protégée<br />';
echo '<img src="signed.png"></td><td>Signature récupérée<br /><img src="back.png"></td></tr></table>';

?>



Voilà comment on profite des "faiblesses" du php et de l''oeil humain à son avantage ;)


Bonne Prog ;)

Amicalement,
Visualight


Pour pouvoir écrire dans ce forum, identifiez-vous !

  v1.3p © ASP-PHP.net 2002  

visualight le 30/03/2007 (19 291 hits)
Didier Réservez votre place gratuite pour les Microsoft TechDays 2009 !!!
Un serveur dédié Dedibox avec la licence Windows Server 2008 gratuite !!!

MSDN fête ses 10 ans ! Gagnez 1 Nabaztag, 1 montre binaire, 1 console Xbox, 1 ordinateur ultra-portable EeePC, 1 HTC Diamond et bien d’autres cadeaux… !!!
Au fil des news  
[MAJ] [PHP] Un calendrier très complet -
Remplacement de balises pour le PHP5 et modifications du script pour l'affichage des jours afin ...
Magazines - Le n°113 de Programmez est disponible
PHP - Compteur de visites (hit) paramétrable
Amélioration du Search MOSS : Recherche avancée - Modification de la page de recherche avancée
Dans la série des optimisations potentielles sur le moteur de recherche de MOSS, nous verrons cette ...
Dreamweaver CS3 + Php + Mysql - Ajout-Modif-Suppression. Les fondamentaux Part-1
Suite à de nombreuses questions sur le forum, je pense que ce sujet sur les comportements d'ajout, ...
SharePoint et Silverlight - Premiers pas - Lecture de données SharePoint et intégration
Silverlight et SharePoint sont deux technologies récentes et connaissant un essor significant. En ...
Développement d'applications SharePoint - depuis une Workstation XP ou Vista
Lorsque que l'on développe pour SharePoint, on se retrouve dans un dilemme auquel nous avons tous ...
JavaScript - sudoky - jeux du sudoku en javascript
Adobe - Creative Suite 4 en Français
PHP - La 8ème édition du Forum PHP est lancée !
Magazines - Le n°112 de Programmez est disponible
PHP - Interpreteur de commande SQL en PHP
Listes liées (dépendantes) : avec ou sans XMLHTTPR - Les délires «Ajax or not Ajax»
Comme toujours, c'est à la suite d'un coup de pouce que je me suis décidé à faire ce tuto. Merci à ...
Amélioration du Search MOSS : Les scopes - Quelques possibilités d'amélioration du Search
Lorsqu'on installe le moteur de recherche de MOSS et qu'on le configure basiquement, on veut ...
SharePoint - Lister les templates utilisés - Identifier les définitions utilisées par vos sites
Un site SharePoint est créé à partir d'un modèle ou définition de site. Mais comment savoir après ...
PowerShell - Profile avec la participation de mon ami Tigrou :)
Adobe - Lancement de la CS4, tous à vos agendas !
[MAJ] PHP - Fonctions de redimensionnement d'images - BD : redimensionner image + picto après upload
Ajout de FONCTIONS de redimensionnement.
PHP - Afficher une date mysql yyyy-mm-dd en dd-mm-yyyy
PHP - Tchat PHP V2.1 sans base de donnée
SharePoint et les statistiques d'utilisation - Comment obtenir des statistiques depuis SharePoint
La mise en place de ferme SharePoint doit s'accompagner d'une notion de gouvernance. Cette notion ...
Adobe - Nouvelles annonces Adobe sur le salon IBC 2008
PHP - PHP TV emission 2 (septembre 2008)
PHP - PDO ADMIN
[MAJ] Inscription contrôlée à une NewsLetter ou Service - Abonnement avec confirmation et désabonnement
Correction d'un point-virgule manquant (merci de m'avoir obligé à chercher JPierre) dans le module ...
PHP - Premier lundi d'une semaine et d'une année
JavaScript - Premier lundi d'une semaine et d'une année
ASP - Premier lundi d'une semaine et d'une année
Alphabet Radio et Code Morse - Alpha Zulu appelle Tango Charlie !
Encoder-Décoder en "Alphabet Radio" ... "Alpha Zulu appelle Tango Charlie !" ou en Code Morse ... ...
Filtrer les modèles de site SharePoint - Filtrer l'affichage des modèles de site SharePoint
Je vous propose de découvrir à l'aide de cet article quels mécanismes peuvent vous permettent de ...
ASP/PHP - Méthode de cryptage - par table de correspondance
(ASP/PHP) Une méthode de cryptage de données par l'utilisation d'une "table de correspondance ...
PHP - Listes liées (1 table) - version2
JavaScript - Rendre Visible ou Invisible des éléments d'un form
PHP - Listes liées (1 table) - version1
JavaScript - Intercepter le click sur vidéo WMP ou flash SWF
Jeux de l'été (et de 5) - Un jeu de Motus (mots de 8 lettres)
C'est reparti pour un tour... Comme je venais de proposer un jeu de Mastermind, je me suis dit que, ...
PowerShell - Extraire toutes les collections SharePoint en CSV
PowerShell - Lister les collections pour une WebApp SharePoint
PowerShell - Lister les utilisateurs d'un site SharePoint
PowerShell - Connaître le code version de votre SharePoint
Tutorial : HTML | Scripting | ASP-PHP | ASP.net | SQL Server | XML
Sharepoint | XAML | Pocket | Dreamweaver | VML | Divers
  Scripts : Scripting | ASP-PHP | ASP.net | Divers
  Boutique | Annuaire | Bannières | Météo | Tribune | Partenariats
v3 © Didier 2003   
 

Corpo Sciences de Reims Partitions gratuites Carte, météo, annonces
 The Inquirer FR CodePPC MVP Codes Sources TechNet Wygwam El Roubio ASP-magazine Groupes Utilisateurs Microsoft DotNet Project