首页
社区
课程
招聘
[旧帖] [原创] 加密信息图片隐写程序 求邀请码 0.00雪花
发表于: 2012-2-11 12:12 1626

[旧帖] [原创] 加密信息图片隐写程序 求邀请码 0.00雪花

2012-2-11 12:12
1626
很久之前的一个想法,看密码故事中一段关于维热那尔算法的情节,根据那张图片,把算法用VB先构思出来了。。。之后又去自学了C语言,果断联想到图片隐藏信息。。。应该算有创意的一个东西吧。。。

信息加密隐写程序使用方法:

1. 请先在本目录中1.txt中填写需要加密的信息,不允许使用回车。
2.请把隐藏信息的图片放在本目录,如(1.jpg)
3.打开加密程序,输入隐藏信息图片的名称,如(1.jpg)
4.输入加密的密码(密码可以输入英文字母或数字,混合也可以输入)
5最后得到一张内含加密信息的图片ok.jpg
6.请记录已加密图片的特征码(一串数字)

解密程序使用方法:
按程序提示输入信息,此时图片的名称为已加密的图片名,如ok.jpg

关于
1.由于互联网的发达与普遍,导致一些不发分子利用漏洞攻入主机盗取信息。因为一些人习惯了将密码,银行卡号等私密信息以txt文本形式储存,一些公司职员使用不加密的邮件发送方式,很容易造成信息泄露以及财产损失。所以一款能将信息隐藏的软件显得尤其重要。本程序采用C语言编写,支持中英文数字加密,由于操作系统的差异以及语言环境的变换,可能导致某些字出现同音不同字的现象。不过大多数是不会出现误差的。

本程序适用范围:
1.银行卡号,游戏账号,密码等隐私的保存。
2.一些机密聊天记录的保存。
3.邮件的隐秘加密发送。方法:发送方将信息加密成图片,利用附件的形式发送图片,并将特征码以数字形式发送。收件方只需要利用两人共用的解密密码即可获取信息。防止不法分子对邮件信息的嗅探。

工具和源码放在我自己的博客空间里
下载地址:xyt.so/down/tpyx.rar

源码我把加密的源码贴出来:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
char z[35][40];//前面35是指一共35个列,后面40指字符串的长度为40,是为了防止赋值时字符串太长出错,所以设置了很大,原来只需36
char s[]="0123456789abcdefghijklmnopqrstuvwxyz"; //原始字符串,改变字母顺序可以生成不同的加密阵列
char *yl=s;//为下面的加密指向
char word[100000]={0};
char ok[10000]={0};
char un[10000]={0};
int ii=100000;

//////////////////////////////////////////////////////////////////////// 16进制
int func(char s[],int x)
{
int i;
int num=0;
for(i=x-1;i>=0;i--)
{
  if(s[i]>='0'&&s[i]<='9')
  {   
   num+=(int)((s[i]-'0')*pow(16,x-i-1));
  }
  if(s[i]>='a'&&s[i]<='f'){  
   num+=(int)((s[i]-'a'+10)*pow(16,x-i-1));
  }
  if(s[i]>='A'&&s[i]<='F'){   
   num+=(int)((s[i]-'A'+10)*pow(16,x-i-1));
  }
}
return num;
}
////////////////////////////////////////////////////////////////////////

/////////////////////////////////////// mid函数
char *mid(char t[],int begin,int len)   //如果刚开始接受指针的话,原来的字符串也会随之改变
{  
    char p[100000];//因此设置一个过渡的一维数组
    strcpy(p,t);//通过strcpy将传过来的形参赋值给过渡数组
    char *m=p;
    m = m+begin;
    *(m+len) = '\0';
    return m; //返回指针
}

