RC4加密算法(记录)

论坛 期权论坛 脚本     
已经匿名di用户   2022-5-29 19:05   973   0

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

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

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

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 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:81
帖子:4969
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP