一段隐藏文件的C++程序源代码

#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];
}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值