-
-
[求助]加密算法破解
-
发表于: 2014-2-23 19:23 4734
-
算法代码如下(省略了初始置换),输入明文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];//校验值?
}
[培训]传播安全知识、拓宽行业人脉——看雪讲师团队等你加入!
赞赏
他的文章
- 64位软件用什么调试或者读取内存 5545
- [分享]最新版IDA到手了 9934
- [求助]谷歌浏览器打开百度要卡很久 11017
- [求助]加密算法破解 4735
- vb pcode怎么修改 2620
赞赏
雪币:
留言: