RC4算法原理与应用 —— 密码与密码工程实践No.1

RC4密码简介:
RC4是由美国密码学家Ron Rivest在1987年设计的流密码算法,该算法被广泛用于 SSL/TLS协议(Socket Secure Layer, SSL)/(Transport Layer Security, TLS),WEP(Wired Equivalent Privacy, WEP)协议和 WPA(Wi-Fi Protected Access, WPA)协议,也作为蜂窝数字数据包规范的一部分。
RC4是一种基于非线性变换的流密码算法。该算法包括两部分:
(1)密钥编制算法KSA(Key Sehedule Algorithm); 用可变长度的密钥产生密钥流生成器的初始状态 S 0 S_0 S0
(2)伪随机序列生成算法 PRGA(Pseudo Random Generation Algorithm);根据初始状态 S 0 S_0 S0产生密钥流序列,最终与明文相异或产生密文。

RC4的实现步骤:
部分1 KSA实现步骤:

  1. 随机选取一个密钥Key,初始化 S 盒。
  2. i t i_t it遍历 S 盒中的每一个位置, i t i_t it的每一次更新都会使得 j t j_t jt S t − 1 S_{t-1} St1 [ i t i_t it] 和Key的作用下产生一个新值。
  3. 交换 S t S_t St j t j_t jt i t i_t it对应的两个字节。经过N步遍历后KSA产生了RC4的初始状态 s 0 s_0 s0。RC4的密钥。

伪代码实现:

KSA(Key, S)
for i = 0 to N-1
i 0 i_0 i0 = 0, j 0 j_0 j0 = 0;
where t = 1,2,…,N
j t j_t jt = j t − 1 j_{t-1} jt1+ S t − 1 S_{t-1} St1[ i t − 1 i_{t-1} it1] + Key[ i t − 1 i_{t-1} it1 mod 1];
S t S_t St[ i t i_t it] = S t − 1 S_{t-1} St1[ j t j_t jt], S t S_t St[ j t j_t jt] = S t − 1 S_{t-1} St1[ i t i_t it];
i t i_t it = i t − 1 i_{t-1} it1 + 1;

部分2 PRGA实现步骤
伪随机序列的生成原理是不断地变换 S 盒中的元
素的位置,同时从中选择一元素输出,即伪随机序列,也
称密钥流序列。

  1. 根据 KSA 的初始状态表 S 0 S_0 S0,初始化针 i t i_t it j t j_t jt
  2. 更新该算法中的 j, 同时交换 S t S_t St i t i_t it j t j_t jt
    应的字节。
  3. 伪随机序列生成器不断地变换S盒中字节的位置,每次改变后将 S 中 S t S_t St [ i t i_t it] + S t S_t St [ j t j_t jt] 位置的值输出,即为8比特的密钥流输出字节,输出的字节序列是{ Z t Z_t Zt} (t : 0 -> ∞ \infty ),{ Z t Z_t Zt}与明文异或加密,与密文异或解密。

伪代码实现:

PRGA( S 0 S_0 S0)
Initialization:
i 0 i_0 i0 = 0;
j 0 j_0 j0 = 0;
while(true)
i t i_t it =
( i t − 1 i_{t-1} it1 + 1) mod N;
j t j_t jt = ( j t − 1 j_{t-1} jt1 + S t − 1 S_{t-1} St1[ i t i_t it]) mod N;
S t S_t St[ i t i_t it] = S t − 1 S_{t-1} St1[ j t j_t jt], S t S_t St[ j t j_t jt] = S t − 1 S_{t-1} St1[ i t i_t it];
Z t Z_t Zt = S t S_t St[( S t S_t St[ i t i_t it] + S t S_t St[ j t j_t jt]) mod N];
output Z t Z_t Zt
endwhile

OpenSSL代码应用:

#include 
#include 
#include 
#include 
int main(int argc, char* argv[])
{
    RC4_KEY key;

    const char* data = "Hello,World!!";
    const char* indata = "This is plain text !!!!";
    
    int length = strlen((char *)data);
    int len = strlen((char*)indata);

    RC4_set_key(&key, length, (const unsigned char *)data);            //设置密钥
    
    unsigned char* outdata;                                            //分配密文空间
    outdata = (unsigned char*)malloc(sizeof(unsigned char) * (len + 1));
    memset(outdata, 0, len + 1);                                       //初始为0
    printf("\tindata=%s\n", indata);
    RC4(&key, strlen(indata), (const unsigned char*)indata, outdata);  //加密明文
    printf("\toutdata=%s\n", outdata);

    unsigned char* plain;                                              //分配明文空间
    plain = (unsigned char*)malloc(sizeof(unsigned char) * (len + 1));
    memset(plain, 0, len + 1);                                         //初始化为0
    RC4_set_key(&key, length, (const unsigned char*)data);             //重新设置密钥
    RC4(&key, strlen((char *)outdata), outdata, plain);                //解密密文
    printf("\tplain=%s\n", plain);
  
    return 0;
}
 

运行结果如下:
RC4算法原理与应用 —— 密码与密码工程实践No.1_第1张图片

你可能感兴趣的:(密码学与密码工程应用,算法,RC4)