c语言实现RC5分组密钥算法的应用.doc

上传人:sccc 文档编号:4840526 上传时间:2023-05-18 格式:DOC 页数:13 大小:50KB
返回 下载 相关 举报
c语言实现RC5分组密钥算法的应用.doc_第1页
第1页 / 共13页
c语言实现RC5分组密钥算法的应用.doc_第2页
第2页 / 共13页
c语言实现RC5分组密钥算法的应用.doc_第3页
第3页 / 共13页
c语言实现RC5分组密钥算法的应用.doc_第4页
第4页 / 共13页
c语言实现RC5分组密钥算法的应用.doc_第5页
第5页 / 共13页
点击查看更多>>
资源描述

《c语言实现RC5分组密钥算法的应用.doc》由会员分享,可在线阅读,更多相关《c语言实现RC5分组密钥算法的应用.doc(13页珍藏版)》请在三一办公上搜索。

1、c语言实现RC5分组密钥算法的应用RC5分组密码算法是1994由麻萨诸塞技术研究所的Ronald L. Rivest教授发明的,并由RSA实验室分析。它是参数可变的分组密码算法,三个可变的参数是:分组大小、密钥大小和加密轮数。在此算法中使用了三种运算:异或、加和循环。简介RC5是种比较新的算法,Rivest设计了RC5的一种特殊的实现方式,因此RC5算法有一个面向字的结构:RC5-w/r/b,这里w是字长其值可以是16、32或64对于不同的字长明文和密文块的分组长度为2w位,r是加密轮数,b是密钥字节长度。由于RC5一个分组长度可变的密码算法,为了便于说明在本文中主要是针对64位的分组w=32

2、进行处理的,下面详细说明了RC5加密解密的处理过程:加密解密1、创建密钥组RC5算法加密时使用了2r+2个密钥相关的的32位字: ,这里r表示加密的轮数。创建这个密钥组的过程是非常复杂的但也是直接的,首先将密钥字节拷贝到32位字的数组L中(此时要注意处理器是little-endian顺序还是big-endian顺序),如果需要,最后一个字可以用零填充。然后利用线性同余发生器模2初始化数组S:对于i=1到2(r+1)-1: (本应模 ,本文中令w=32)其中对于16位字32位分组的RC5,P=0xb7e1 Q=0x9e37对于32位字和64位分组的RC5,P=0xb7e15163 Q=0x9e3

3、779b9对于64位字和128位分组,P=0xb7151628aed2a6b Q=0x9e3779b97f4a7c15最后将L与S混合,混合过程如下:i=j=0A=B=0处理3n次(这里n是2(r+1)和c中的最大值,其中c表示输入的密钥字的个数)2、加密处理在创建完密钥组后开始进行对明文的加密,加密时,首先将明文分组划分为两个32位字:A和B(在假设处理器字节顺序是little-endian、w=32的情况下,第一个明文字节进入A的最低字节,第四个明文字节进入A的最高字节,第五个明文字节进入B的最低字节,以此类推),其中操作符表示循环左移,加运算是模 (本应模 ,本文中令w=32)的。输出的

4、密文是在寄存器A和B中的内容3、解密处理解密也是很容易的,把密文分组划分为两个字:A和B(存储方式和加密一样),这里符合是循环右移,减运算也是模 (本应模 ,本文中令w=32)的。RSA试验室花费了相当的时间来分析64位分组的RC5算法,在5轮后统计特性看起来非常好。在8轮后,每一个明文位至少影响一个循环。对于5轮的RC5,差分攻击需要 个选择明文;对10轮需要 个;对于12轮需要 个;对15轮需要 个。而对于64位的分组只有 个可能的明文,所以对于15轮或以上的RC5的差分攻击是失败的。在6轮后线性分析就是安全的了,Rivest推荐至少12轮,甚至可能是16轮。这个轮数可以进行选择。RC5

5、分组密钥算法 C语言实现cpp view plain copy/*RC5 C代码实现w/r/b=32/12/16基本的RC5 3种算法组成,即密钥扩展算法、加密算法和解密算法。故RC5的C语言实现也由以下几个部分构成。1、 参数的定义*/#include stdlib.h#include stdio.h#include string.h#include math.hint w=32;/字长 32bit 4字节int r=12;/12;/加密轮数12int b=16;/主密钥(字节为单位8bit)个数 这里有16个int t=26;/2*r+2=12*2+2=26int c=4; /主密钥个数*

6、8/w = 16*8/32typedef unsigned long int FOURBYTEINT;/四字节typedef unsigned short int TWOBYTEINT;/2字节typedef unsigned char BYTE;void IniTIalKey(unsigned char* KeyK,int b);void generateChildKey(unsigned char* KeyK,FOURBYTEINT* ChildKeyS);void Encipher(FOURBYTEINT* In,FOURBYTEINT* Out,FOURBYTEINT* S);void

