【寒江雪】流密码与RC4

来源:互联网 发布:win10手机共享网络usb 编辑:程序博客网 时间:2024/05/16 02:30

流密码

  • 流密码概述
    • 按位处理信息
    • 产生伪随机密钥流
      • 与明文按位异或
    • 密钥流的随机性破坏了信息的统计属性
      • Ci=Pi XOR StreamKeyi
    • 千万不能重复使用流密钥
      • 如果流加密对两个明文使用相同的密钥加密,则密码分析就会相当容易.如果对两个密文流进行异或,得出的结果就是两个原始明文的异或.如果明文仅是字符串,信用卡号或者其他已知特征的字节流,则密码分析非常容易成功
  • [KUMA97]列出了设计流密码需要考虑的主要因素:
    • 加密序列的周期要长
    • 密钥流应尽可能接近于一个真正的随机数流的特征.加大密钥分析的难度.
    • 为了防止穷举攻击,密钥应该足够长,对于分组密码也有同样的考虑
    • 有很大的线性复杂度
  • 适当地设计可以使流密码与使用相同密钥长度的分组密码一样安全.

RC4算法

  • RC4概述

    • RC4 算法是面向字节流加密的算法.该算法中,一个字节的明文会与一个字节的密钥进行异或,产生一个字节的密文.
    • RSA DSI拥有的专有(私有的)密码.
    • 可变长的密钥长度,面向字节流的密码
    • 被广泛地使用(web SSL/TLS,wireless WEP)
    • 密钥的形成是所有8个比特值的随机排列
    • 使用随机排列来搅乱输入的信息,一次处理一个字节
  • RC4算法描述
      用从1到256个字节的可变长度密钥初始化一个256个字节的状态向量S,S的元素记为S[0],S[1],S[2]…,S[255].从始至终置换后的S包含从0\~255所有8比特数.对于加密和解密,字节K由S中255个元素按一定方式选出一个元素而生成.每生成一个K的值,S中的元素个体就被重新置换一次.每生成一个K的值,S中的元素个体就被重新置换一次.

初始化S

  开始时,S中元素的值被置为按升序从0~255,同时建立一个临时向量T.如果密钥K的长度为256字节,则将K赋值给T.否则若密钥长度为keylen字节,则将K的值赋给T的前keylen个元素,并循环重复用K的值赋给T剩下的元素,直到T的所有元素都被赋值.

    /*Initialization*/    for (int i = 0; i < 256; i++)    {        S[i] = i;        T[i] = K[i % keylen];    }

  然后用T产生的S的初始置换,从S[0]到S[255],对每个S[i],根据T[i]确定的方案,将S[i]置换为S中的另一字节

    /*Initial Permutation of*/    int j = 0;    for (int i = 0; i < 256; i++) {        j = (j + S[i] + T[i])%256;        swap(S[i], S[j]);    }

  因为对S的操作仅是置换,所以唯一的改变就是置换.S仍然包含所有值为0~255的元素.

密钥流的生成

  向量S一旦完成初始化,输入密钥就不再被使用.密钥流的生成是从S[0]到S[255],对每个S[i],根据当前S的值,将S[i]与S中中的另一字节置换.当S[255]完成置换后,操作继续重复从S[0]开始

/* Stream Generation*/    int i = 0;    int j = 0;    while (true) {        i = (i + 1) % 256;        j = (j + S[i]) % 256;        swap(S[i], S[j]);        char t = (S[i] + S[j]) % 256;        char k = S[t];        // TO DO::Encription    }

  加密中,将k的值与下一明文字节异或.
  解密中,将k的值与下一密文字节异或.
  整个过程如下图所示
图片描述


Copyright© by 寒江雪
Date:2016.12.08

0 0
原创粉丝点击