RC4与A5

RC4

img

(密钥流由流密码的加解密算法所使用的伪随机序列)

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进行加密

image-20210224193229741

image-20210224193859628

A5

 A5/1应该是一个比较低级且基于流秘钥的一种加密算法,因为是可以基于硬件实现的,所以可以非常快。

   首先要明白A5/1算法产生秘钥的流程(这里就不讲什么初始化,道理都一样,主要是讲秘钥是怎么生成的)

  1、假设有以下三个初始移位寄存器(先只要知道有三个移位寄存器(就是普通寄存器),分别有19位,22位,23位)

img

2、然后是如何开始生成秘钥的,假设有三个寄存器目前的状态是这样:

img

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= img(移位前的)=1

  所以最后X寄存器变为

  img

  同理,再看Y寄存器,因为M=1,Y10=0,所以Y寄存器不需要进行移位,保持不变(如果是M=Y10 Z0=img

  img

  同理,Z寄存器,因为M=1,Z10=1,所以Z寄存器需要左移一位,第一位Z0=img=0

  所以最后Y寄存器变为

  img

所以最后得到的三个移位寄存器是

  img

秘钥是S0=img=1,

就这样得到了第一位秘钥,如果需要64位秘钥,则按照上述进行循环64次操作即可。

在cap4中流加密法(A5)位于ciphers中的stream

image-20210224195430935

放张图自行体会

image-20210224195717512

posted @ 2021-03-08 21:14  祸国雨曦  阅读(197)  评论(0)    收藏  举报