RC4算法总结_rc4算法总结

其他工作总结 时间:2020-02-27 23:10:16 收藏本文下载本文
【www.daodoc.com - 其他工作总结】

RC4算法总结由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“rc4算法总结”。

一、RC4算法原理

RC4算法的原理很简单,包括初始化算法(KSA)和伪随机子密码生成算法(PRGA)两大部分。

RC4产生一个伪随机比特流(a keystream),加密的时候,把它跟明文进行比特级别的异或处理,解密时进行一样的步骤(因为异或操作是对称的)。(这个类似于Vernam cipher,只不过后者不使用伪随机比特流而直接使用随机比特流)。为了产生keystream,本密码算法使用时需要两个数据的私有空间来保存内部状态:

1.总共256个字节的序列(下面用“S“代替)

2.两个8比特的索引指针(下面用“i”和“j”代替)

比特流序列的初始化是根据key的长度(key的长度通常在40到256比特之间),使用key-scheduling 算法来进行的(KSA),一旦完成了初始化,比特流就可以根据伪随机生成算法(PRGA)来产生。

(1)The key-scheduling algorithm(KSA)key-scheduling算法用来初始化数组“S”中的字节序列,“keylength”定义了key的字节长度,可能的范围是[1, 256],典型的值是5到16之间,相应的key长度就是40-128比特。首先,数组“S”被初始化成identity permutation(身份鉴别的序列),随后在PRGA的算法中进行256为周期的循环列举出来,每次处理的方式都是一样的,是联合key的字节进行的。

for i from 0 to 255 S[i] := i endfor

j := 0

for i from 0 to 255

j:=(j + S[i] + key[i mod keylength])mod 256 swap(&S[i],&S[j])endfor

(2)伪随机生成算法(PRGA)

对于尽可能多的每个列举过程,PRGA算法修改 内部的状态并输出keystream的一个字节。在每次循环中,PRGA把i加一,并把i所指向的S值加到j上去,然后交换S[i]和S[j]的值,最后 输出S[i]和S[j]的和(取256的模)对应的S值。至多经过256次,S每个位置上的值都被交换一次。

i := 0 j := 0

while GeneratingOutput: i :=(i + 1)mod 256 j :=(j + S[i])mod 256 swap(&S[i],&S[j])output S[(S[i] + S[j])mod 256] endwhile

二、RC4算法实现

实现一

假设S-box的长度为256,密钥长度为Len。

KSA部分:

先来看看算法的初始化部分(用C代码表示):

其中,参数1是一个256长度的char型数组,定义为: unsigned char sBox[256];

参数2是密钥,其内容可以随便定义:char key[256];

参数3是密钥的长度,Len = strlen(key);

void rc4_init(unsigned char *s, unsigned char *key, unsigned long Len)

{

int i =0, j = 0, k[256] = {0};

for(i=0;i

{

s[i]=i;

k[i]=key[i%Len];

}

for(i=0;i

{

j=(j+s[i]+k[i])%256;

swap(s,x,y);

} } 在初始化的过程中,密钥的主要功能是将S-box搅乱,i确保S-box的每个元素都得到处理,j保证S-box的搅乱是随机的。而不同的S-box在经过伪随机子密码生成算法的处理后可以得到不同的子密钥序列,将S-box和明文进行xor运算,得到密文,解密过程也完全相同。

PRGA部分:

再来看看算法的加密部分(用C代码表示):

其中,参数1是上边rc4_init函数中,被搅乱的S-box;

参数2是需要加密的数据data;

参数3是data的长度.void rc4_crypt(unsigned char *s, unsigned char *Data, unsigned long Len)

{

int x = 0, y = 0, t = 0, i = 0;

for(i=0;i

{

x=(x+1)%256;

y=(y+s[x])%256;

t=(s[x]+s[y])%256;swap(s,x,y);

Data[i] ^= s[t];

} }

最后,在main函数中,调用顺序如下:

void main()

{

unsigned char s[256] = {0};//S-box

unsigned char key[256] = {”just for test“};

unsigned char pData[512] = ”这是一个用来加密的数据Data“;ULONG len = strlen(pData);printf(”pData = %sn“,pData);printf(”key = %s, length = %dn“,key,strlen(key));

rc4_init(s,(unsigned char *)key,strlen(key));//初始化

rc4_crypt(s,(unsigned char *)pData,len);//加密

printf(”pData = %snn“,pData);

rc4_crypt(s,(unsigned char *)pData,len);//解密

printf(”pData = %snn",pData);}

实现二(对实现一的改进)

许多流加密算法都是基于Linear feedback shift register(LFSRs, 寄存器线性反馈移位), 虽然在硬件上有效率但是在软件实现上却可能比较慢。RC4的设计避免了LFSRs的使用,对于软件实现是相当理想的,它只需字节操作,使用了256字节的 状态数组(从S[0]到S[255]), k字节的key内存(从key[0]到key[k-1]),整数i,j和k。进行256的取模操作可以用255的字节AND来进行(在有些平台上,只需简单地进行字节相加,忽略掉溢出即可)。

/*交换数组s中的两个元素*/ void swap(unsigned char *s, unsigned int i, unsigned int j){ unsigned char temp = s[i];s[i] = s[j];s[j] = temp;}

/*KSA算法初始化s-box*/ void rc4_init(unsigned char *s, unsigned char *key, unsigned long length){ unsigned int i = 0, j = 0;unsigned char temp = 0;for(i = 0;i

s[i] = i;} for(i = 0;i

} } /*和255进行逻辑与运算相当于对256求模*/ j =(j+s[i]+key[i%length])&255;swap(s, i, j);/*PRGA算法生成伪随机序列*/ void rc4_crypt(unsigned char *s, unsigned char *data, unsigned long length){ int x = 0, y = 0, t = 0, i = 0;for(i=0;i

x =(x+1)&255;

y =(y+s[x])&255;

swap(s, x, y);

t =(s[x]+s[y])&255;

data[i] ^= s[t];} }

RC电路总结

RC电路在模拟电路、脉冲数字电路中得到广泛的应用,由于电 路的形式以及信号源和R,C元件参数的不同,因而组成了RC电路的各种应用形式:微分电路 、积分电路、耦合电路、滤波电路及......

算法总结

算法分块总结为备战2005年11月4日成都一战,特将已经做过的题目按算法分块做一个全面详细的总结,主要突出算法思路,尽量选取有代表性的题目,尽量做到算法的全面性,不漏任何ACM可......

算法总结

算法分析与设计总结报告71110415 钱玉明在计算机软件专业中,算法分析与设计是一门非常重要的课程,很多人为它如痴如醉。很多问题的解决,程序的编写都要依赖它,在软件还是面向过......

RC有源滤波器的设计总结

总结与体会本次模电课程设计基本上完成了,虽然很累,但我们感到很满足。刚开始的时候,由于我们当时对于滤波电路的理解不是非常的深入,这使得我们在一开始就遇到了一个比较棘手的......

计算机算法总结

算法总结1.穷举法穷举法,又称暴力算法,即列举问题解空间所有可能情况,并逐个测试,从而找出符合问题条件的解。这份通常是一种费时算法,人工手动求解困难,但计算机的出现使得穷举法......

下载RC4算法总结word格式文档
下载RC4算法总结.doc
将本文档下载到自己电脑,方便修改和收藏。
点此处下载文档

文档为doc格式

相关专题 rc4算法总结 算法
热门文章
点击下载本文