RC4


RC4(来自Rivest Cipher 4的缩写)是一种流加密算法,密钥长度可变。它加解密使用相同的密钥,属于对称加密算法.

RC4 算法主要包含两个关键函数:rc4_init()rc4_crypt()

**rc4_init(s, key, key_len)**:

该函数主要利用 key 来初始化 S 盒

rc4_crypt(s, data, data_len):

该函数用来加解密

RC4 由伪随机数生成器和异或运算组成(由于异或运算的对合性,RC4 加密解密使用同一套算法)。RC4 的密钥长度可变,范围是[1,255]。RC4 一个字节一个字节地加解密。给定一个密钥,伪随机数生成器接受密钥并产生一个 S 盒。S 盒用来加密数据,而且在加密过程中 S 盒会变化。

注意,加解密用的 S_Box 都是经过 rc4_init 处理后的 S_Box,由于加密时 S 盒会变化,所以需要备份一份供解密使用

测试代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void swap(unsigned char *s, int i, int j){
        char tmp = s[i];
        s[i] = s[j];
        s[j] = tmp;
}

void rc4_init(unsigned char *s, unsigned char *key, int len){
        int i = 0, j = 0;
        unsigned int  k[256];
        for (i = 0; i < 256; i++){
                s[i] = i;
                k[i] = key[i % len];
        }

        for(i = 0; i < 256; i++){
                j = (j + s[i] + k[i]) % 256;
                swap(s, i , j);
        }
}

void rc4_crypt(unsigned char *s, unsigned char *data, int len){
        int i = 0, j = 0;
        int t = 0, k = 0;
        for (k = 0; k < len; k++){
                i = (i + 1) %256;
                j = (j + s[i]) %256;
                swap(s, i, j);
                t = (s[i] + s[j]) % 256;
                data[k] ^= s[t];
        }
}


int main(int argc, char *argv[]){

        unsigned char s[256], s1[256];
        unsigned char key[] = "helloworld";
        unsigned char data[] = "你好,XiaozaYa";
        printf("原始数据:%s\n", data);
        //初始化S_Box
        rc4_init(s, key, strlen(key));
        memcpy(s1, s, 256); //备份S盒,解密时使用
        rc4_crypt(s, data, strlen(data));
        printf("加密数据:%s\n", data);
        rc4_crypt(s1, data, strlen(data));
        printf("还原数据:%s\n", data);

        return 0;
}

文章作者: XiaozaYa
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 XiaozaYa !
  目录