/* 使用说明
所涉及的 TXT文件均存放与 E: 目录下
操作时 :需要隐藏的文件 经加密后存放于 E:yinceng.txt中
提取出来的文件 存放于 E:tiqu.txt中
提取出来的文件再次调用 jiami函数 便可得到原文
*/
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<string.h>
#define NUM 20
#define LEN 192
#define block_size 512
typedef struct fileHead
{
int size;
int dataLoc;
}FILE_HEAD;
typedef struct inode
{
int id;
char * i_block[15];
}INODE;
typedef struct yinceng
{
char *s; /*记录隐藏文件名*/
int H[20][15]; /*记录被隐藏文件的开始位置*/
int B[20][15]; /*记录被利用的inode.i_block*/
}YC;
FILE_HEAD fh;
char Flag; /*系统退出标志*/
INODE in[20];
/*初始化磁盘——相当于格式化磁盘*/
void geshihua(void)
{
FILE_HEAD fh;
FILE *fp;
int i,j;
fh.size=20;
fh.dataLoc=20*sizeof(INODE)+sizeof(FILE_HEAD);
fp=fopen("E://disk.txt","wb");
fwrite(&fh,sizeof(struct fileHead),1,fp);
close(fp);
for(i=0;i<20;i++)
{
for(j=0;j<15;j++)
{
in[i].i_block[j]=(char *)(-1);
}
}
printf("ge shi hua cheng gong !/n");
for(i=0;i<5;i++)
{
printf("%d/n",i);
for(j=0;j<15;j++)
{
printf("%d",in[i].i_block[j]);
printf(" ");
}
printf("/n");
}
}
/*系统运行一段时间*/
void chushihua(void)
{
int i,j;
int k=0;
char *A[12];
FILE *fp=fopen("E://123.txt","rb");
for(i=0;i<12;i++)
{
A[i]=(char *)malloc(512);
*A[i]=0;
}
for(i=0;i<12;i++)
fread(A[i],512,1,fp);
for(i=0;i<20;i++)
{
for(j=0;j<15;j=j+3)
{
if(*A[k])
{
in[i].i_block[j]=A[k];
k++;
}
else break;
}
}
/*输出初始化结果*/
for(i=0;i<5;i++)
{
printf("%d/n",i);
for(j=0;j<15;j++)
{
printf("%d",in[i].i_block[j]);
printf(" ");
}
printf("/n");
}
close(fp);
}
/*对要隐藏的文件实行加密*/
void dofile(char *in_fname,char *pwd,char *out_fname);/*对文件进行加密的具体函数*/
void jiami()/*定义jiami()函数的命令行参数*/
{
char in_fname[30];/*用户输入的要加密的文件名*/
char out_fname[30];
char pwd[8];/*用来保存密码*/
printf("/nIn-fname:/n");
getchar();
gets(in_fname);/*得到要加密的文件名*/
printf("Password:/n");
gets(pwd);/*得到密码*/
printf("Out-file:/n");
gets(out_fname);/*得到加密后你要的文件名*/
dofile(in_fname,pwd,out_fname);
}
/*加密子函数开始*/
void dofile(char *in_fname,char *pwd,char *out_file)
{
FILE *fp1,*fp2;
register char ch;
int j=0;
int j0=0;
fp1=fopen(in_fname,"rb");
if(fp1==NULL)
{
printf("cannot open in-file./n");
exit(1);/*如果不能打开要加密的文件,便退出程序*/
}
fp2=fopen(out_file,"wb");
if(fp2==NULL)
{
printf("cannot open or create out-file./n");
exit(1);/*如果不能建立加密后的文件,便退出*/
}
while(pwd[++j0]);
ch=fgetc(fp1);
/*加密算法开始*/
while(!feof(fp1))
{
fputc(ch^pwd[j>=j0?j=0:j++],fp2);/*异或后写入fp2文件*/
ch=fgetc(fp1);
}
fclose(fp1);/*关闭源文件*/
fclose(fp2);/*关闭目标文件*/
}
YC yc1; /* 记录隐藏文件信息*/
/*实现隐藏文件*/
void yincang()
{
int i,j;
int k=0;
char *A[12];
FILE *fp=fopen("E://yincang.txt","rb");
yc1.s=(char *)(yincang);
for(i=0;i<20;i++)
{
for(j=0;j<15;j++)
{
yc1.B[i][j]=0;
yc1.H[i][j]=0;
}
}
for(i=0;i<12;i++)
{
A[i]=(char *)malloc(512);
*A[i]=0;
}
for(i=0;i<12;i++)
fread(A[i],512,1,fp);
close(fp);
/*遍历inode检查空缺,实现隐藏*/
for(i=0;i<20;i++)
{
for(j=0;j<15;j++)
{
if((in[i].i_block[j]==(char *)(-1))&&(*A[k]))
{
in[i].i_block[j]=A[k];
yc1.B[i][j]=1;
k++;
}
}
}
system(" del E://yincang.txt");
for(i=0;i<5;i++)
{
printf("%d/n",i);
for(j=0;j<15;j++)
{
printf("%d",in[i].i_block[j]);
printf(" ");
}
printf("/n");
}
}
/*提取隐藏文件*/
void tiqu( )
{
int i,j;
FILE *fp=fopen("E://tiqu.txt","w");
for(i=0;i<20;i++)
{
for(j=0;j<15;j++)
{
if(yc1.B[i][j]==1)
{
fwrite(in[i].i_block[j],512,1,fp);
}
}
}
close(fp);
printf("ti qu yin ceng wen jian cheng gong !!/n");
}
/*菜单界面*/
void display(void)
{
printf("***************************************************************/n/n");
printf(" Welcome to our system! /n/n");
printf("**********************MENU*************************************/n");
printf(" 1->|******* geshihua *******|/n");
printf(" 2->|****** chushihua ******|/n");
printf(" 3->|***** jiami *****|/n");
printf(" 4->|**** yincang ****|/n");
printf(" 5->|*** tiqu ***|/n");
printf(" 6->|** Quit the system **|/n");
printf("***************************************************************/n");
}
/*
*功能选择
*/
void FucSel(void)
{
int choice;
/*输入的内容必须为1-10*/
printf("/n please input your choice 1-6 : ");
while((1 != scanf("%d",&choice)) || (choice<1 || choice>6))
printf(" plese input your choice IN 1、2...6: ");
printf("/n");
switch(choice)
{
case 1: geshihua();
break;
case 2: chushihua();
break;
case 3: jiami();
break;
case 4: yincang();
break;
case 5: tiqu();
break;
case 6: Flag = 1;
break;
default: break;
}
}
/*
*主函数
*/
int main(void)
{
while(1)
{
display(); /*菜单显示*/
FucSel(); /*功能选择*/
if(Flag) /*退出系统*/
break;
}
return 0;
}