欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > DOC文档下载  

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

    • 资源ID:4840526       资源大小:50KB        全文页数:13页
    • 资源格式: DOC        下载积分:10金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要10金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

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

    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进行处理的,下面详细说明了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=0x9e3779b9对于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)的。输出的密文是在寄存器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 分组密钥算法 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; /主密钥个数*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 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 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+)/函数*/void generateChildKey(unsigned char* KeyK,FOURBYTEINT* ChildKeyS)/const double e = 2.718281828459;/const double Phia = 1.618033988749;int PW = 0xB7E15163;/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);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把主密钥变换为4字节单位:n);for (i=0;ic;i+)/16进制输出gaidongprintf(%.8X ,Li);printf(nn);/产生子密钥,存储在ChildKeyS中for(i=0;i3*t;i+)X = ChildKeySA = ROTL(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(%.8X ,ChildKeySi);printf(nn);/*5、 加密函数加密函数*/void Encipher(FOURBYTEINT * In,FOURBYTEINT * Out,FOURBYTEINT* S); /8bit=byte 16=b 主密钥共16字节FOURBYTEINT Source=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);for(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( );printf(%.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;/密钥字节个数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(TWOBYTEINT* 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、 初始密钥产生函数生成一个初始的长度为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 double 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);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 = ROTL(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;for(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);/生成初始密钥generateChildKey(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);

    注意事项

    本文(c语言实现RC5分组密钥算法的应用.doc)为本站会员(sccc)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开