RC4加密算法在C++中的实现(转)
来源:互联网 发布:昆仑墟进阶数据 编辑:程序博客网 时间:2024/05/22 12:03
在一些场合,常需要用到一些简单的加密算法,这里的RC4就可以说是最简单的一种。只要设置一个足够强的密码,就可以适用于一些非常简单的场合了。我是用来加密HTTP传送的数据的。
RC4函数(加密/解密) 其实,RC4只有加密,将密文再加密一次,就是解密了。
GetKey函数 随机字符串产生器,呵呵,为了方便,大多数加密算法都有一个随机密码产生器,我也就附带一个了。
ByteToHex函数 把字节码转为十六进制码,一个字节两个十六进制。研究发现,十六进制字符串非常适合在HTTP中传输,Base64中的某些字符会造成转义,挺麻烦的。
HexToByte函数 把十六进制字符串,转为字节码。服务器也按照十六进制字符串的形式把数据传回来,这里就可以解码啦。同时,使用十六进制字符串传输,避开了传输过程中多国语言的问题。
Encrypt函数 把字符串经RC4加密后,再把密文转为十六进制字符串返回,可直接用于传输。
Decrypt函数 直接密码十六进制字符串密文,再解密,返回字符串明文。
源码如下:
Encrypt.h文件:
以下是代码片段:
#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);
static 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_
Encrypt.cpp文件:
以下是代码片段:
#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;
}
static 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;
}
- RC4加密算法在C++中的实现(转)
- RC4加密算法在C++中的实现
- RC4加密算法在C#中的实现
- RC4加密算法在C++中的实现
- RC4加密算法在C#中的实现
- RC4加密算法在C++中的实现
- 经典加密算法在VB中的实现(3)- RC4
- 用 Objective-C 实现的 Rc4 加密算法
- RC4加密算法及其实现
- RC4加密算法实现
- VB 6.0中的RC4加密算法
- RC4加密算法及其scala实现
- RC4加密算法
- rc4加密算法
- RC4加密算法
- RC4加密算法
- RC4加密算法
- rc4加密算法
- 尝试在 Windows Server 2003 或 Windows XP 中安装大型 Windows Installer 程序包或大型 Windows Installer 修补程序包时出现错误消息:“Error 1718. File was rejecte
- = 网络基础总汇 =
- 确定一项出现在List中的次数
- TNS-12541: TNS: 无监听程序
- asp.net在ie7中使用FileUpload上传前预览图片
- RC4加密算法在C++中的实现(转)
- FTP命令大全
- socket 编程
- FTP命令行使用精萃
- cannot be resolved to a type的解决方案
- 一个短信系统的服务器端设计
- 线程学习代码
- NET命令全接触!!
- No MFC 编程03 - 检测全局键盘