RC4
对明文使用同一个密钥异或两次最后是得到原文的
明文,是指没有加密的文字(或者字符串),一般人都能看懂的意思。
密文,是指经过某个加密算法,把一个明文,变成另一些文字。从密文本身,一般不能看出明文本身的意思 。不然就失去加密的意义。要想得到明文,就能通过对应的解密算法,才能得到明文 ,从而知道本来的意思 。
1.简介
在密码学中,RC4(来自 Rivest Cipher 4 的缩写)是一种流加密算法,密钥长度可变。它加解密使用相同的密钥,因此也属于对称加密算法。RC4 是有线等效加密(WEP)中采用的加密算法,也曾经是 TLS 可采用的算法之一。
2.原理及步骤
(图片转载地址:https://www.cnblogs.com/block2016/p/5601925.html)
1>先初始化状态向量S(256个字节,用来作为密钥流生成的种子1)
按照升序,给每个字节赋值0,1,2,3,4,5,6…,254,255
for (int i=0;i<256;i++){
S[i] = i
}
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