导航:首页 > 源码编译 > des算法测试

des算法测试

发布时间:2022-09-27 01:35:12

① DES加密算法的测试数据示例

其实你只要再写个解密的过程看看加密完能不能还原回去就好了。。解密过程和加密过程基本一样,就是使用子密钥时的顺序是倒着的。
明文是 testdata,密钥是mydeskey 正确的des加密后二进制密文:
用base64编码形成的密文是:4wynQOzDaiA=
解密后:

② DES加密算法在Linux下运行异样

只有写的不好的程序,还没听说过报异常的算法,楼主真乃神人也!
你搞清楚UNIX/Linux同Windows的在处理文件上的区别了吗?之前我也一度写过这类东西,Windows的换行同Linux的是不同的,所以如果用终端输入去测试的话,很可能会有考虑不周的地方,试着用同一个字符串变量去测试,就能知道是否是算法的问题了。

③ DES和AES算法的比较,各自优缺点有哪些

一、数据加密标准不同

1、DES算法的入口参数有三个:Key、Data、Mode。

其中Key为7个字节共56位,是DES算法的工作密钥;Data为8个字节64位,是要被加密或被解密的数据;Mode为DES的工作方式,有两种:加密或解密。

2、AES的基本要求是,采用对称分组密码体制,密钥的长度最少支持为128、192、256,分组长度128位,算法应易于各种硬件和软件实现。

因此AES的密钥长度比DES大, 它也可设定为32比特的任意倍数,最小值为128比特,最大值为256 比特,所以用穷举法是不可能破解的。

二、运行速度不同

1、作为分组密码,DES的加密单位仅有64位二进制,这对于数据传输来说太小,因为每个分组仅含8个字符,而且其中某些位还要用于奇偶校验或其他通讯开销。处理速度慢、加密耗时

2、AES对内存的需求非常低,运算速度快,在有反馈模式、无反馈模式的软硬件中,Rijndael都表现出非常好的性能。

三、适用范围不同

1、数据加密标准,速度较快,适用于加密大量数据的场合。DES在安全上是脆弱的,但由于快速DES芯片的大量生产,使得DES仍能暂时继续使用,为提高安全强度,通常使用独立密钥的三级DES

2、AES 适用于8位的小型单片机或者普通的32位微处理器,并且适合用专门的硬件实现,硬件实现能够使其吞吐量(每秒可以到达的加密/解密bit数)达到十亿量级。同样,其也适用于RFID系统。

④ DES加密算法中S作用S盒的输入几位输出几位说明其计算机过程

S盒是DES算法的核心,用在分组密码算法中,是唯一的非线性结构,其S盒的指标的好坏直接决定了密码算法的好坏。

每个S盒是将6位输入转化为4位输出。

根据6位输入来查找对应S盒的表,由第一和最后一位得到行号,由中间的四位得到列号。如:对S盒1,输入为110011,就是查找第3行、第9列,结果为11,于是输出就是二进制的1011。



(4)des算法测试扩展阅读

DES于1976年被美国联邦政府的国家标准局确定为联邦资料处理标准(FIPS),随后在国际上广泛流传开来。

目前DES现在已经不是一种安全的加密方法,主要因为它使用的56位密钥过短。1999年1月,distributed.net与电子前哨基金会合作,在22小时15分钟内即公开破解了一个DES密钥。在2001年,DES作为一个标准已经被高级加密标准(AES)所取代。

DES是一种分组密码,它使用使用56位秘钥对64位(8字节)分组进行加密。同时是一种对称密码,即其加密和解密使用相同的秘钥。每个分组的加密分为16轮迭代,每轮是用不同的自秘钥,而子秘钥是根据主密钥k编排得出。

⑤ des是什么算法

DES算法为密码体制中的对称密码体制。

DES算法为密码体制中的对称密码体制,又被称为美国数据加密标准,是1972年美国IBM公司研制的对称密码体制加密算法。明文按64位进行分组,密钥长64位,密钥事实上是56位参与DES运算,分组后的明文组和56位的密钥按位替代或交换的方法形成密文组的加密方法。

des的应用领域

