Hi!
One more small (hope usefull) snippet from me
![](/ubbthreads/images/graemlins/smile.gif)
Actual encryption of the message inside the picture. I tryed to simplify code to show this old idea, implemented in C-script at
first time, I think.
Search 'steganography' or alike over Internet to read about main idea of this stuff.
Code:
bmap* TempSteganoBmpPtr;
string* TempSteganoStrPtr;
string TempSteganoStr;
string TempSteganoChar;
function SteganoEncrypt(ImgOrig, Str){ //returns -1 if error, 0 - success
var x;
var y;
var i;
var j;
var PixelData;
var CharMask;
var CharData;
var format;
TempSteganoBmpPtr=ImgOrig;
TempSteganoStrPtr=Str;
format=bmap_lock(TempSteganoBmpPtr, 0);
if (format!=8888){ //32bit images only (TGA with alpha for example)
bmap_unlock(TempSteganoBmpPtr);
return(-1);
}
x = 0;
y = 0;
i=0;
while(i < str_len(TempSteganoStrPtr)){
CharMask = 128; //80h;
j=1;
while(j < 9){
str_cpy(TempSteganoStr, TempSteganoStrPtr);
CharData = str_to_asc(str_clip(TempSteganoStr, i));
if (CharData==0){//EOL
bmap_unlock(TempSteganoBmpPtr);
return(0);
}
CharData = CharData & CharMask;
PixelData = pixel_for_bmap(TempSteganoBmpPtr, x, y);
if(CharData != 0){ //Data is not zero - change the LSB of the current pixel.
PixelData = PixelData | 1;
}else{
PixelData = PixelData & 4294967294;
}
pixel_to_bmap(TempSteganoBmpPtr, x, y, PixelData);
x += 1;
x %= bmap_width(TempSteganoBmpPtr);
if(x==0){
y+=1;
}
CharMask = CharMask >> 1;
j += 1;
}
i += 1;
}
bmap_unlock(TempSteganoBmpPtr);
return(0);
}
function SteganoDecrypt(ImgOrig){ //returns pointer to decrypted string
var x;
var y;
var i;
var j;
var PixelData;
var CharMask;
var CharData;
var format;
TempSteganoBmpPtr = ImgOrig;
TempSteganoStrPtr = TempSteganoStr;
str_cpy(TempSteganoStr, "");
format=bmap_lock(TempSteganoBmpPtr, 0);
if (format!=8888){ //32bit images only (TGA with alpha for example)
bmap_unlock(TempSteganoBmpPtr);
return(-1);
}
x = 0;
y = 0;
i=0;
while(1){
CharMask = 128; //80h;
j=1;
CharData=0;
while(j < 9){
PixelData = pixel_for_bmap(TempSteganoBmpPtr, x, y);
if ((PixelData & 1) !=0 ){
CharData = CharData | CharMask;
}
x += 1;
x %= bmap_width(TempSteganoBmpPtr);
if(x==0){
y+=1;
}
if(y > bmap_height(TempSteganoBmpPtr)){
bmap_unlock(TempSteganoBmpPtr);
return(TempSteganoStrPtr);
}
CharMask = CharMask >> 1;
j += 1;
}
if (CharData==0){//EOL
bmap_unlock(TempSteganoBmpPtr);
return(TempSteganoStrPtr);
}
str_for_asc(TempSteganoChar, CharData);
str_cat(TempSteganoStr, TempSteganoChar);
i += 1;
}
bmap_unlock(TempSteganoBmpPtr);
return(TempSteganoStrPtr);
}
usage example:
Code:
string RString;
bmap codedbmp=<coded.tga>;
panel codpan{
pos_x=256;
pos_y=256;
bmap = codedbmp; //show test image
flags = refresh,d3d,visible;
}
text teststr{
pos_x = 0;
pos_y = 0;
font = skinc_font;
string = RString; //show test string
flags = visible;
}
...
str_cpy(RString, "Multiline test\nof c-script stegano.\nstring ends with zero char\0");
SteganoEncrypt(codedbmp, RString); //Encode
str_cat(RString, "\n\n"); //if all Ok you have 2 identical groups of 3 lines
str_cat(RString, SteganoDecrypt(codedbmp)); //and decode our test message
...
For good results you have to experiment with image (image background hasn't be white, for example
![](/ubbthreads/images/graemlins/smile.gif)
)
And I don't check length of string against image size, so be careful or provide this simple check.