首页
社区
课程
招聘
[求助]加密算法破解
2014-2-23 19:23 4254

[求助]加密算法破解

2014-2-23 19:23
4254
算法代码如下(省略了初始置换),输入明文8字节,输出密文8字节,想破密钥
在密钥未知的情况下,可以选择任意明文和得到这个密钥加密后对应的密文,能不能破解密钥?
#include <stdio.h>
unsigned char ED[20];
unsigned char   KEY[]={0x00,0x35,0x47,0x31,0x25,0x7a,0x2a,0x10};//密钥
unsigned char AU();
void FF(unsigned char CH,unsigned char times);
int  main()
{
	AU();
	return 0;
}
//*********************加密轮函数************************************
void FF(unsigned char CH,unsigned char times)
{
	unsigned char k;
	unsigned char d;
	unsigned char n_ED;
	unsigned char R;
	unsigned char sr;
	unsigned char S;
	unsigned char ss;
	unsigned char Ti;
	unsigned char st;
	for(k=0x00;k<times;k++)
	{
		n_ED=CH ^ ED[0];
		R= n_ED&0x1f;
		S= ((n_ED&0x0f)<<3)+((n_ED&0xe0)>>5);
		Ti=(n_ED&0xf8)>>3;
		if(((ED[4])+((ED[1]&0x0f)<<1)+((ED[1]&0x10)>>4))>31)
			sr=((ED[4])+((ED[1]&0x0f)<<1)+((ED[1]&0x10)>>4))-31;
		else
			sr=((ED[4])+((ED[1]&0x0f)<<1)+((ED[1]&0x10)>>4));
		ED[1]=ED[2];
		ED[2]=ED[3];
		ED[3]=ED[4];
		ED[4]=ED[5]^R;
		ED[5]=ED[6];
		ED[6]=ED[7];
		ED[7]=sr;
		if ((ED[9]+((ED[8]&0x3f)<<1)+((ED[8]&0x40)>>6) )>127)
			ss=( (ED[9]) + ((ED[8]&0x3f)<<1)+((ED[8]&0x40)>>6) )-127;
		else
			ss= (ED[9]) + ((ED[8]&0x3f)<<1)+((ED[8]&0x40)>>6) ;
		ED[8]=ED[9];
		ED[9]=S^ED[10];
		ED[10]=ED[11];
		ED[11]=ED[12];
		ED[12]=ED[13];
		ED[13]=ED[14];
		ED[14]=ss;
		if ((ED[15]+ED[17])> 31)
			st=ED[15]+ED[17]-31;
		else
			st=ED[15]+ED[17];
		ED[15]=ED[16];
		ED[16]=ED[17];
		ED[17]=ED[18]^Ti;
		ED[18]=ED[19];
		ED[19]=st;
		if((ED[14]&0x01)==0)
			d=((ED[7]^ED[3])&0x01);
		else
			d=((ED[19]^ED[16])&0x01);
		if((ED[14]&0x02)==0)
			d=d+((ED[7]^ED[3])&0x02);
		else
			d=d+((ED[19]^ED[16])&0x02);
		if((ED[14]&0x04)==0)
			d=d+((ED[7]^ED[3])&0x04);
		else
			d=d+((ED[19]^ED[16])&0x04);
		if((ED[14]&0x08)==0)
			d=d+((ED[7]^ED[3])&0x08);
		else
			d=d+((ED[19]^ED[16])&0x08);
		ED[0]= ( (((ED[0])&0x0f)<<4) +d);

	}
}
//加密函数
unsigned char AU()
{
	unsigned char  CC[20];
	int j;
	for(j=0;j<=19;j++)
	{ED[j]=0x00;}
	CC[4]=0x00;
	CC[5]=0x00; 
	CC[6]=0x00; 
	CC[7]=0x00; 
	CC[8]=0x00;  
	CC[9]=0x00;
	CC[10]=0x00; 
	CC[11]=0x00;
	printf("明文:");
	for(int i=0;i<8;i++)
		printf("%02x ",CC[4+i]);
	printf("\n密钥:");
	for(int i=0;i<8;i++)
		printf("%02x ",KEY[i]);
	FF(KEY[0],0x03);
	FF(KEY[1],0x03);
	FF(CC[8],0x01);
	FF(KEY[2],0x03);
	FF(KEY[3],0x03);
	FF(CC[9],0x01);
	FF(KEY[4],0x03);
	FF(KEY[5],0x03);
	FF(CC[10],0x01);
	FF(KEY[6],0x03);
	FF(KEY[7],0x03);
	FF(CC[11],0x01);
	FF(0x00,0x06);
	CC[12]=ED[0]; 
	printf("\n密文:%02x ",ED[0]);
	for(j=1;j<8;j++)
	{
		FF(0x00,0x07);
		CC[12+j]=ED[0];
		printf("%02x ",ED[0]);
	}
	return CC[4];//校验值?
}


[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
免费 0
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回