RC4与A5
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; //进行加密,"^"是异或运算符
}
解密按照前面写的,异或两次就是原文,所以只要把密钥流重新拿过来异或一次就能得到原文了
在cap4中RC4位于ciphers中的RC4,这个只支持4字节密钥,实际上低于40字节的Rc4安全性很差,点击initalize key就可以初始化K,S序列,Encipher有两个用途,其一输入Stream size,这个输入的是你想要生成的密钥流,但是该算法是按字节生成的密钥流,所以会生成最短的序列如111,会生成112个比特数据,其二是在plaintext中输入明文,单击Encipher进行加密
A5
A5/1应该是一个比较低级且基于流秘钥的一种加密算法,因为是可以基于硬件实现的,所以可以非常快。
首先要明白A5/1算法产生秘钥的流程(这里就不讲什么初始化,道理都一样,主要是讲秘钥是怎么生成的)
1、假设有以下三个初始移位寄存器(先只要知道有三个移位寄存器(就是普通寄存器),分别有19位,22位,23位)
2、然后是如何开始生成秘钥的,假设有三个寄存器目前的状态是这样:
3、接下来开始进行规定的流程(这是规定)
(1)首先找到X8=1,Y10=0,Z10=1
(2)取数量最多的作为结果M=Maj(X8,Y10 , Z10 )= Maj(1,0, 1)=1;(如果是M=Maj(0,0,1)=0)
(3)因为M=1,且X8=1,M=X8,所以X寄存器需要左移一位,那么因为左移,第一位就空出来了,则 X0= (移位前的)=1
所以最后X寄存器变为
同理,再看Y寄存器,因为M=1,Y10=0,所以Y寄存器不需要进行移位,保持不变(如果是M=Y10 Z0=)
同理,Z寄存器,因为M=1,Z10=1,所以Z寄存器需要左移一位,第一位Z0==0
所以最后Y寄存器变为
所以最后得到的三个移位寄存器是
秘钥是S0==1,
就这样得到了第一位秘钥,如果需要64位秘钥,则按照上述进行循环64次操作即可。
在cap4中流加密法(A5)位于ciphers中的stream
放张图自行体会