文档详情

RC5加密算法论文

gg****m
实名认证
店铺
DOC
65.05KB
约6页
文档ID:224635849
RC5加密算法论文_第1页
1/6

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“到2(r+l)-l:(本应模,本文中令w=32)其中对于16位字32位分组的RC5, P=0xb7el Q=0x9e37对于 32 位字和 64 位分组的 RC5, P=0xb7el5163 Q=0x9e3779b9对于 64 位字和 128 位分组,P=0xb7151628aed2a6b Q=0x9e3779b97f4a7cl5最后将L与S混合,混合过程如下:i=j=0A=B=0处理3n次(这里n是2(r+l)和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轮这个轮数可以进行选择rfc 2040文档中列出了 RC5算法密钥生成和加密实现的C代码,在此笔者参照文档中定义 的算法结构,编写了用于对密文解密的程序代码(此代码经多次测试运行良好),供读者参 考1>补充了两个个宏定义:#define SHLl(x,s”w) ((RC5_W0RD)((x)((w)-((s)&R0T_MASK))))#define ROTR(x,s,w) ((RC5_W0RD)(SHRl((x)z(s))|SHLl((x),(s),(w))))2、解密函数定义如下:void RC5_Block_Decrypt (RC5_WORD *S,int R,char *in,char *out){int i;RC5_WORD AZB;A = in[0] &OxFF;A+=(in[l] &OxFF) 8;A+=(in[2] &OxFF) 16;A+=(in[3] &OxFF) 24;B = in[4] &OxFF;B+= (in[5] & OxFF) 8;B+=(in[6] & OxFF) 16;B+=(in[7] & OxFF) 24;for(i=R;i>=l;i-){B=ROTR((B-S[2*i+1])AW);B=BAA;A=ROTR((A-S[2*i]),B,W);A=AAB;}B=B-S[1];A=A-S[0];out[0] = (A 0) & OxFF;out[l] = (A 8) & OxFF;out⑵二(A 16) & OxFF;ouU3] = (A 24) & OxFF;out[4] = (B0) & OxFF;out⑸= (B8) & OxFF;out[6] = (B 16) & OxFF;out[7] = (B 24) & OxFF;return;}/*End of RC5_Block_Decrypt */int RC5_CBC_Decrypt_lnit (pAIg, pKey)rc5CBCAIg *pAlg;rc5UserKey *pKey;if ((pAIg == ((rcSCBCAIg *) 0)) 11(pKey == ((rc5UserKey *) 0))) return (0);RC5_Key_Expand (pKey->keyLength, pKey->keyBytes/pAlg->R/ pAlg->S);return (RC5_CBC_SetlV(pAlg, pAlg->l));}int RC5_CBC_Decrypt_Update(rc5CBCAIg *pAlg,int N,char *C,int *plainLen,char *P) {int plainindex,cipherindex,j;plainin dex=cipherl ndex=0;for(j=0;j {P[plainlndex]=pAlg->chainBlock[j];plainin dex++;}plainlndex=0;while(cipherlndex {if(pAlg->inputBlocklndex {pAIg->in putBlock[pAlg->in putBlockl ndex]二C[cipherlndex];pAlg->inputBlocklndex++;cipherl ndex++;}if(pAlg->inputBlocklndex==BB){pAIg->in putBlocklndex=0;RC5_Block_Decrypt (pAlg・>S,pAlg・>R,pAlg・>inputBlock,pAlg・>chainBlock);for(j=0;j {if(plainlndex P[plainlndex]A=pAlg->chainBlock[j];elseP[plainlndex]=C[cipherlndex-16+j]ApAlg->chainBlock[j];plainin dex++;}}}*plai nLen 二 plainindex;return (1);}/*End of RC5_CBC_Decrypt_Update*/以上的操作只是针对的一个明文分组的,对于分组加密算法有以下儿种比较常见的 分组密码模式:电子密码本(Electronic Code Book,, ECB)模式是使用分组密码算法的最明 显的方式,其使用方式是一个明文分组加密成一个密文分组,相同的明文分组永远被加密成 相同的密文分组,在理论上制造这样的一个密码本是可行的,但实际上要进行大量的预计算 耗费存储空间,最容易的运行模式是每个明文分组可被独立地进行加密,但受分组重放攻击; 密码分组链接模式(Cipher Block Chaining, CBC)模式中,明文被加密之前要与前面的密文 进行异或运算,如果前而的明文分组不同才能将完全相同的明文分组加密成不同的密文分组, 这会给密码分析者提供有用的线索,为了防止这种情况发生使用一个随机数据分组作为加密 的第一个分组叫作初始化向量(initialization Vector, IV),这样就可以把完全相同的信息加 密成不同的密文消息;密码反馈模式(Cipher-Feedback, CFB)是把分组密码算法用于自同 步序列密码的一种方法,在CBC模式下,整个数据分组在接收完之后才能进行加密,在此 模式下数据可以在比分组小的多的单元里进行处理;输出反馈模式(Output-Feedback, OFB) 是将分组密码用于同步序列密码运行的一种方法,它有一个很好的特性就是在明文存在前的 大部分工作可以离线进行。

以上几种模式中密码分组链接模式是在安全协议中使用的最为普 遍,在无线应用协议中安全层定义的分组加密算法都是CBC模式几大厂家如Nokia, Motorala, Erison的WAP的首选的分组加密算法就是RC5RC5加密解密算法的基本实现include "stdafx.h"# include#include #include #define UINT32 unsigned int#define INT32 int#define UINT16 unsigned short#define INT16 short#define UINT8 unsigned char#define INT8 char unsigned int subKey[25]; void generateSubKey() {UINT8 i;for(i=0;i<25;i++) subKey[i] = i;}void encrypt(UINT32 *PTextzUINT32 *CText){//进行加密UINT32 PData[l]; UINT32 CData[l];UINT32 tempDatal,tempData2,temp;UINT8 i;PData[0] = *PText;PText++;PData[l] = *PText;CData[O] = *CText;CText++;CData[l] = *CText;tempDatal = PData[O] + subKey[O]; tempData2 = PData[l] + subKey[l];for(i=l;i<=12;i++){temp = tempDatal; tempDatal A= tempData2;_rotl(tempDatal,tempData2); tempDatal += subKey[2*i]; tempData2 A= temp;_rotl(tempData2,temp); tempData2 += subKey[2*i + 1];}CData[O] = tempDatal;CData[l] = tempData2;}void decrypt(UINT32 *PText,UINT32 *CText){//进行解密UINT32 PData[l];UINT32 CData[l];UINT32 tempDatalztempData2ztemplztemp2;UINT8 i;//PData = PText;// CData = CText;PData[0] = *PText;PText++;PData[l] = *PText;CData[0] = *CText;CText++;CData[l] = *CTe。

下载提示
相似文档
正为您匹配相似的精品文档