RC4

#ifndef _ENCRYPT_RC4_
#define _ENCRYPT_RC4_

#include <afx.h>
#include<windows.h>
#include<string.h>

#define BOX_LEN 256

int GetKey(const PBYTE pass, UINT pass_len, PBYTE out);
int RC4(const PBYTE data, UINT data_len, const PBYTE key, UINT key_len, PBYTE out, PUINT out_len); 
void swap_byte(PBYTE a, PBYTE b);

char* Encrypt(const char* szSource, const char* szPassWord); // 加密,返回加密结果
char* Decrypt(const char* szSource, const char* szPassWord); // 解密,返回解密结果

char* ByteToHex(const PBYTE vByte, const UINT vLen); // 把字节码pbBuffer转为十六进制字符串,方便传输
PBYTE HexToByte(const char* szHex); // 把十六进制字符串转为字节码pbBuffer,解码

#endif // #ifndef _ENCRYPT_RC4_

 
#include "StdAfx.h"
#include "Encrypt.h"
char* Encrypt(const char* szSource, const char* szPassWord) // 加密,返回加密结果
{
	 if(szSource == NULL || szPassWord == NULL) return NULL;
	 PBYTE ret = new BYTE[strlen(szSource)];
	 UINT ret_len = 0;
	 if(RC4((PBYTE)szSource, strlen(szSource), (PBYTE)szPassWord, strlen(szPassWord), ret, &ret_len) == NULL) return NULL;
	 char* ret2 = ByteToHex(ret, ret_len);
	 delete[] ret;
	 return ret2;
}

char* Decrypt(const char* szSource, const char* szPassWord) // 解密,返回解密结果
{
	 if(szSource == NULL || (strlen(szSource)%2 != 0) || szPassWord == NULL) return NULL;
	 PBYTE src = HexToByte(szSource);
	 PBYTE ret = new BYTE[strlen(szSource) / 2 + 1];
	 UINT ret_len = 0;
	 ZeroMemory(ret, strlen(szSource) / 2 + 1);
	 if(RC4(src, strlen(szSource) / 2, (PBYTE)szPassWord, strlen(szPassWord), ret, &ret_len) == NULL) return NULL;
	 ret[ret_len] = '\0';
	 return (char*)ret;
}

int RC4(const PBYTE data, UINT data_len, const PBYTE key, UINT key_len, PBYTE out, PUINT out_len)
{
	 if (data == NULL || key == NULL || out == NULL) return NULL;

	 PBYTE mBox = new BYTE[BOX_LEN];
	 if(GetKey(key, key_len, mBox) == NULL) return NULL;

	 UINT i=0;
	 int x=0;
	 int y=0;
 
	 for(UINT k = 0; k < data_len; k++)
	 {
	  x = (x + 1) % BOX_LEN;
	  y = (mBox[x] + y) % BOX_LEN;
	  swap_byte(&mBox[x], &mBox[y]);
	  out[k] = data[k] ^ mBox[(mBox[x] + mBox[y]) % BOX_LEN];
	 }
	 *out_len = data_len;
	 delete[] mBox;
	 return -1;
}

int GetKey(const PBYTE pass, UINT pass_len, PBYTE out)
{
	 if(pass == NULL || out == NULL) return NULL;

	 int i;

	 for(i = 0; i < BOX_LEN; i++)
	  out[i] = i;

	 int j = 0;
	 for(i = 0; i < BOX_LEN; i++)
	 {
	  j = (pass[i % pass_len] + out[i] + j) % BOX_LEN;
	  swap_byte(&out[i], &out[j]); 
	 } 
	 return -1;
}

void swap_byte(PBYTE a, PBYTE b)
{
	 BYTE swapByte; 
 
	 swapByte = *a;
	 *a = *b;
	 *b = swapByte;
}

// 把字节码转为十六进制码,一个字节两个十六进制,内部为字符串分配空间
char* ByteToHex(const PBYTE vByte, const UINT vLen)
{
	 if(!vByte) return NULL;
	 char* tmp = new char[vLen * 2 + 1]; // 一个字节两个十六进制码,最后要多一个'\0'
	 int tmp2;
	 for (UINT i=0;i<vLen;i++)
	 {
	  tmp2 = (int)(vByte[i])/16;
	  tmp[i*2] = (char)(tmp2+((tmp2>9)?'A'-10:'0'));
	  tmp2 = (int)(vByte[i])%16;
	  tmp[i*2+1] = (char)(tmp2+((tmp2>9)?'A'-10:'0'));
	 }
	 tmp[vLen * 2] = '\0';
	 return tmp;
}

// 把十六进制字符串,转为字节码,每两个十六进制字符作为一个字节
PBYTE HexToByte(const char* szHex)
{
	 if(!szHex) return NULL;
	 int iLen = strlen(szHex);
	 if (iLen<=0 || 0!=iLen%2) return NULL;
	 PBYTE pbBuf = new BYTE[iLen/2];  // 数据缓冲区
	 int tmp1, tmp2;
	 for (int i=0;i<iLen/2;i++)
	 {
		  tmp1 = (int)szHex[i*2] - (((int)szHex[i*2]>='A')?'A'-10:'0');
		  if(tmp1>=16) return NULL;
		  tmp2 = (int)szHex[i*2+1] - (((int)szHex[i*2+1]>='A')?'A'-10:'0');
		  if(tmp2>=16) return NULL;
		  pbBuf[i] = (tmp1*16+tmp2);
	 }
	 return pbBuf;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值