RC4加密算法是对称密码中的流密码加密算法,密钥长度可变,面向字节操作。有一个S表,对此表进行非线性变换,产生密钥流。
加密过程:
一.初始化S表:
1.对S表进行线性填充 S[0-n]
2.用种子密钥填充另一个K表(种子密钥可循环) [a1,a2,a3,a1,a2]也是n个 3.用K表对S表进行初始置换
二,密钥流生成:
整体
#include <string>
#include <cstring>
using namespace std;
int S[256];
int K[256];
//传参是引用
void swap(int& x, int& y) {
int tmp = x;
x = y;
y = tmp;
}
//arr实际上是一个指针
void start_S(int arr[], int len) {
//初始化S,K表
for (int i = 0; i < 256; i++) {
S[i] = i;
K[i] = arr[i % len];
}
//K对S置换
int j = 0;
for (int i = 0; i < 256; i++) {
j = (j + S[i] + K[i]) % 256;
swap(S[i], S[j]);
}
}
//密钥流
void keyArr(string& enc, int keylen) {
int i = 0, j = 0;
for (int r = 0; r < keylen; r++) {
i = (i + 1) % 256;
j = (j + S[i]) % 256;
swap(S[i], S[j]);
int t = (S[i] + S[j]) % 256;
enc[r] = enc[r] ^ S[t];
}
}
int main()
{
int key[3] = { 0,1,2 };
int len = sizeof(key) / sizeof(key[0]);
start_S(key, len);
string str = "";
int num = str.length();
keyArr(str, num);
for (int i = 0; i < num; i++) {
cout << str[i] << " ";
}
return 0;
}