#include <iostream>
#include <string>
#include <fstream>
using namespace std;
int injectfile(char *, char *, char *, char *);
//隐藏文件函数
int exportfile(char *, char *, char *, char *);
//输出文件函数
void cript_decript(char *, char *, long);
//简单的加密函数
int main(int argc, char *argv[])
{
if(argc != 6)
{
cout << "\n\nShadowJPEG vers 1.1 ----\n";
cout << " Developed by [V]l4d for [url]www.noflyzone.org[/url] only\n\n";
cout << "Usage: ShadowJPEG -i <jpeg in> <file to hide> <jpeg_out> <key>\n";
cout << " ShadowJPEG -e <modified jpeg> <original jpeg image's size> <output file name> <key>\n\n";
cout << "-i = inject file into the jpeg image\n";
cout << "-e = export hidden file from jpeg\n\n";
return -1;
}
if(strstr(argv[1], "-i")) injectfile(argv[2], argv[3], argv[4], argv[5]);
if(strstr(argv[1], "-e")) exportfile(argv[2], argv[3], argv[4], argv[5]);
return 0;
}
int injectfile(char* jpeg_in, char *file_to_hide, char *jpeg_out, char *pad)
{
long file1long, file2long;
char *file1str, *file2str;
fstream fp1(jpeg_in, ios::in), fp2(file_to_hide, ios::in), fpout(jpeg_out, ios::out);
//使用fstream类操作文件。fp1打开图片,fp2打开欲隐藏文件,fpout输出最后的“加密”文件。
这三个都为文件对象,之后就可以用成员函数操作文件了
if(!fp1)
{
cout << "unable to open the file...";
return -1;
}
if(!fp2)
{
cout << "unable to open the file...";
return -1;
}
if(!fpout)
{
cout << "unable to open the file...";
return -1;
}
fp1.seekg(0, ios::end); //定位到图片文件的未部
fp2.seekg(0, ios::end); //定位到欲隐藏文件的未部
file1long = fp1.tellg(); //统计图片文件的长度,赋值给file1long
file2long = fp2.tellg(); //统计欲隐藏文件的长度赋值给file2long
因为已经用seekg()定位到文件的未部了,所以可直接使用tellg()
fp1.seekg(0, ios::beg); //定位到图片文件的首部
fp2.seekg(0, ios::beg); //定位到欲隐藏文件的首部
file1str = new char[file1long]; //新建数组,并赋值给指针file1str
file2str = new char[file2long]; //新建数组,并赋值给指针file2str
fp1.read(file1str, file1long); //读取图片文件,字节由file1long指定
fp2.read(file2str, file2long); //读取欲隐藏文件,字节由file2long指定
cript_decript(file2str, pad, ((long)file2long)); //加密
fpout.write(file1str, file1long); //将file1str写入图片文件,字节由file1long指定
fpout.write(file2str, file2long); //将file2str继续写如图片文件,字节由file2long指定
fp1.close();
fp2.close();
fpout.close();
//关闭文件对象
cout << "injection finished...the original file size is: " << file1long <<" bytes!" << endl;
return 0;
}
int exportfile(char *modified_file, char *original_size, char *outfile, char *pad)
{
long sum_long, file1long, file2long;
char *fp2str;
fstream fp1(modified_file, ios::in), fp2(outfile, ios::out);
//Fp1为打开加密后的图片文件,Fp2为输出隐藏文件
file1long = atoi(original_size);
//original_size为函数的参数,用于指定原始图片文件的大小。
//这里是将用户输入的大小(字符串)转换为长整形,并赋值给file1long
if(!fp1)
{
cout << "unable to open the file... be sure that it exist and that u have the required permissions";
return -1;
}
if(!fp2)
{
cout << "I cannot create the file...";
return -1;
}
fp1.seekg(0, ios::end); //定位到加密后的图片文件未部
sum_long = fp1.tellg(); //统计长度
fp1.seekg(0, ios::beg); //定位到加密后图片文件的首部
file2long = sum_long - file1long; //用加密后的图片文件长度减去原始图片文件的长度
fp2str = new char[file2long]; //新建数组,并赋值给指针fp2str
fp1.seekg(file1long, ios::beg); //定位到加密后的图片文件file1long处
fp1.read(fp2str, file2long); //读取隐藏文件,字节由file2long指定
//这里注意一下,由于已经用加密后的图片文件减去了原始图片文件,
//所以这里的fp2str就是我们隐藏文件的具体内容
cript_decript(fp2str, pad, file2long);
fp2.write(fp2str, file2long); //到这里就输出我们隐藏的文件了
fp1.seekg(0, ios::beg); //再次定位到首部,不过这里已经是原来的图片文件了
fp1.close();
fp2.close();
//关闭文件对象
cout << "Export finished." << " ..:::ShadowJPEG on [url]www.noflyzone.org:::..[/url]" << endl;
return 0;
}
void cript_decript(char *str, char *pad, long str_long)
{
int i, j, padlong;
padlong = strlen(pad);
for (i=0, j=0;i<str_long; i++, j++)
{
if(j == padlong) j = 0;
str[i]^=pad[j];
}
}
一段隐藏文件的C++程序源代码
最新推荐文章于 2023-12-19 13:05:36 发布