RC4加密算法(记录)

说到这个,不得不吐一下国内,百度一下,全都是一样的,。。。

自己写一个,遇到了一些问题,这里记录一下,

遇到的问题先说下,就是百度里等一些描述里

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



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值