int main(int argc, char *argv[])
{
   
   
   
   
///////////////////////////////////////////////////////////// 列表成功
  int i;
  char l[40];
  strcpy(z[0],s);
  for(i=1;i<36;i++)
  {
  strcpy(l,mid(s,i,36-i));
  strcat(l,mid(s,0,i));

  strcpy(z[i],l);
  memset(l,0,40);
  }
  /////////////////////////////////////////////////////////////
  
  
  
  
  
  
  
  
  
  char newkey[10000]={0};
  char key[10000];
  
  
  
  
  ///////////////////////////////////////////////////////////////////////////
  FILE *fp1,*fp2,*fp3,*fp4;
    unsigned char s[100000];//将大小定义为10000
    int n;
    char k[100000];
    char u[3];
    //////////////////////////////////////////////////////////////读取
    if ((fp1=fopen("1.txt","r")) == NULL)
    {
       printf("文件读取失败!") ;           
       exit(0);              
    }
    fgets(s,ii,fp1);
    fclose(fp1);
    //////////////////////////////////////////////////////////////读取完毕
   
    //////////////////////////////////////////////////////////////转换成16进制
    if ((fp2=fopen("2.txt","w")) == NULL)
    {
       printf("文件写入失败!") ;           
       exit(0);              
    }
    for(n=0;n<strlen(s);n++)
    {
      fprintf(fp2,"%x",s[n]);
    }
    fclose(fp2);
    if ((fp1=fopen("2.txt","r")) == NULL)
    {
       printf("文件读取失败!") ;           
       exit(0);              
    }
    fgets(k,ii,fp1);
    fclose(fp2);
   
//////////////////////////////////////////////////////////////转换成16进制

    if ((fp3=fopen("3.txt","w")) == NULL)
    {
       printf("文件写入失败!") ;           
       exit(0);              
    }
     for(n=0;n<strlen(k);n=n+2) //
    {
     strcpy(u,mid(k,n,2));
     int q=func(u,2);
    if (q<128)
    fprintf(fp3,"$$$")&fprintf(fp3,u)&fprintf(fp3,"$$$")&fprintf(fp3,"00");

    else
    fprintf(fp3,"$$$")&fprintf(fp3,u);
   
     memset(u,0,3);
          }
   fclose(fp3);
   
   
//////////////////////////////////////////////////以上将字符转为编码并格式化处理  
   
    if ((fp4=fopen("3.txt","r")) == NULL)
    {
       printf("文件读取失败!") ;           
       exit(0);              
    }
   
    char kk[10000];
    char k1[10000];
    fgets(kk,ii,fp4);
char *delim = "$$$";
char *p;
strcpy(word,strtok(kk, delim));
        while((p = strtok(NULL, delim)))
        {
            strcat(word,p);
        }       
   fclose(fp4);
   

   
  ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  
  
  
  int n1;
  int t1;
  char name[50];
  printf("请输入图片名:(带.jpg或.bmp)\n");
  gets(name);
  printf("请输入密码\n");
  scanf("%s",&key);
  ////////////////////////////////////////////密码与字符数量对应
  if (strlen(word)>strlen(key))
    {
  t1=floor(strlen(word)/strlen(key));//向下取整
  char temp[10000];
  strcpy(temp,mid(key,0,strlen(word)-strlen(key)*t1));
  for(n1=0;n1<t1;n1++)
  {
  strcat(newkey,key);
  }

  strcat(newkey,temp);
  }
  else
  strcat(newkey,mid(key,1,strlen(word)));

for(i=0;i<strlen(newkey);i++)
{
int t1=strcspn(yl,mid(newkey,i,1));//密码数组下标   
int t2=strcspn(yl,mid(word,i,1));//需要加密的字符所在的位置

if(t2-1==-1)
strcat(ok,"0");    //这句相当关键, strcspn返回的位置总是比实际位置少1,t4-2就可能返回-1,造成当加密后的字符串中有0时会自动跳过
else                       
strcat(ok,mid(z[t1],t2-1,1));                                         
}
                        

///////////////////////////////////////////////////将加密完成的字符串输出

    if ((fp3=fopen("4.txt","w")) == NULL)
    {
       printf("文件写入失败!") ;           
       exit(0);              
    }
     for(n=0;n<strlen(ok);n=n+2) //
    {
     strcpy(u,mid(ok,n,2));

    fprintf(fp3,"$$$")&fprintf(fp3,u);
   
     memset(u,0,3);
          }
   fclose(fp3);
   
   
   
   
    if ((fp3=fopen("5.txt","w")) == NULL)
    {
       printf("文件写入失败!") ;           
       exit(0);              
    }
    fprintf(fp3,"\r\n");
    fprintf(fp3,"\r\n");
    fprintf(fp3,"\r\n");
    fprintf(fp3,"\r\n");
    fprintf(fp3,"\r\n");
     for(n=0;n<strlen(ok);n=n+2) //
    {
     strcpy(u,mid(ok,n,2));

    fprintf(fp3,"$$$")&fprintf(fp3,u);
   
     memset(u,0,3);
          }
   fclose(fp3);
   
   
   
     FILE *fp5;
         if ((fp5=fopen("4.txt","r")) == NULL)
    {
       printf("文件读取失败!") ;           
       exit(0);              
    }
    int tk;
    int ti=100000;
    char ts[100000];
    fgets(ts,ti,fp5);
    fclose(fp5);
    system("del 4.txt");
   
//////////////////////////////////////////////////////

  rename(name,"1.jpg");
  system("Copy 1.jpg/b + 5.txt/a ok.jpg");
  printf("加密完毕!你的加密文件特征码为:%d",strlen(ts)+1);
  system("del 2.txt");
  system("del 3.txt");
  system("del 5.txt");
  system("PAUSE");       
  return 0;
}

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 878
活跃值: (496)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
这样解密也很容易,如果有工具
2012-2-11 15:34
0
雪    币: 63
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
他们的最大的加密是障眼法,你都不知道它是个特殊文件,你就不会对他产生想法,这在很大程度上降低破解威胁
2012-12-6 12:47
0
雪    币: 85
活跃值: (37)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
学习学习中。。。。
2012-12-6 13:04
0
游客
登录 | 注册 方可回帖
返回
//