7、 Decipher(FOURBYTEINT* In,FOURBYTEINT* Out,FOURBYTEINT* S);#define NoOfData 4/*2、循环移位函数由于在生成子密钥,加密,解密过程中都要进行循环移位,故要首先定义循环以为函数。* 循环左移和右移函数* x : 被循环的数* y : 将要循环的位数*/#define ROTL(x,y) (x)(y(w-1) | (x)(w-(y(w-1)#define ROTR(x,y) (x)(y(w-1) | (x)(w-(y(w-1)/*3、 初始密钥产生函数生成一个初始的长度为b字节的密钥。产生初始密钥的函数*/void Ini

8、TIalKey(unsigned char* KeyK,int b)int i,j;int inTISeed=3;for( i=0;ib;i+)/初始化KeyKi=0;KeyK0=inTISeed;printf(初始主密钥(16字节共128位):%.2lx ,KeyK0);for(j=1;jb;j+)/函数*/void generateChildKey(unsigned char* KeyK,FOURBYTEINT* ChildKeyS)/const double e = 2.718281828459;/const double Phia = 1.618033988749;int PW = 0

9、xB7E15163;/0xb7e1;int QW = 0x9E3779B9;/0x9e37;/genggaiint i;int u =w/8;/ b/8;FOURBYTEINT A,B,X,Y;FOURBYTEINT L4; /c=16*8/32A=B=X=Y=0;/初始化数组SChildKeyS0=PW;printf(n初始子密钥(没有主密钥的参与):n%.8X , ChildKeyS0);for (i=1;it;i+) /t=26if(i%13=0)printf(n);ChildKeySi=(ChildKeySi-1+ QW);printf(%.8X , ChildKeySi);print

