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;
}