计算机网络通信:对计算机网络通信中的数据提供保护是DES的一项重要应用。但这些被保护的数据一般只限于民用敏感信息,即不在政府确定的保密范围之内的信息。

电子资金传送系统:采用DES的方法加密电子资金传送系统中的信息,可准确、快速地传送数据,并可较好地解决信息安全的问题。

保护用户文件:用户可自选密钥对重要文件加密,防止未授权用户窃密。

用户识别:DES还可用于计算机用户识别系统中。

⑥ “DES”和“AES”算法的比较,各自优缺点有哪些

DES算法优点:DES算法具有极高安全性,到目前为止,除了用穷举搜索法对DES算法进行攻击外,还没有发现更有效的办法。

DES算法缺点:

1、分组比较短。

2、密钥太短。

3、密码生命周期短。

4、运算速度较慢。

AES算法优点:

1、运算速度快。

2、对内存的需求非常低,适合于受限环境。

3、分组长度和密钥长度设计灵活。

4、 AES标准支持可变分组长度,分组长度可设定为32比特的任意倍数,最小值为128比特,最大值为256比特。

5、 AES的密钥长度比DES大,它也可设定为32比特的任意倍数,最小值为128比特,最大值为256比特,所以用穷举法是不可能破解的。

6、很好的抵抗差分密码分析及线性密码分析的能力。

AES算法缺点:目前尚未存在对AES 算法完整版的成功攻击,但已经提出对其简化算法的攻击。

(6)des算法测试扩展阅读:

高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。

这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院(NIST)于2001年11月26日发布于FIPS PUB 197,并在2002年5月26日成为有效的标准。2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一。

⑦ des算法安全性分析

DES
是一个对称算法:加密和解密用的是同
一算法(除密钥编排不同以外),既可用于加密又可用于解密。它的核心技术是:在相信复杂函数可以通过简单函数迭代若干圈得到的原则下,利用F函数及对合等运算,充分利用非线性运算。

至今,最有效的破解DES算法的方法是穷举搜索法,那么56位长的密钥总共要测试256次,如果每100毫秒可以测试1次,那么需要7.2×1015秒,大约是228,493,000年。但是,仍有学者认为在可预见的将来用穷举法寻找正确密钥已趋于可行,所以若要安全保护10年以上的数据最好。

⑧ des加密算法(c/c++)

des.h文件:

#ifndefCRYPTOPP_DES_H

#defineCRYPTOPP_DES_H

#include"cryptlib.h"

#include"misc.h"

NAMESPACE_BEGIN(CryptoPP)

classDES:publicBlockTransformation

{

public:

DES(constbyte*userKey,CipherDir);

voidProcessBlock(constbyte*inBlock,byte*outBlock)const;

voidProcessBlock(byte*inoutBlock)const

{DES::ProcessBlock(inoutBlock,inoutBlock);}

enum{KEYLENGTH=8,BLOCKSIZE=8};

unsignedintBlockSize()const{returnBLOCKSIZE;}

protected:

staticconstword32Spbox[8][64];

SecBlock<word32>k;

};

classDESEncryption:publicDES

{

public:

DESEncryption(constbyte*userKey)

:DES(userKey,ENCRYPTION){}

};

classDESDecryption:publicDES

{

public:

DESDecryption(constbyte*userKey)

:DES(userKey,DECRYPTION){}

};

classDES_EDE_Encryption:publicBlockTransformation

{

public:

DES_EDE_Encryption(constbyte*userKey)

:e(userKey,ENCRYPTION),d(userKey+DES::KEYLENGTH,DECRYPTION){}

voidProcessBlock(constbyte*inBlock,byte*outBlock)const;

voidProcessBlock(byte*inoutBlock)const;

enum{KEYLENGTH=16,BLOCKSIZE=8};

unsignedintBlockSize()const{returnBLOCKSIZE;}

private:

DESe,d;

};

classDES_EDE_Decryption:publicBlockTransformation

