RC4流程

RC4流程

  1. 用1-256字节(8-2048位)的可变长度密钥初始化一个256字节的状态向量S,S的元素为S[0], S[1], S[2]…… S[255]。
  2. 从始至终,置换后的S包含0-255的所有8位数
  3. 加密和解密时,按某种系统化的方法从S的256个元素中选出字节k,每生成一个k,重新排列S的元素

一、初始化S

  1. 开始时,S中的元素按升序被设置为0-255,即S[0]=0, S[1]=1,…S[255]=255

  2. 同时建立一个临时向量T

    • 若密钥K的长度为256字节,则将密钥K赋给T
    • 若密钥长度为keylen个字节(keylen<256),则将密钥K的值赋给T的前keylen个元素,并循环复用密钥K的值赋给T剩下的元素,直到T的所有元素都被赋值
    /*初始化*/ 
    for i = 0 to 255 do
    	S[i] = i; 
    	T[i] = K[i mod keylen];
    
  3. 然后用T产生S的初始置换,从S[0]到S[255],对每个S[i],根据由T[i]确定的方案,将S[i]置换为S中的另一字节

    /*S的初始置换*/
    j = 0;
    for i = 0 to 255 do
    	j = (j + S[i] + T[i]) mod 256;
    	Swap(S[i], S[j]);
    

    1、本操作目的是打乱S,使S的排列随机;

    2、对S的唯一操作是交换,所以唯一的改变就是置换,S仍然包含所有值为0-255的元素

二、密钥流产生

  1. 向量S一旦完成初始化,输入的密钥K就不再被使用

  2. 密钥流生成过程是:从S[0]到S[255],对每个S[i],根据S的当前配置,将S[i]与S中另一字节置换,当S[255]完成置换后,操作继续重复从S[0]开始

    /*流产生*/ 
    i, j = 0; 
    while(true) 
    	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是0-255区间的随机数

    • 加密时,将k与明文异或
    • 解密时,将k与密文异或

三、RC4的强度

  • RC4曾一度被认为是最安全的算法之一,在WEP等协议中被广泛采用
  • RC4强度核心是密钥序列重复周期
  • 2015年,比利时鲁汶大学的研究人员Mathy Vanhoef及Frank Piessens,公布了针对RC4加密算法的新型攻击程式,可在75小时内取得cookie的内容
  • 2015年,TLS禁止了RC4的使用
posted @ 2021-06-20 14:37  TR_Goldfish  阅读(189)  评论(0编辑  收藏  举报