解密模拟题

现有加密二进制文件一份,按规则进行解码
   A. 转码后文件由0x1b, 0x4c开头
   B. 跳过源文件前六个字节,每两个字节为一个循环节
   C. 获取初始key,由md5("Hello" + 文件名)的前8位构成
   D. 对初始key进行如下操作: (高4位 * 0x41A70000 & 0x7fff0000 + 低4位 * 0x41A7 + (高4位 * 0x41A7) >> 15) 
   E. 获得变换后的key,并右移15位获得小节key,与源文件7,8字节(即第一个循环节)进行异或,获得解密结果
   F. 后面每个循环节,由当前变换后的key计算小节key与源文件进行异或,获得解密结果

   G. 最终输出文件

#include<iostream>

#include<cstdio>
#include<cstdlib>
using namespace std;
unsigned  int getkey(unsigned  int key)
{
unsigned  int num=key;
num=num>>16;
key=(num*0x41a70000&0x7fff0000)+(key&0x0ffff)*0x41a7+((num*0x41a7)>>15);
//key=key>>15;
return key;


}
int main()
{
char hz[6][10]={0x07,0x08,'\0'};
printf("%s",hz);


unsigned int key;
key=0x105169c3;
char  ch[2];
int a=0;
char str;
FILE * fp=fopen("d:\\assert.lua","rb"); //输入重定向,输入数据将从in.txt文件中读取
FILE * fp1=fopen("d:\\result.txt","a+"); //输出重定向,输出数据将保存在out.txt文件中
   if(fp == NULL||fp == NULL)
{
printf("文件打开失败\n");
return 0;
}
int num;
while((num=fread( &str, sizeof( char ), 1, fp )),num!=0)
{
a++;
if(a<=6)
{
fwrite( &str, sizeof( char ), 1, fp1 );
//key=getkey(key);
continue;
}
if(a&1)
        {
            ch[0]=str;
            //key=getkey(key);
          //  if(a==7)
          //  {
              //  printf("%x\n",str);
          //  }
        }
else
{
ch[1]=str;
   unsigned int newkey;
key=getkey(key);
newkey=key>>15;
if(a==8)
            {printf("%x\n",newkey);}
char low[2];
//char high[2];
low[0]=newkey&0x00ff;
low[1]=(newkey>>8)&0x00ff;
    //high[0]=(newkey>>16)&0x00ff;
//high[1]=((newkey>>16)>>8)&0x00ff;


low[1]^=ch[0];
low[0]^=ch[1];
fwrite( &low[1], sizeof( char ), 1, fp1 );
fwrite( &low[0], sizeof( char ), 1, fp1 );
//if(a==8)
        //printf("%s%s\n",low[1],low[0]);


}
}


fclose(stdin);//关闭文件
fclose(stdout);//关闭文件*/


return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值