c语言实现RC5分组密钥算法的应用.doc
《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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 实现 RC5 分组 密钥 算法 应用
![提示](https://www.31ppt.com/images/bang_tan.gif)
链接地址:https://www.31ppt.com/p-4840526.html