{

public:

DES_EDE_Decryption(constbyte*userKey)

:d(userKey,DECRYPTION),e(userKey+DES::KEYLENGTH,ENCRYPTION){}

voidProcessBlock(constbyte*inBlock,byte*outBlock)const;

voidProcessBlock(byte*inoutBlock)const;

enum{KEYLENGTH=16,BLOCKSIZE=8};

unsignedintBlockSize()const{returnBLOCKSIZE;}

private:

DESd,e;

};

classTripleDES_Encryption:publicBlockTransformation

{

public:

TripleDES_Encryption(constbyte*userKey)

:e1(userKey,ENCRYPTION),d(userKey+DES::KEYLENGTH,DECRYPTION),

e2(userKey+2*DES::KEYLENGTH,ENCRYPTION){}

voidProcessBlock(constbyte*inBlock,byte*outBlock)const;

voidProcessBlock(byte*inoutBlock)const;

enum{KEYLENGTH=24,BLOCKSIZE=8};

unsignedintBlockSize()const{returnBLOCKSIZE;}

private:

DESe1,d,e2;

};

classTripleDES_Decryption:publicBlockTransformation

{

public:

TripleDES_Decryption(constbyte*userKey)

:d1(userKey+2*DES::KEYLENGTH,DECRYPTION),e(userKey+DES::KEYLENGTH,ENCRYPTION),

d2(userKey,DECRYPTION){}

voidProcessBlock(constbyte*inBlock,byte*outBlock)const;

voidProcessBlock(byte*inoutBlock)const;

enum{KEYLENGTH=24,BLOCKSIZE=8};

unsignedintBlockSize()const{returnBLOCKSIZE;}

private:

DESd1,e,d2;

};

NAMESPACE_END

#endif

des.cpp文件:

//des.cpp-modifiedbyWeiDaifrom:

/*

*

*circa1987,'s1977

*publicdomaincode.,but

*theactualencrypt/

*Outerbridge'sDEScodeasprintedinSchneier's"AppliedCryptography."

*

*Thiscodeisinthepublicdomain.Iwouldappreciatebugreportsand

*enhancements.

*

*PhilKarnKA9Q,[email protected],August1994.

*/

#include"pch.h"

#include"misc.h"

#include"des.h"

NAMESPACE_BEGIN(CryptoPP)

/*

*Threeofthesetables,theinitialpermutation,thefinal

*,areregularenoughthat

*forspeed,wehard-codethem.They'rehereforreferenceonly.

*Also,,gensp.c,

*tobuildthecombinedSPbox,Spbox[].They'realsoherejust

*forreference.

*/

#ifdefnotdef

/*initialpermutationIP*/

staticbyteip[]={

58,50,42,34,26,18,10,2,

60,52,44,36,28,20,12,4,

62,54,46,38,30,22,14,6,

64,56,48,40,32,24,16,8,

57,49,41,33,25,17,9,1,

59,51,43,35,27,19,11,3,

61,53,45,37,29,21,13,5,

63,55,47,39,31,23,15,7

};

/*finalpermutationIP^-1*/

staticbytefp[]={

40,8,48,16,56,24,64,32,

39,7,47,15,55,23,63,31,

38,6,46,14,54,22,62,30,

37,5,45,13,53,21,61,29,

36,4,44,12,52,20,60,28,

35,3,43,11,51,19,59,27,

34,2,42,10,50,18,58,26,

33,1,41,9,49,17,57,25

};

/*expansionoperationmatrix*/

staticbyteei[]={

32,1,2,3,4,5,

4,5,6,7,8,9,

8,9,10,11,12,13,

12,13,14,15,16,17,

16,17,18,19,20,21,

20,21,22,23,24,25,

24,25,26,27,28,29,

28,29,30,31,32,1

};

/*The(in)famousS-boxes*/

staticbytesbox[8][64]={

/*S1*/

14,4,13,1,2,15,11,8,3,10,6,12,5,9,0,7,

0,15,7,4,14,2,13,1,10,6,12,11,9,5,3,8,

4,1,14,8,13,6,2,11,15,12,9,7,3,10,5,0,

15,12,8,2,4,9,1,7,5,11,3,14,10,0,6,13,

/*S2*/

15,1,8,14,6,11,3,4,9,7,2,13,12,0,5,10,

3,13,4,7,15,2,8,14,12,0,1,10,6,9,11,5,

0,14,7,11,10,4,13,1,5,8,12,6,9,3,2,15,

13,8,10,1,3,15,4,2,11,6,7,12,0,5,14,9,

/*S3*/

10,0,9,14,6,3,15,5,1,13,12,7,11,4,2,8,

13,7,0,9,3,4,6,10,2,8,5,14,12,11,15,1,

13,6,4,9,8,15,3,0,11,1,2,12,5,10,14,7,

1,10,13,0,6,9,8,7,4,15,14,3,11,5,2,12,

/*S4*/

7,13,14,3,0,6,9,10,1,2,8,5,11,12,4,15,

13,8,11,5,6,15,0,3,4,7,2,12,1,10,14,9,

10,6,9,0,12,11,7,13,15,1,3,14,5,2,8,4,

3,15,0,6,10,1,13,8,9,4,5,11,12,7,2,14,

/*S5*/

2,12,4,1,7,10,11,6,8,5,3,15,13,0,14,9,

14,11,2,12,4,7,13,1,5,0,15,10,3,9,8,6,

4,2,1,11,10,13,7,8,15,9,12,5,6,3,0,14,

11,8,12,7,1,14,2,13,6,15,0,9,10,4,5,3,

/*S6*/

12,1,10,15,9,2,6,8,0,13,3,4,14,7,5,11,

10,15,4,2,7,12,9,5,6,1,13,14,0,11,3,8,

9,14,15,5,2,8,12,3,7,0,4,10,1,13,11,6,

4,3,2,12,9,5,15,10,11,14,1,7,6,0,8,13,

/*S7*/

4,11,2,14,15,0,8,13,3,12,9,7,5,10,6,1,

13,0,11,7,4,9,1,10,14,3,5,12,2,15,8,6,

1,4,11,13,12,3,7,14,10,15,6,8,0,5,9,2,

6,11,13,8,1,4,10,7,9,5,0,15,14,2,3,12,

/*S8*/

13,2,8,4,6,15,11,1,10,9,3,14,5,0,12,7,

1,15,13,8,10,3,7,4,12,5,6,11,0,14,9,2,

7,11,4,1,9,12,14,2,0,6,10,13,15,3,5,8,

2,1,14,7,4,10,8,13,15,12,9,0,3,5,6,11

};

/*32--boxes*/

staticbytep32i[]={

16,7,20,21,

29,12,28,17,

1,15,23,26,

5,18,31,10,

2,8,24,14,

32,27,3,9,

19,13,30,6,

22,11,4,25

};

#endif

/*permutedchoicetable(key)*/

staticconstbytepc1[]={

57,49,41,33,25,17,9,

1,58,50,42,34,26,18,

10,2,59,51,43,35,27,

19,11,3,60,52,44,36,

63,55,47,39,31,23,15,

7,62,54,46,38,30,22,

14,6,61,53,45,37,29,

21,13,5,28,20,12,4

};

/*numberleftrotationsofpc1*/

staticconstbytetotrot[]={

1,2,4,6,8,10,12,14,15,17,19,21,23,25,27,28

};

/*permutedchoicekey(table)*/

staticconstbytepc2[]={

14,17,11,24,1,5,

3,28,15,6,21,10,

23,19,12,4,26,8,

16,7,27,20,13,2,

41,52,31,37,47,55,

30,40,51,45,33,48,

44,49,39,56,34,53,

46,42,50,36,29,32

};

/*EndofDES-definedtables*/

/*bit0isleft-mostinbyte*/

staticconstintbytebit[]={

0200,0100,040,020,010,04,02,01

};

/*Setkey(initializekeyschelearray)*/

DES::DES(constbyte*key,CipherDirdir)

:k(32)

