简单介绍RC4加密算法原理

学了这么多加密算法,首先要了解的是:对明文使用同一个密钥异或两次最后是得到原文的

RC4加密算法其实也是比较简单的,重点是在秘钥流生成器那里,其实也是比较简单的。

重点讲解RC4秘钥生成步骤

感觉这个流程图画的很不错,拿过来作为大家参考一下

______________________________________________________

流密码和RC4

定义:流密码是对称密码算法,从明文输入流逐位或逐字节产生密文输出。

实例:使用最广泛的流密码是RC4

流密码结构:

  

流密码类似于”一次一密”,不同的是”一次一密”使用的是真正的随机数流,而流密码使用的是伪随机数流。

设计流密码的主要因素

1、加密序列的周期要长,若出现重复的周期过短,容易被破解

2、密钥流应该尽可能地接近真正随机数流的特征

3、密钥长度要长,以避免琼穷举攻击

 

RC4算法

RC4算法是Ron RivestRSA公司在1987年设计的一种流密码,作为RSA的商业机密直到1994年才被匿名公布于Internet

该算法是一个可变密钥长度、面向字节操作的流密码。该算法以随机置换作为基础,其密码周期很可能大于10100,且该算法的运行速度很快。

RC4被用于为网络浏览器和服务器间通信而制定的SSL/TLS(安全套接字协议/传输层安全协议)标准中,以及作为IEEE 801.11无线局域网标准一部分的WEP(Wired Equivalent Privacy)协议和新的WiFi受保护访问协议(WAP)中。从这些应用来看,RC4构成了当今网络通信的非常重要的部分,因此这个算法非常重要

 

RC4的逻辑结构图

算法描述:

1、ST的初始状态

S中元素的值按升序被置为0-255,同时建立一个临时向量T。将密钥的值循环复制到T向量中。

2、S的初始置换

T产生S的初始置换,置换伪码如下

  j = 0;

  for (i = 0 ; i < 256 ; i++){

    j = (j + S[i] + T[i]) mod 256;

    swap(S[i] , S[j]);

  }

因为对S的操作仅是交换,S仍然包含所有值为0-255的元素。

3、密钥流的生成

密钥流生成伪码如下

  i , j = 0;

  while (true){

    i = (i + 1) mod 256;

    j = (j + S[i]) mod 256;

    swap(S[i] , S[j]);

    t = (S[i] + S[j]) mod 256;

    k = S[t];

  }

加密中,将k的值与明文的下一字节异或,解密时将k的值与密文的下一字节异或。

 

RC4的密钥长度超过128位时,目前没有任何攻击方法能够破解。不过WEP协议易受到一种特殊的攻击方式攻击,但这个问题本质上并不在与RC4本身,而是RC4密钥的产生途径有漏洞。

____________________________________________________________

1、先初始化状态向量S(256个字节,用来作为密钥流生成的种子1)

按照升序,给每个字节赋值0,1,2,3,4,5,6.....,254,255

2、初始密钥(由用户输入),长度任意

如果输入长度小于256个字节,则进行轮转,直到填满

例如输入密钥的是1,2,3,4,5   ,  那么填入的是1,2,3,4,5,1,2,3,4,5,1,2,3,4,5........

由上述轮转过程得到256个字节的向量T(用来作为密钥流生成的种子2)

3、开始对状态向量S进行置换操作(用来打乱初始种子1)

按照下列规则进行

从第零个字节开始,执行256次,保证每个字节都得到处理

 j = 0;

  for (i = 0 ; i < 256 ; i++){

    j = (j + S[i] + T[i]) mod 256;

    swap(S[i] , S[j]);

  }

这样处理后的状态向量S几乎是带有一定的随机性了

4、最后是秘钥流的生成与加密,很多人在这里不是特别理解,别的博客也没有写的很简洁明了

假设我的明文字节数是datalength=1024个字节(当然可以是任意个字节)

i=0;

j=0;

while(datalength--){//相当于执行1024次,这样生成的秘钥流也是1024个字节

   i = (i + 1) mod 256;

    j = (j + S[i]) mod 256;

    swap(S[i] , S[j]);

    t = (S[i] + S[j]) mod 256;

    k = S[t];这里的K就是当前生成的一个秘钥流中的一位

    //可以直接在这里进行加密,当然也可以将密钥流保存在数组中,最后进行异或就ok

    data[]=data[]^k; //进行加密,"^"是异或运算符

}

解密按照前面写的,异或两次就是原文,所以只要把密钥流重新拿过来异或一次就能得到原文了

这样就完成了一次生成密钥流及加密的过程,这也是RC4的全部工作,是不是很简单呢?


推荐

  • QQ空间

  • 新浪微博

  • 人人网

  • 豆瓣

取消