1. RC4算法介绍
1)密钥长度为1~256B,安全起见密钥长度至少8B3
2)密钥调度算法:
for(i=0,j=0;i<256;i++){ //初始化状态表S,临时表T
S[i]=i; T[i]=K[i mod L]; //密钥长度L(B)
}
for(i=0,j=0;i<256;i++){ //利用T表对S表进行初始置换
j=(j+S[i]+T[i]) mod 256;
S[i]óS[j]; //位置交换
}
3)伪随机序列生成算法:
i=0, j=0;
for(k=0;k<Len(m);k++){ //Len(m)代表明文长度(B)
i = (i + 1) mod 256;
j = (j + S[i]) mod 256;
S[i]óS[j]; //位置交换
t = (S[i] + S[j]) mod 256;
z = S[t]; //z为第k个密钥流元素
}
4)加密:ci = mi ⊕ zi (i = 0, 1, 2, ···)
5)解密: mi = ci ⊕ zi (i = 0, 1, 2, ···) ps:^= 为异或运算
下面为一段实现字符串加/解密代码:
#include <iostream>
#include <string>
using namespace std;
class RC4 {
private:
unsigned char s[256];
void swap(unsigned char& a, unsigned char& b) //交换函数
{
unsigned char tmp = a;
a = b;
b = tmp;
}
void init_s(string key)
{
for (unsigned int i = 0; i < 256; i++) //初始化s表
s[i] = i;
unsigned char T[256] = { 0 };
unsigned keylen = key.length(); //密钥长度
for (int i = 0; i < 256; i++)
T[i] = key[i % keylen]; //根据密钥初始化t表
for (int j = 0, i = 0; i < 256; i++) //利用T表对S表进行初始化置换
{
j = (j + s[i] + T[i]) % 256; //打乱s表(制造密文)
swap(s[i], s[j]); //位置交换
}
}
public:
void jia_mi(string& data, string key) {
init_s(key);
unsigned int datalen = data.length();
unsigned char k, i = 0, j = 0, t;
for (unsigned int h = 0; h < datalen; h++) //datelen代表明文长度(B)
{
i = (i + 1) % 256;
j = (j + s[i]) % 256;
swap(s[i], s[j]);
t = (s[i] + s[j]) % 256;
k = s[t];
data[h] ^= k; //将第K个密钥流元素按位异或赋值给date[h]
}
}
void jie_mi(string& data, string key) {
init_s(key);
unsigned int datalen = data.length();
unsigned char k, i = 0, j = 0, t;
for (unsigned int h = 0; h < datalen; h++) //datelen代表明文长度(B)
{
i = (i + 1) % 256;
j = (j + s[i]) % 256;
swap(s[i], s[j]);
t = (s[i] + s[j]) % 256;
k = s[t];
data[h] ^= k; //将第K个密钥流元素按位异或赋值给date[h]
}
}
};
int main()
{
RC4 rc4; //创建rc4对象
string data, key,key1; //创建date,key变量
cout << "请输入需要加密的明文:" << endl;
cin >> data;
cout << "请输入密钥key:" << endl;
cin >> key;
rc4.jia_mi(data, key); //调用加密函数对明文进行加密
cout << "加密后的内容是:\n" << data << endl;
cout << "请输入密钥key:" << endl;
cin >> key1;
if (key1 == key)
{
rc4.jie_mi(data, key); //调用解密函数对密文进行解密
cout << "解密后的内容是:\n" << data << endl;
}
else {
cout << "密钥错误" << endl;
}
return 0;
}
因为加密解密过程是一样的 故此 可以用同一个函数 调用两次就完成了加/解密过程,本代码为了方便理解将两部分分开写。