• STATISTIQUES
  • Il y a eu un total de 1 membres et 8873 visiteurs sur le site dans les dernières 24h pour un total de 8 874 personnes!


    Membres: 2 609
    Discussions: 3 580
    Messages: 32 820
    Tutoriels: 78
    Téléchargements: 38
    Sites dans l'annuaire: 58


  • ANNUAIRE
  • [EN] Reddit
    Subreddit dédié à la sécurité informatique.
    Hacking
    [EN] Dare your mind
    JavaScript: 6, Crypto: 44, Stegano: 36, Logic: 13, Special: 27, Science: 11, Realistic: 7, Programming: 10, Crack It: 6,...
    Challenges
    [FR] dcode
    dcode.fr est le site indispensable pour décoder des messages, tricher aux jeux de lettres, résoudre des énigmes...
    Outils / Add-on
    [EN] PHPFreaks
    PHPFreaks est un site dédié à l'apprentissage et l'enseignement du PHP. Ici vous trouver...
    Programmation
    [EN] Listbrain Version 3
    Site proposant 66 challenges présentés dans une liste mélangée.
    Challenges
    [FR] Le top web
    Nous offrons une sélection la plus large possible de resources webmaster gratuites, hébergement gratuit...
    Webmaster
    [EN] osix
    Site de challenge qui utilise un système de level on chaque épreuve doit être réussie avant d'accéd...
    Challenges

  • DONATION
  • Si vous avez trouvé ce site internet utile, nous vous invitons à nous faire un don du montant de votre choix via Paypal. Ce don servira à financer notre hébergement.

    MERCI!




Note de ce sujet :
  • Moyenne : 0 (0 vote(s))
  • 1
  • 2
  • 3
  • 4
  • 5
[C++] Stéganographie BMP
17-02-2012, 23h27 (Modification du message : 17-02-2012, 23h30 par Dobry.)
Message : #1
Dobry Hors ligne
Tueur de lamouz
*



Messages : 206
Sujets : 25
Points: 73
Inscription : Aug 2011
[C++] Stéganographie BMP
Bon, voilà quelques jours que je bosse sur un tool de stéganographie pouvant cacher n'importe quel type de fichier dans un autre.
Pour le moment, je me suis restreint au BMP, car leur fonctionnement est vraiment très simple, mais vous pourrez très bien l'utiliser sur un fichier texte, rendant celui-ci illisible, mais cachant des données 'importantes'. (Bon ok je m'emballe, j'ai pas codé le tout dernier algo de crypto encore inconnu des services secrets, mais bon, ce fut un bon entrainement en C++)
Par contre, il n'y à pas de restrictions quand au fichier que vous souhaitez cacher, tant que ca taille ne dépasse pas 65535 octets et que sa taille est inférieur à la taille du fichier destination/4 -54, on peut expliquer cela par le fait que la méthode utilisée, la méthode LSB (least significant bits) utilise 8 octets du fichier destination, pour cacher 4 octets du fichier source et que le header du BMP fait 54 octets, donc ce sont des octet inutilisables (mais qui le serait différent, avec d'autre type de fichier).
Le code est composé en fonction, pour qu'il puisse être réutilisé, je me suis fait un petit délire en écrivant toutes mes variables et commentaires en anglais (pour faire genre Smile ).
Si vous voulez plus de détails sur tel ou tel fonction, n'hésitez pas, ca fait 4 jours que je me bats avec ce code xD alors je le connais par coeur, donc tout me semble logique est clair (ce qui n'est probablement l'effet ressentit par ceux qui lirons le code).

Code PHP :
#include <iostream>
#include <fstream>
#include <cmath>
#include <cstdlib>
#include <string>


using namespace std;


string decBin(int num// Return size of 16
{
    
string binaire("");
    for(
int i(15);i>=0;i--){
        if(
num >= pow(2,i)){
            
binaire.append("1");
            
num-= pow(2,i);
        }else{
            
binaire.append("0");
        }
    }
    return 
binaire;
}
int binDec(string bin){ // Binary to integer
    
int decimal(0);
    for(
int i(bin.size()-1);i>=0;i--){
        if(
bin[i]=='1'){
            
decimal+=pow(2,bin.size()-1-i);
        }
    }
    return 
decimal;
}
string fileSize(fstreamencrypt){ // Return file to hide size
    
int size;
    
encrypt.seekg(0ios::end);
    
size encrypt.tellg();
    
encrypt.seekg(ios::beg);
    return 
decBin(size);
}
int getSize(fstreamdecrypt){ // Return hidden file size
    
decrypt.seekg(54,ios::beg);
    
int iSize;
    
string sSize(""),bSize;
    for(
int i(0);i<8;i++){
         
char size;
                 
decrypt.read((char *)&sizesizeof(char));
                 
iSize = (int)(size%4);
                 
bSize decBin(iSize);
                 
sSize.append(bSize.substr(14,2));
         }
    return 
binDec(sSize);

}
void write(fstreaminputstring binary){ // Write binary into input
    
int iPixeliBinary;
    for(
int j(0);j<binary.size()/8;j++){
        for(
int i(0);i<8;i+=2){
            
char fPixel;
            
input.read((char *)&fPixel1); 
                
iPixel = (int)(fPixel-(fPixel%4)); 
                
iBinary binDec(binary.substr(i+8*j,2));
                
iPixel+=iBinary;
                
input.seekg(-1ios::cur); 
                
input.write((char *)&iPixel,sizeof(char)); 
        }
    }
}

void menu(){
    
cout << "   Stegano Tool by Necromoine  " << endl << endl;
    
cout << "     Hide any file in a BMP     " << endl;
    
cout << "   ##########################   " << endl << endl;
    
cout << "Usage : "<< endl;
    
cout << "Encrypt A into B : ./steg e A B" << endl;
    
cout << "Decrypt A into B : ./steg d A B" << endl << endl;
    
cout << "Warning, hidden file must be under 65535 octets" << endl << endl;
}
int main(int argc,char *argv[]){
    
    if(
argc != 4){
        
menu();
        return 
0;
    }
    
string binary;
    if(
argv[1][0] == 'e'){
        
cout << argv[3] << endl << argv[2] << endl;
        
int letter;
        
fstream input(argv[3], fstream::in fstream::out fstream::binary);
        
fstream encrypt(argv[2], fstream::in fstream::out );
        
input.seekg(54fstream::beg);
        
write(input,fileSize(encrypt)); 
        while(!
encrypt.eof()){
            
cout << encrypt.tellg() << endl;
            
unsigned char caract;
            
encrypt.read((char *)&caract1);
            
letter = (int)caract;
            
binary decBin(letter).substr(8,8);
            
write(inputbinary);
        }
        
cout << "Encryption done, check " << argv[3] << endl;
    }
    else if(
argv[1][0] == 'd'){
        
string data("");
        
int iPixelcaractiSizei(0);
        
fstream encrypt(argv[2], fstream::in fstream::out fstream::binary);
        
fstream output(argv[3], fstream::trunc fstream::out fstream::in );
        
encrypt.seekg(54,fstream::beg);
        
iSize getSize(encrypt);
        while(
i<iSize){
            
unsigned char rPixel;
            
encrypt.read((char *)&rPixel1);
            
iPixel = (int)(rPixel%4);
            
binary decBin(iPixel);
            
data.append(binary.substr(14,2));
            if(
data.size() == 8){
                
caract binDec(data);
                
output.write((char *)&caract1);
                
data "";
                
i++;
            }
        }
        
cout << "Decryption done, check " << argv[3] << endl;
    }else{
        
menu();
        return 
0;
    }
    return 
0;


Pour tester le tool, je vous propose d'essayer avec les deux images suivantes :
http://www.eecs.qmul.ac.uk/~phao/CIP/Images/Baboon.bmp
http://xartrick.free.fr/images/63d96f367...cd1d8a.png (oui Xartrick, j'étais sur ton blog quand je l'ai codé)
Pour éviter de vous embêtez avec les nom à rallonge, j'appellerais le BMP, Baboon.bmp et le second (le cake) encrypt.png
Cachon encrypt dans Baboon
./steg e encrypt.png Baboon.bmp

Puis pour extraire le fichier de Baboon.bmp, on fait
./steg d Baboon.bmp output.png

Vous devriez avoir deux fichiers identiques, output.png et encrypt.png.
Précisions, vous pouvez décrypter le fichier autant de fois que vous le souhaitez, car le programme ne 'remet' pas à 0 l'image lors de la decryption.

Necromoine
Aestuārium Erudītiōnis

There are only two hard things in Computer Science: cache invalidation, naming things, and off-by-one errors.
+1 (0) -1 (0) Répondre


Atteindre :


Utilisateur(s) parcourant ce sujet : 1 visiteur(s)
N-PN
Accueil | Challenges | Tutoriels | Téléchargements | Forum | Retourner en haut