(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu)
参考:https://www.okta.com/identity-101/rc4-stream-cipher/
参考:https://en.wikipedia.org/wiki/RC4
关于加密
关于加密算法,一般而言,如果我们期望写一个简单的加密算法的话,通常我们期望得到的效果有:
- 速度快:加解密速度快,这样加密后对整体时间影响不大;
- 加密尽量不容易被轻易破解;
这两个要求rc4都可以轻易满足;
可能有人查资料,觉得rc4能被破解,不过这个破解也不是普通人可以做到的,专业人士也不能轻松做到;
对于我们一般的应用来说,如果不涉及机密数据的话,使用也还是完全没有问题的。
这个算法也会远优于我们自己琢磨构造的加密算法。
如果实在不太放心的话,可以在rc4的基础上,稍作改造,相信通常没人再有兴趣来破解这个定制过的rc4算法。
期望的加密算法
先构造一个我们自己的简单加密key,然后来看看rc4是否正是我们期望有的:
我们已知异或的特点:
A^key = B;
B^key = A;
如果我们期望给字符串加密的话,异或会是一个不错的选择;
我们生成一串的随机字符值作为加密解密key;发送端-A发送前异或加密得到B;接受端-异或解密B得到A;
通常我们使用加密key会是一个熟悉的串值,但这个串值我们并不期望于是真实的key值;
我们希望加密使用的words能够比我们使用key长点,可以基于我们的key生成;
例如key使用"mycat@21",加密words的话,我们希望基于这个key生成出来;
这样传输的加密流和这个key就没有关系了,没有直接的关系;
就算解密出来的话,通常也解不出来这个key,因为可能是个一对多关系;
通常我们使用key/words不会用很长,如果A比较长的话,加密的话,就会重复使用key/words了,会有迭代的效果;
这种效果下,就比较被破解了,因为迭代效果太明显了。
所以,我们期望这个key尽量能够自行延长,但不会重复;
延长+不重复这个就不容易实现了。怎么做到呢?过程中key/words不停的被修改能做到,rc4是这么做的。
rc4加密算法实现
下来就来看看这个算法的实现:
首先:使用key构造一个初始的加密words: S[256];
经过这个过程处理后,生成被换位的的S[256]-encode值数组;
这个序列由key来决定,不同的key会生成出不同的S[256]序列。
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 values of S[i] and S[j]
endfor
然后:使用words-S[256]来生成逐个字符使用的encode值;
这个字符encode值会不断变化,基本没有迭代规律,确保了其随机性;
当然了,这个encode生成序列是稳定了,确保了同样解密时,使用该序列解密即可。
i := 0
j := 0
while GeneratingOutput:
i := (i + 1) mod 256
j := (j + S[i]) mod 256
swap values of S[i] and S[j]
K := S[(S[i] + S[j]) mod 256]
output K
endwhile
这样就达成了之前的三个点的要求:异或需求的asc值,由key生成加密序列,key动态变化;
代码简单优美,符合了想要达成的结果,但设计却异常简单,设计思想非常棒!
(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu)