说到这个,不得不吐一下国内,百度一下,全都是一样的,。。。
自己写一个,遇到了一些问题,这里记录一下,
遇到的问题先说下,就是百度里等一些描述里
j = (j+s[i])%256; //这里很多都用了int,我也一开始用了这个,结果运行有问题,后来找了一下原因,因为为个 j 的值会有负数的情况,(随机数会有负数的情况)
后来把这些要计算的值都改成无符号的就好了
代码
//add by chl at 14-07-10
#ifndef RC4_H_
#define RC4_H_
#include <vector>
using namespace std;
enum {MAX_KEY_SIZE = 255};
class RC4
{
public:
RC4();
~RC4();
RC4(const RC4& r);
RC4& operator = (const RC4& r);
// void setKey(const char* key,int len);
void enCode(unsigned char* data,int len);
void deCode(unsigned char* data,int len);
void reflush();
// bool getIsEncryption(){return m_isEncryption};
private:
void init();
void randKey();
void encryption(unsigned char* data,int len);
private:
std::vector<unsigned char> m_s; //状态向量,共256字节
std::vector<unsigned char> m_key; //可变长度密钥
// bool m_isEncryption; //是否是加密的
};
#endif /*RC4_H_*/
#include "RC4.h"
#include <stdlib.h>
#include <time.h>
#include <iostream>
// #include "cocos2d.h"
using namespace std;
// using namespace cocos2d;
RC4::RC4()
{
srand(time(NULL));
m_s.reserve(MAX_KEY_SIZE+1);
m_key.reserve(MAX_KEY_SIZE);
// m_isEncryption = false;
// reflush();
}
RC4::~RC4()
{
m_s.clear();
m_key.clear();
}
RC4::RC4(const RC4& r)
{
srand(time(NULL));
m_s = r.m_s;
m_key = r.m_key;
// m_isEncryption = r.m_isEncryption;
// reflush();
}
RC4& RC4::operator = (const RC4& r)
{
if (this == &r)
{
return *this;
}
m_s = r.m_s;
m_key = r.m_key;
// m_isEncryption = r.m_isEncryption;
return *this;
}
void RC4::randKey()
{
m_key.clear();
int len = abs(rand()%MAX_KEY_SIZE+1);
if (len < MAX_KEY_SIZE/2)
{
len += (MAX_KEY_SIZE/2);
}
for (int i = 0; i < len; ++i)
{
m_key.push_back(abs(rand()%256));
}
}
// void RC4::setKey(const char* key,int len)
// {
// m_key.clear();
// for (int i = 0; i < len; ++i)
// {
// m_key.push_back(key[i]);
// }
// init();
// }
void RC4::init()
{
int keyLen = m_key.size();
m_s.clear();
for (int i = 0; i < MAX_KEY_SIZE+1; ++i)
{
m_s.push_back(i);
}
unsigned int j = 0;
for (int i = 0; i < MAX_KEY_SIZE+1; ++i)
{
/* code */
j = (j+m_s[i]+m_key[i%keyLen])%256;
char temp = m_s[i];
m_s[i] = m_s[j];
m_s[j] = temp;
}
}
void RC4::enCode(unsigned char* data,int len)
{
// reflush();
encryption(data,len);
// m_isEncryption = true;
}
void RC4::deCode(unsigned char* data,int len)
{
encryption(data,len);
// m_isEncryption = false;
}
void RC4::reflush()
{
randKey();
init();
}
void RC4::encryption(unsigned char* data,int len)
{
unsigned int i = 0;
unsigned int j = 0;
unsigned int t = 0;
unsigned char temp = 0;
std::vector<unsigned char> s = m_s;
// CCAssert(s.size()!=0, "RC4 not reflush");
for (int k = 0; k < len; ++k)
{
/* code */
i = (i+1)%256;
j = (j+s[i])%256;
temp = s[i];
s[i] = s[j];
s[j] = temp;
t = (s[i]+s[j])%256;
data[k] ^= s[t];
}
}
|