{

SecByteBlockbuffer(56+56+8);

byte*constpc1m=buffer;/*placetomodifypc1into*/

byte*constpcr=pc1m+56;/*placetorotatepc1into*/

byte*constks=pcr+56;

registerinti,j,l;

intm;

for(j=0;j<56;j++){/*convertpc1tobitsofkey*/

l=pc1[j]-1;/*integerbitlocation*/

m=l&07;/*findbit*/

pc1m[j]=(key[l>>3]&/*findwhichkeybytelisin*/

bytebit[m])/*andwhichbitofthatbyte*/

?1:0;/*andstore1-bitresult*/

}

for(i=0;i<16;i++){/*keychunkforeachiteration*/

memset(ks,0,8);/*Clearkeyschele*/

for(j=0;j<56;j++)/*rotatepc1therightamount*/

pcr[j]=pc1m[(l=j+totrot[i])<(j<28?28:56)?l:l-28];

/**/

for(j=0;j<48;j++){/*selectbitsindivially*/

/*checkbitthatgoestoks[j]*/

if(pcr[pc2[j]-1]){

/*maskitinifit'sthere*/

l=j%6;

ks[j/6]|=bytebit[l]>>2;

}

}

/*Nowconverttoodd/eveninterleavedformforuseinF*/

k[2*i]=((word32)ks[0]<<24)

|((word32)ks[2]<<16)

|((word32)ks[4]<<8)

|((word32)ks[6]);

k[2*i+1]=((word32)ks[1]<<24)

|((word32)ks[3]<<16)

|((word32)ks[5]<<8)

|((word32)ks[7]);

}

if(dir==DECRYPTION)//reversekeyscheleorder

for(i=0;i<16;i+=2)

{

std::swap(k[i],k[32-2-i]);

std::swap(k[i+1],k[32-1-i]);

}

}

/**/

/*Ccodeonlyinportableversion*/

//RichardOuterbridge'sinitialpermutationalgorithm

/*

inlinevoidIPERM(word32&left,word32&right)

{

word32work;

work=((left>>4)^right)&0x0f0f0f0f;

right^=work;

left^=work<<4;

work=((left>>16)^right)&0xffff;

right^=work;

left^=work<<16;

work=((right>>2)^left)&0x33333333;

left^=work;

right^=(work<<2);

work=((right>>8)^left)&0xff00ff;

left^=work;

right^=(work<<8);

right=rotl(right,1);

work=(left^right)&0xaaaaaaaa;

left^=work;

right^=work;

left=rotl(left,1);

}

inlinevoidFPERM(word32&left,word32&right)

{

word32work;

right=rotr(right,1);

work=(left^right)&0xaaaaaaaa;

left^=work;

right^=work;

left=rotr(left,1);

work=((left>>8)^right)&0xff00ff;

right^=work;

left^=work<<8;

work=((left>>2)^right)&0x33333333;

right^=work;

left^=work<<2;

work=((right>>16)^left)&0xffff;

left^=work;

right^=work<<16;

work=((right>>4)^left)&0x0f0f0f0f;

left^=work;

right^=work<<4;

}

*/

//WeiDai''sinitialpermutation

//algorithm,

//(likeinMSVC)

inlinevoidIPERM(word32&left,word32&right)

{

word32work;

right=rotl(right,4U);

work=(left^right)&0xf0f0f0f0;

left^=work;

right=rotr(right^work,20U);

work=(left^right)&0xffff0000;

left^=work;

right=rotr(right^work,18U);

work=(left^right)&0x33333333;

left^=work;

right=rotr(right^work,6U);

work=(left^right)&0x00ff00ff;

left^=work;

right=rotl(right^work,9U);

work=(left^right)&0xaaaaaaaa;

left=rotl(left^work,1U);

right^=work;

}

inlinevoidFPERM(word32&left,word32&right)

{

word32work;

right=rotr(right,1U);

work=(left^right)&0xaaaaaaaa;

right^=work;

left=rotr(left^work,9U);

work=(left^right)&0x00ff00ff;

right^=work;

left=rotl(left^work,6U);

work=(left^right)&0x33333333;

right^=work;

left=rotl(left^work,18U);

work=(left^right)&0xffff0000;

right^=work;

left=rotl(left^work,20U);

work=(left^right)&0xf0f0f0f0;

right^=work;

left=rotr(left^work,4U);

}

//

voidDES::ProcessBlock(constbyte*inBlock,byte*outBlock)const