10、f(n);/将K数组转换为L数组for(i=0;ic;i+)/初始化L数组c=8Li=0;for (i=b-1;i!=-1; i-)/b=16 转换主密钥数组(16个 单位为8bit)为L数组(8个单位为16bit),数组L每一元素长为16bit,数组K每一元素长为8bitLi/u = (Li/u8)+KeyKi;printf(n把主密钥变换为4字节单位:n);for (i=0;ic;i+)/16进制输出gaidongprintf(%.8X ,Li);printf(nn);/产生子密钥,存储在ChildKeyS中for(i=0;i3*t;i+)X = ChildKeySA = ROTL(Chi

11、ldKeySA+X+Y,3);A = (A+1) % t;Y = LB = ROTL(LB+X+Y,(X+Y);B = (B+1) % c;printf(生成的子密钥(初始主密钥参与和初始子密钥也参与):);for (i=0;it;i+)/16进制输出if(i%13=0)printf(n);printf(%.8X ,ChildKeySi);printf(nn);/*5、 加密函数加密函数*/void Encipher(FOURBYTEINT * In,FOURBYTEINT * Out,FOURBYTEINT* S); /8bit=byte 16=b 主密钥共16字节FOURBYTEINT S

12、ource=0xfffff2fe,0x56211681,0xee111560,0x44575555; /测试明文FOURBYTEINT DestNoOfData; /用来存储密文FOURBYTEINT DataNoOfData=0; /用来存储解密后的密文InitialKey(KeyK,b);/生成初始密钥generateChildKey(KeyK,ChildKeyS); /根据初始密钥生成子密钥printf(加密以前的明文:);for (k=0;kNoOfData;k+)if (k%2=0)printf( );printf(%.8X ,Sourcek); /16进制输出printf(n);f

13、or(k=0;k26;k+) /*有问题ChildKey1k=ChildKeySk;/如果此处自定义简单的数值为加密密钥,则可以解密出密文Encipher(Source,Dest,ChildKey1); /加密printf(n);printf(加密以后的密文:);for (k=0;kNoOfData;k+)if (k%2=0)printf( );printf(%.8X ,Destk);printf(n);Decipher(Dest,Data,ChildKey1); /解密printf(解密以后的明文:);for (k=0;kNoOfData;k+)if (k%2=0)printf( );pri

14、ntf(%.8X ,Datak);printf(n);/printf(sizeof unsigned short int: %d,sizeof(unsigned short int);/ system(pausen);/*RC5 C代码实现w/r/b=16/12/16基本的RC5 3种算法组成,即密钥扩展算法、加密算法和解密算法。故RC5的C语言实现也由以下几个部分构成。1、 参数的定义*/#include stdlib.h#include stdio.h#include string.h#include math.hint w=16;/字长int r=10;/12;/轮数12int b=16

15、;/密钥字节个数int t=26;/2*r+2=12*2+2=26int c=8; /b*8/w = 16*8/16/typedef unsigned long int FOURBYTEINT;/四字节typedef unsigned short int TWOBYTEINT;/2字节typedef unsigned char BYTE;void InitialKey(unsigned char* KeyK,int b);void generateChildKey(unsigned char* KeyK,TWOBYTEINT* ChildKeyS);void Encipher(TWOBYTEI

16、NT* In,TWOBYTEINT* Out,TWOBYTEINT* S);void Decipher(TWOBYTEINT* In,TWOBYTEINT* Out,TWOBYTEINT* S);#define NoOfData 4/*2、循环移位函数由于在生成子密钥,加密,解密过程中都要进行循环移位,故要首先定义循环以为函数。* 循环左移和右移函数* x : 被循环的数* y : 将要循环的位数*/#define ROTL(x,y) (x)(y(w-1) | (x)(w-(y(w-1)#define ROTR(x,y) (x)(y(w-1) | (x)(w-(y(w-1)/*3、 初始密钥产

17、生函数生成一个初始的长度为b字节的密钥。产生初始密钥的函数*/void InitialKey(unsigned char* KeyK,int b)int i,j;int intiSeed=3;for( i=0;ib;i+)/初始化KeyKi=0;KeyK0=intiSeed;printf(初始主密钥(16字节共128位):%.2lx ,KeyK0);for(j=1;jb;j+)/生成KeyK generateChildKey(unsigned char* KeyK,TWOBYTEINT* ChildKeyS)/const double e = 2.718281828459;/const dou

18、ble Phia = 1.618033988749;int PW = 0xb7e1;int QW = 0x9e37;/genggaiint i;int u = w/8;TWOBYTEINT A,B,X,Y;TWOBYTEINT L8; /c=b*8/w=8A=B=X=Y=0;/初始化数组SChildKeyS0=PW;printf(n初始子密钥(没有主密钥的参与):n%.4lx , ChildKeyS0);for (i=1;it;i+) /t=26if(i%13=0)printf(n);ChildKeySi=(ChildKeySi-1+ QW);printf(%.4X , ChildKeySi)

19、;printf(n);/将K数组转换为L数组for(i=0;ic;i+)/初始化L数组c=8Li=0;for (i=b-1;i!=-1; i-)/b=16 转换主密钥数组(16个 单位为8bit)为L数组(8个单位为16bit),数组L每一元素长为16bit,数组K每一元素长为8bitLi/u = (Li/u8)+KeyKi;printf(n把主密钥变换为2字节单位:n);for (i=0;ic;i+)/16进制输出gaidongprintf(%.4X ,Li);printf(nn);/产生子密钥,存储在ChildKeyS中for(i=0;i3*t;i+)X = ChildKeySA = RO

20、TL(ChildKeySA+X+Y,3);A = (A+1) % t;Y = LB = ROTL(LB+X+Y,(X+Y);B = (B+1) % c;printf(生成的子密钥(初始主密钥参与和初始子密钥也参与):);for (i=0;it;i+)/16进制输出if(i%13=0)printf(n);printf(%.4X ,ChildKeySi);printf(nn);/*5、 加密函数加密函数*/void Encipher(TWOBYTEINT * In,TWOBYTEINT * Out,TWOBYTEINT* S)TWOBYTEINT X,Y; /定义两个16位存储器int i,j;f

21、or(j=0 bb=0xffffFFF2;unsigned int cc;int k;TWOBYTEINT ChildKeyS2*12+2; / r=12 子密钥个数为26TWOBYTEINT ChildKey126; /BYTE KeyK16; /8bit=byte 16=b 主密钥共16字节TWOBYTEINT Source=25142,1681,11561,5555; /测试明文TWOBYTEINT DestNoOfData; /用来存储密文TWOBYTEINT DataNoOfData=0; /用来存储解密后的密文InitialKey(KeyK,b);/生成初始密钥generateCh

22、ildKey(KeyK,ChildKeyS); /根据初始密钥生成子密钥printf(加密以前的明文:);for (k=0;kNoOfData;k+)printf(%.4lX ,Sourcek); /16进制输出printf(n);for(k=0;k26;k+) /*有问题ChildKey1k=ChildKeySk;/如果此处自定义简单的数值为加密密钥,则可以解密出密文/ printf(%.4lX ,ChildKey1k);Encipher(Source,Dest,ChildKey1); /加密printf(n);printf(加密以后的密文:);for (k=0;kNoOfData;k+)printf(%.4lX ,Destk);printf(n);Decipher(Dest,Data,ChildKey1); /解密printf(解密以后的明文:);for (k=0;kNoOfData;k+)printf(%.4lX ,Datak);printf(n);cc=aa+bb;/ printf(n%16Xn,cc);/ printf(%8Xn,(cc-aa);/printf(sizeof unsigned short int: %d,sizeof(unsigned short int);/ system(pausen);

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 建筑/施工/环境 > 农业报告


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号