很久之前的一个想法,看密码故事中一段关于维热那尔算法的情节,根据那张图片,把算法用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期)