1、密钥流:RC4算法的关键是根据明文和密钥生成相应的密钥流,密钥流的长度和明文的长度是对应的,也就是说明文的长度是500字节,那么密钥流也是500字节。当然,加密生成的密文也是500字节,因为密文第i字节=明文第i字节^密钥流第i字节;
2、状态向量S:长度为256,S[0],S[1].....S[255]。每个单元都是一个字节,算法运行的任何时候,S都包括0-255的8比特数的排列组合,只不过值的位置发生了变换;
3、临时向量T:长度也为256,每个单元也是一个字节。如果密钥的长度是256字节,就直接把密钥的值赋给T,否则,轮转地将密钥的每个字节赋给T;
4、密钥K:长度为1-256字节,注意密钥的长度 keylen 与明文长度、密钥流的长度没有必然关系,通常密钥的长度取为16字节(128比特)。
5、算法实现
//rc4.h
template<class T> inline void
swap(T& i, T& j)
{ T tmp = i; i = j; j = tmp;
}
class RC4
{
public: void SetKey(const char* key, int keylen); void Transform(char* output, const char* input, int len);
private: unsigned char key_[256];
};
/
//rc4.cc
#include "rc4.h"
void RC4::SetKey(const char* key, int keylen)
{ for (int i = 0; i < 256; i++) { key_[i] = i; } int j = 0; for (int i = 0; i < 256; i++) { j = (j + key_[i] + key[i%keylen]) % 256; swap(key_[i], key_[j]); }
}
void RC4::Transform(char* output, const char* input, int len)
{ int i = 0, j = 0; for (int k = 0; k < len; k++) { i = (i + 1) % 256; j = (j + key_[i]) % 256; swap(key_[i], key_[j]); unsigned char subkey = key_[(key_[i] + key_[j]) % 256]; output[k] = subkey ^ input[k]; }
}
/
//main.cc
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "rc4.h"
int main()
{ char input[256] = "Times teaches all things to him who lives forever but I have not the luxury of eternity."; char output[256] = ""; printf("before encrypt:%s/n", input); const int keylen = 16; char key[keylen] = ""; for (int i = 0; i < keylen; i++) { key[i] = rand() % 256; } RC4 rc4encrypt, rc4decrypt; rc4encrypt.SetKey(key, keylen); rc4decrypt.SetKey(key, keylen); rc4encrypt.Transform(output, input, strlen(input)); printf("after encrypt: %s/n", output); rc4decrypt.Transform(output, output, strlen(input)); printf("after decrypt: %s/n", output); return 0;
}