-
-
[求助]加密算法破解
-
发表于: 2014-2-23 19:23 4571
-
算法代码如下(省略了初始置换),输入明文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位软件用什么调试或者读取内存 5078
- [分享]最新版IDA到手了 9734
- [求助]谷歌浏览器打开百度要卡很久 10819
- [求助]加密算法破解 4572
- vb pcode怎么修改 2540
看原图
赞赏
雪币:
留言: