problem mit stegano.programm, ü,$ etc werden nicht richtig übertragen
-
ich habe ein kleines Steganographie programm geschrieben (versteckt eine datei in einer bmp bilddatei).
das ganze funktioniert auch soweit ganz gut....
wenn ich jedoch folgenden textdatei inhalt verstecke:^1234567890ß´°!"§$%&/()=?`
*+'#_-:.;,µ~\}][{³²
ÖÄÜ
öäüerhalte ich:
^123456789°ß´0!¢'$%&/()=?`
*+'#_-:.;¬5~\}][û³2
ŠÖÄ\
Šöä|
nach extrahieren!ich habe schon mehrere sachen versucht, kann meinen Fehler aber einfach nicht ausfindig machen!
evtl kann mir ja jemand helfen!
Ich poste an dieser stelle einfach mal meinen quellcode:krypt.h:
#ifndef KRYPTO_H #define KRYPTO_H #include <iostream> #include <vector> #include <string> #include <sstream> #include <fstream> std::string marker1="Marker1"; std::string marker2="Marker2"; std::vector <char> getfile (std::string filename, bool hide) // load file into vector (if hidefile set preset with infos) { std::ifstream file(filename.c_str(),std::ios::binary); if (!file.is_open()) exit(1); file.seekg(0,std::ios::end); int filesize=file.tellg(); file.seekg(0,std::ios::beg); std::vector <char> filebuffer(filesize); int presetsize=0; if (hide) { std::string preset=""; std::stringstream sizebuffer; sizebuffer<<filesize; preset+=sizebuffer.str(); preset+=marker1; preset+=filename.c_str(); preset+=marker2; filebuffer.resize(preset.length()+filesize); for(presetsize=0;presetsize<preset.length();presetsize++) filebuffer[presetsize]=preset[presetsize]; } else; for (int q=0;!file.eof();q++) //encrypt each vector char in this line if hide ==true filebuffer[q+presetsize]=file.get(); file.close(); return(filebuffer); } char bintodec (int Bin[]) //convert Binary (int[]) to Dec int { char Dec=0; if (Bin[7]==1) Dec+=1; if (Bin[6]==1) Dec+=2; if (Bin[5]==1) Dec+=4; if (Bin[4]==1) Dec+=8; if (Bin[3]==1) Dec+=16; if (Bin[2]==1) Dec+=32; if (Bin[1]==1) Dec+=64; if (Bin[0]==1) Dec+=128; return(Dec); } void dectobin (char Dec, int Bin[]) //convert Dec to Binary (int []) { for (int i=0; i<8; i++) { int bit= ((Dec >> i) & 1); Bin[7-i]=bit; } } void hide( std::string hidename,std::string bmpname) //hide the hidefile in BMP-file { int bmpheadersize=57; std::vector <char> bmpbuffer=getfile(bmpname,false); std::vector <char> hidebuffer=getfile(hidename, true); if (bmpbuffer.size()- bmpheadersize>=hidebuffer.size()*8) { int bmpbin[8][8]; int hidebin[8]; for (int a=0;a<hidebuffer.size();a++) { dectobin(hidebuffer[a],hidebin); for (int o=0;o<8;o++) { dectobin(bmpbuffer[(a*8)+o+bmpheadersize],bmpbin[o]); bmpbin[o][7]=hidebin[o]; bmpbuffer[(a*8)+o+bmpheadersize]=bintodec(bmpbin[o]); } } std::ofstream bmp; std::string krypt=bmpname.substr(0,bmpname.find(".bmp")).c_str(); krypt+="_krypt.bmp"; bmp.open(krypt.c_str(),std::ios::binary); if (!bmp.is_open()) exit(1); for (int e=0;e<bmpbuffer.size();e++) { bmp<<bmpbuffer[e]; } bmp.close(); } else; } void extract(std::string filename) { std::vector <char> file = getfile(filename, false); std::vector <char> hidden(0); int bin[8]; std::string preset=""; int bmpheadersize=57; for (int t=0; t<file.size()-bmpheadersize;t++) //get the preset string { int temp[8]; dectobin(file[t+bmpheadersize], temp); bin[t%8]=temp[7]; if (t%8==0&&t>0) { preset+=bintodec(bin); } if (preset.find("Marker2")!=std::string::npos) break; } if (preset.find("Marker2")==std::string::npos) exit(1); else //get filename, filesize and hidden data { std::stringstream sizechar; sizechar<<preset.substr(0,preset.find("Marker1")); int hiddensize; sizechar>>hiddensize; std::string hiddenfilename=preset.substr(preset.find(marker1)+marker1.length(),preset.find(marker2)-(preset.find(marker1)+marker1.length())); int count=0; for (int z=bmpheadersize+(preset.length()*8);z<=bmpheadersize+(preset.length()*8)+(hiddensize*8);z++) { int temp[8]; dectobin(file[z],temp); bin[count%8]=temp[7]; if (count%8==0&&count>0) { hidden.resize(hidden.size()+1); hidden[hidden.size()-1]=bintodec(bin); } count++; } std::ofstream hiddenfile; std::string tempstring="hidden_"; tempstring+=hiddenfilename; hiddenfile.open(tempstring.c_str(),std::ios::binary); if (!hiddenfile.is_open()) exit(1); for (int q=0;q<hidden.size();q++) { hiddenfile<<hidden[q]; } hiddenfile.close(); } } #endifmain.cpp:
#include "krypto.h" using namespace std; int main(int argc, char *argv[]) { std::string choice="0"; std::string header="***********************************\n** Steganographie Programm **\n** by Cali **\n***********************************\n***********************************\n\n\n"; while (choice=="0") { choice="0"; system("cls"); std::cout<<header; std::cout<<"Sie koennen:\n\n"; std::cout<<" #1# Eine Datei in einer Bilddatei verstecken\n"; std::cout<<" #2# Eine Datei aus einem veraenderten Bild extrahieren\n\n"; std::cout<<" #3# Abbrechen\n\n\n"; std::cout<<"Bitte ihre Eingabe : "; std::cin>>choice; std::string Bitmap=""; if (choice=="1"||choice=="!") { std::string Hide=""; system("cls"); std::cout<<header; do { std::cout<<"Bitte geben sie den Namen der Bitmap ein \n(z.B.:c:\\testbild.bmp)\n:"; std::cin>>Bitmap; if (Bitmap.find(".bmp")==std::string::npos) cout<<"\nEs ist ein Fehler aufgetreten. Bitte Bildname mit Endung .bmp eingeben!\n"; }while (Bitmap.find(".bmp")==std::string::npos); std::cout<<"\nBitte gaben sie den Namen der zu Versteckenden Datei ein \n(z.B.:C:\\verstecken.txt)\n:"; std::cin>>Hide; choice="3"; hide(Hide,Bitmap); std::cout<<"\nDatei wurde erfolgreich versteckt!!!\n"; choice="1"; } else if (choice=="2"||choice=="\"") { system("cls"); std::cout<<header; do { std::cout<<"Bitte geben die den Namen der Bitmap ein \n(z.B.: C:\\bitmapmitinhalt.bmp)\n:"; cin>>Bitmap; if (Bitmap.find(".bmp")==std::string::npos) cout<<"\nEs ist ein Fehler aufgetreten. Bitte Bildname mit Endung .bmp eingeben!\n"; }while (Bitmap.find(".bmp")==std::string::npos); choice="3"; extract(Bitmap); std::cout<<"\nDatei wurde erfolgreich extrahiert!!!\n"; choice="2"; } else if (choice=="3"||choice=="§"); else { cout<<"\nEs ist ein Fehler aufgetreten...\n"<<std::endl; system ("Pause"); cin.clear(); choice="0"; } } system ("Pause"); return EXIT_SUCCESS; }über Hilfe würde ich mich sehr freuen... weiß nämlich einfach nicht mehr weiter!!!
-
krypt.h, Zeile 139-147 :
So wie diese Schleife formuliert ist, liest sie -9- Bytes ein. Es dürfen aber nur -8- sein.
-
Ich hab mir deinen Quellcode nicht angeguckt, aber das könnte/müsste an der Text-Formatierung liegen. Wenn du die Zahlenwerte der entsprechenden Chars vergleichst, sind die dann gleich? Im Magazin gibt's einen guten Artikel zu Unicode, Formatierung und so weiter, hab grad keine Lust das zu erklären :xmas1:
-
@Badestrand: das dachte ich auch zuerst konnte aber keinen Fehler finden!
@erbsenzähler: das if statement total verrafft!!!!
if (count%8==7)
jetzt geht alles ganz wunderbar und ich kann weitermachen!
ganz ganz vielen dank!
kann mir gut vorstellen dass es doch einiges an aufwand war durch den ganzen code zu gehen!
das hätte mir wirklich auch selber auffallen können.... brett vorm kopf....
ganz vielen dank nochmal!!!!