Ron Rivest在1987年提出了RC4加密方法,开始他并不打算公开此密码的加密规则,RC4 是商业机密,不公开密码的加密规则会提高安全性,不过在1994年,一位匿名人士在公共场所张贴了对密码规则的描述。
认识
对称密码算法
加密与解密使用相同的代码
流密码加密算法
加密和解密双方使用相同伪随机加密数据流(pseudo-randomstream)作为密钥,明文数据每次与密钥数据流顺次对应加密,得到密文数据流。
密钥长度可变
它以一个足够大的表S为基础,对表进行非线性变换,产生密钥流
优点
不占内存
运算速度快
缺点
密钥大小可变
容易受到攻击
初始化
两样东西,S盒和Key(密钥)
在初始化的过程中,密钥的主要功能是将S-box搅乱
S盒
S盒用一个长度是256的数组来表示S盒,每个元素的值都是0到255之间的整数
Key
密钥,功能是搅乱S盒的顺序
加密
两样东西:要加密的数据data,初始化汇总搅乱的S盒
C++实现过程
#include <iostream> #include <vector> #include <algorithm> using namespace std; void init_s(vector<unsigned char>& s, vector<unsigned char>& rc4key) { for (int i = 0; i < 256; i++) s[i] = i; int j = 0; for (int i = 0; i < 256; i++) { j = (j + s[i] + rc4key[i % rc4key.size()]) % 256; swap(s[i], s[j]); } } void create_key(vector<unsigned char>& s, vector<unsigned char>& keystream, int buffer_len) { int i = 0, j = 0; int t, counter; for (counter = 0; counter < buffer_len; counter++) { i = (i + 1) % 256; j = (s[i] + j) % 256; swap(s[i], s[j]); t = (s[i] + s[j]) % 256; keystream[counter] = s[t]; } } void rc4(vector<unsigned char>& buffer_data, vector<unsigned char>& rc4key, vector<unsigned char>& result) { vector<unsigned char> s(256); init_s(s, rc4key); vector<unsigned char> keystream(buffer_data.size()); create_key(s, keystream, buffer_data.size()); for (int i = 0; i < buffer_data.size(); i++) { result[i] = buffer_data[i] ^ keystream[i]; } } int main() { string input = "Crypto"; vector<unsigned char> buffer_data(input.begin(), input.end()); vector<unsigned char> rc4key{'k', 'e', 'y'}; // 密钥 vector<unsigned char> result(buffer_data.size()); // RC4 加密 rc4(buffer_data, rc4key, result); cout << "加密后的结果:"; for (int i = 0; i < result.size(); i++) { cout << result[i]; } cout << endl; // RC4 解密 rc4(result, rc4key, buffer_data); cout << "解密后的结果:"; for (int i = 0; i < buffer_data.size(); i++) { cout << buffer_data[i]; } cout << endl; return 0; }