RC4算法

41 阅读1分钟

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

解密再异或一次就行了