本次以rc4算法的细节进行讲解
对称密码算法
明文^密钥=密文
密文^密钥=明文
也就是说,在对称加密算法里面,加解密用的都是同一套密钥,同理可知,非对称加密算法即为加解密不是同一套密钥的算法
首先,我们来讲一讲这个RC4算法
RC4算法
RC4算法为对称加密算法中的流密码加密算法
我们知道,在之前的加解密算法里的运算是可逆的
我们通过对明文的加密获得密文,但是这个加密过程还有一个特点:
流密码
什么是流密码?流密码就是将明文逐个字节一个一个进行加密操作
与之对应的就是快加密算法,如DES加密算法
既然这个是逐个字节进行加密的操作,那么这个加密算法的重点就是密钥
同时也要注意到,RC4算法的密钥长度是可以改变的,那么它是如何产生密钥流的呢?
密钥流的产生
首先,它是以一个巨大的表s为基础(我们也可以称之为s盒)
之后对其进行非线性交换来得到密钥流
这里讲一下什么是非线性的操作
通俗来说,比如函数我们输入一个x那么它的映射f(flection)通过一定的关系传给y,构成一个一一对应的函数f(x),如果y的图像是一条直线,那么从转变到x就是线性的,丹如果y的图像不是直线,那么x经过加密的过程也就是非线性的
由于非线性的变换比线性变换更难以找到其中的规律并对其进行破解
加密过程的具体操作:
一,初始化随即表
1,先初始化s表(或者是s盒)
先进行填充
将s表中的值按照0到255赋值给s[0]到s[255],也就是
s[0]=0,s[1]=1...s[255]=255这样进行填充
可以先把代码写成如下
int a[255];
for(int i=0;i=255;i++)
{
a[i]=i;
}
2,用种子密钥填充另一个长度为256的表
如果种子的密钥为256,那么刚刚好将它的值赋值给k
如果种子的长度小于256,则进行循环使用,直到K的所有元素被赋值
举个例子:
如果种子的密钥为 4,5 ,6
那么k表的值就是4,5,6,4,5,6,4......
直到将该表填满为止
3,用k产生对s的初始置换
从s[0]到s[255],对每个s[i]根据k[i]确定的一个方案,将s[i]置换为s中的的另一个字节
我们举一个例子进行讲解
假设我们有一个s表(s[7],k[7]的长度也为7是为了方便说明)
从s[0]到s[6]依次进行赋值0,1,2,3,4,5,6
同时也要有一个k表的种子密钥以方便进行后续的操作
假设我们给的种子密钥的值为3.4.5;那么k表的值也就是3,4,5,3,4,5,3(一次轮流填充进去)
接下来进行数值的变换,以下是一段伪代码:(这是一段长度为256的加密算法的例子)
取i和j的值都初始化为0,i的值从0到255都要进行一次表内查值,同时要进行一次置换
根据公式
j=(j+s[i]+k[i])%7
计算一个为例子:
j=0+s[0]+k[0]=0+0+3=3
进行一波操作之后,我们得到的经过加密的表成了这个样子:
由于交换是从左到右依次进行交换的,所以不用担心会重复进行交换的情况
二,密钥流的生成:
由于是流密码,所以我们许哟啊为每个待加密的字节生成一个用来异或的伪随机数值
要注意的是,这个数值也是从s表中来获取,我们现在要做的就是找到他的下标,求这个随机数为几
我们从下面这个代码来看
这个k就是伪随机数值所组成的一个数组,t是s的下标
找到t也就要找到s[i]和s[j]的值
而i和j分别是以上方的运算方式进行运算的,不过要注意的是,i和j进行运算的时候的模要依据实际的方式及来进行运算,也就是我们常说的魔改
我们最后来看一下swap(s[i],s[j])这段代码的含义,含义为这两个元素的值进行交换,对s表进行一次变换,所以在每一次循环的过程中,s表都是需要发生一次改变
循环完毕之后,加密结束。
需要注意的一点,我们的s表一旦完成初始化,那么种子密钥不会再被使用