{

word32l,r,work;

#ifdefIS_LITTLE_ENDIAN

l=byteReverse(*(word32*)inBlock);

r=byteReverse(*(word32*)(inBlock+4));

#else

l=*(word32*)inBlock;

r=*(word32*)(inBlock+4);

#endif

IPERM(l,r);

constword32*kptr=k;

for(unsignedi=0;i<8;i++)

{

work=rotr(r,4U)^kptr[4*i+0];

l^=Spbox[6][(work)&0x3f]

^Spbox[4][(work>>8)&0x3f]

^Spbox[2][(work>>16)&0x3f]

^Spbox[0][(work>>24)&0x3f];

work=r^kptr[4*i+1];

l^=Spbox[7][(work)&0x3f]

^Spbox[5][(work>>8)&0x3f]

^Spbox[3][(work>>16)&0x3f]

^Spbox[1][(work>>24)&0x3f];

work=rotr(l,4U)^kptr[4*i+2];

r^=Spbox[6][(work)&0x3f]

^Spbox[4][(work>>8)&0x3f]

^Spbox[2][(work>>16)&0x3f]

^Spbox[0][(work>>24)&0x3f];

work=l^kptr[4*i+3];

r^=Spbox[7][(work)&0x3f]

^Spbox[5][(work>>8)&0x3f]

^Spbox[3][(work>>16)&0x3f]

^Spbox[1][(work>>24)&0x3f];

}

FPERM(l,r);

#ifdefIS_LITTLE_ENDIAN

*(word32*)outBlock=byteReverse(r);

*(word32*)(outBlock+4)=byteReverse(l);

#else

*(word32*)outBlock=r;

*(word32*)(outBlock+4)=l;

#endif

}

voidDES_EDE_Encryption::ProcessBlock(byte*inoutBlock)const

{

e.ProcessBlock(inoutBlock);

d.ProcessBlock(inoutBlock);

e.ProcessBlock(inoutBlock);

}

voidDES_EDE_Encryption::ProcessBlock(constbyte*inBlock,byte*outBlock)const

{

e.ProcessBlock(inBlock,outBlock);

d.ProcessBlock(outBlock);

e.ProcessBlock(outBlock);

}

voidDES_EDE_Decryption::ProcessBlock(byte*inoutBlock)const

{

d.ProcessBlock(inoutBlock);

e.ProcessBlock(inoutBlock);

d.ProcessBlock(inoutBlock);

}

voidDES_EDE_Decryption::ProcessBlock(constbyte*inBlock,byte*outBlock)const

{

d.ProcessBlock(inBlock,outBlock);

e.ProcessBlock(outBlock);

d.ProcessBlock(outBlock);

}

voidTripleDES_Encryption::ProcessBlock(byte*inoutBlock)const

{

e1.ProcessBlock(inoutBlock);

d.ProcessBlock(inoutBlock);

e2.ProcessBlock(inoutBlock);

}

voidTripleDES_Encryption::ProcessBlock(constbyte*inBlock,byte*outBlock)const

{

e1.ProcessBlock(inBlock,outBlock);

d.ProcessBlock(outBlock);

e2.ProcessBlock(outBlock);

}

voidTripleDES_Decryption::ProcessBlock(byte*inoutBlock)const

{

d1.ProcessBlock(inoutBlock);

e.ProcessBlock(inoutBlock);

d2.ProcessBlock(inoutBlock);

}

voidTripleDES_Decryption::ProcessBlock(constbyte*inBlock,byte*outBlock)const

{

d1.ProcessBlock(inBlock,outBlock);

e.ProcessBlock(outBlock);

d2.ProcessBlock(outBlock);

}

NAMESPACE_END

程序运行如下:

⑨ des是什么算法

DES算法为密码体制中的对称密码体制,又被称为美国数据加密标准,是1972年美国IBM公司研制的对称密码体制加密算法。明文按64位进行分组,密钥长64位,密钥事实上是56位参与DES运算(第8、16、24、32、40、48、56、64位是校验位,使得每个密钥都有奇数个1)分组后的明文组和56位的密钥按位替代或交换的方法形成密文组的加密方法。
其入口参数有三个:key、data、mode。key为加密解密使用的密钥,data为加密解密的数据,mode为其工作模式。当模式为加密模式时,明文按照64位进行分组,形成明文组,key用于对数据加密,当模式为解密模式时,key用于对数据解密。实际运用中,密钥只用到了64位中的56位,这样才具有高的安全性。

⑩ 数据加密算法的数据加密标准DES

DES的原始思想可以参照二战德国的恩尼格玛机,其基本思想大致相同。传统的密码加密都是由古代的循环移位思想而来,恩尼格玛机在这个基础之上进行了扩散模糊。但是本质原理都是一样的。现代DES在二进制级别做着同样的事:替代模糊,增加分析的难度。 攻击 DES 的主要形式被称为蛮力的或穷举,即重复尝试各种密钥直到有一个符合为止。如果 DES 使用 56 位的密钥,则可能的密钥数量是 2 的 56 次方个。随着计算机系统能力的不断发展,DES 的安全性比它刚出现时会弱得多,然而从非关键性质的实际出发,仍可以认为它是足够的。不过 ,DES 现在仅用于旧系统的鉴定,而更多地选择新的加密标准 — 高级加密标准(Advanced Encryption Standard,AES)。
新的分析方法有差分分析法和线性分析法两种 本期Crackme用到MD5及DES两种加密算法,难度适中。这次我们重点来看一下DES的加密过程及注册算法过程。用调试器载入程序,下GegDlgItemTextA断点,可以定位到下面代码,我们先来看一下整个crackme的注册过程:
由于代码分析太长,故收录到光盘中,请大家对照着分析(请见光盘“code1.doc”)
从上面分析可以看出,注册过程是类似:f(机器码,注册码)式的两元运算。机器码是经过md5算法得到的中间16位值,注册码是经过DES解密过程取得16位注册码,然后两者比较,如相等,则注册成功。机器码的运算过程可以参照上一期的MD5算法来理解。下面重点来说一下注册码DES的运算过程。
1、密钥处理过程:一般进行加解密过程都要初始化密钥处理。我们可以跟进004023FA CALL Crackme1.00401A40这个call,可以看到如下代码:
…(省略)...
00401A4D LEA ECX,DWORD PTR DS:[ECX]
00401A50 /MOV EDX,EAX
00401A52 |SHR EDX,3
00401A55 |MOV DL,BYTE PTR DS:[EDX+ESI]
00401A58 |MOV CL,AL
00401A5A |AND CL,7
00401A5D |SAR DL,CL
00401A5F |AND DL,1
00401A62 |MOV BYTE PTR DS:[EAX+417DA0],DL
00401A68 |INC EAX
00401A69 |CMP EAX,40这里比较是否小于64
00401A6C JL SHORT Crackme1.00401A50
以上过程就是去掉密钥各第八位奇偶位。
…(省略)...
00401AB0 |MOV DL,BYTE PTR DS:[ECX+417D9F]
00401AB6 |MOV BYTE PTR DS:[EAX+417BA3],DL
00401ABC |ADD EAX,4
00401ABF |CMP EAX,38这里进行密钥变换
…(省略)...
00401BFF ||MOVSX ECX,BYTE PTR DS:[EAX+412215]
00401C06 ||MOV CL,BYTE PTR DS:[ECX+417D9F]
00401C0C ||MOV BYTE PTR DS:[EAX+417BA5],CL
00401C12 ||ADD EAX,6
00401C15 ||CMP EAX,30这里产生48位的子密钥
00401C18 |JL SHORT Crackme1.00401BA0
00401C1A |MOV EAX,DWORD PTR SS:[ESP+14]
00401C1E |MOV EDI,EAX
00401C20 |MOV ECX,0C
00401C25 |MOV ESI,Crackme1.00417BA0
00401C2A |REP MOVS DWORD PTR ES:[EDI],DWORD PTR D>
00401C2C |MOV EDI,DWORD PTR SS:[ESP+10]
00401C30 |ADD EAX,30下一组子密钥
00401C33 |INC EDI
00401C34 |CMP EAX,Crackme1.00417B90这里进行16次的生成子密钥过程
00401C39 |MOV DWORD PTR SS:[ESP+10],EDI
…(省略)...
可以看到8位密钥为:1,9,8,0,9,1,7,0
2、对数据处理的过程,跟进004024C7 CALL Crackme1.00402050,到如下代码:
00402072 |MOV BYTE PTR DS:[EAX+417E30],DL
00402078 |INC EAX
00402079 |CMP EAX,40这里取得64位数据
0040207C JL SHORT Crackme1.00402060
…(省略)...
004020C6 |MOV BYTE PTR DS:[EAX+417BA3],DL
004020CC |ADD EAX,4
004020CF |CMP EAX,40进行第一次变换
004020D2 JL SHORT Crackme1.00402080
004020D4 MOV AL,BYTE PTR SS:[ESP+20]
004020D8 TEST AL,AL
004020DA MOV ECX,10
…(省略)...
00402191 MOV EBP,DWORD PTR DS:[415094] ; Crackme1.00417E30
00402197 SUB EAX,EBP这里对变换后的数据分为两部分
00402199 MOV DWORD PTR SS:[ESP+10],EAX
0040219D MOV DWORD PTR SS:[ESP+20],Crackme1.00417B60
004021A5 /MOV EAX,DWORD PTR SS:[ESP+20]
004021A9 |MOV ECX,8
004021AE |MOV ESI,EBP
004021B0 |MOV EDI,Crackme1.00417E10
004021B5 |PUSH EAX这里用上面生成的子密钥来解密数据
004021B6 |MOV EBX,EBP
…(省略)...
004021FF |SUB EAX,30下一个子密钥
00402202 |CMP EAX,Crackme1.00417890这里将循环16次,典型的DES加解密过程
00402207 |MOV ECX,8
0040220C |MOV ESI,Crackme1.00417E10
00402211 |REP MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI>
…(省略)...
0040225A |MOV BYTE PTR DS:[EAX+417BA2],DL
00402260 |MOV DL,BYTE PTR DS:[ECX+417E2F]
00402266 |MOV BYTE PTR DS:[EAX+417BA3],DL
0040226C |ADD EAX,4
0040226F |CMP EAX,40这里是未置换
00402272 JL SHORT Crackme1.00402220
00402274 MOV EBP,DWORD PTR SS:[ESP+18]
00402278 MOV ECX,10
0040227D MOV ESI,Crackme1.00417BA0
…(省略)...
有兴趣的读者可以参考DES算法来理解上面的过程。 一.安全性比较高的一种算法,目前只有一种方法可以破解该算法,那就是穷举法.
二.采用64位密钥技术,实际只有56位有效,8位用来校验的.譬如,有这样的一台PC机器,它能每秒计算一百万次,那么256位空间它要穷举的时间为2285年.所以这种算法还是比较安全的一种算法.
TripleDES。该算法被用来解决使用 DES 技术的 56 位时密钥日益减弱的强度,其方法是:使用两个独立密钥对明文运行 DES 算法三次,从而得到 112 位有效密钥强度。TripleDES 有时称为 DESede(表示加密、解密和加密这三个阶段)。

阅读全文

与des算法测试相关的资料

热点内容
安卓手机的游戏怎么打开 浏览:198
pdf扫描转文字 浏览:530
微机室里面的云服务器 浏览:106
excel能编程吗 浏览:929
android系统框架的介绍 浏览:945
无盘系统服务器如何配置 浏览:836
背负贷款如何缓解压力 浏览:82
linux获取日期时间 浏览:881
搬砖问题最合适的算法 浏览:446
小米安卓机密码忘记了如何解锁 浏览:910
产电plc编程手册 浏览:761
vscodephp 浏览:535
阿里云linux桌面 浏览:754
php二维数组搜索 浏览:116
ps快捷命令工具箱 浏览:253
c4d教程pdf 浏览:462
linux集群安装配置 浏览:154
stc单片机介绍 浏览:902
如何解压失恋的人 浏览:493
安卓微信滞后怎么办 浏览:942