基于磁盘逻辑结构的信息隐藏(模拟实现)

/*   使用说明
     所涉及的 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;
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值