RC4算法 RC4加密算法 ------------------------------------------------------------------------------ RC4是由RSA Security的Ron Rivest 在1987年开发出来的,虽然它的官方名是“Rivest Cipher 4”,但是首字母缩写RC也可以理解为Ron's Code。RC4开始时是商业密码,没有公开发表出来,但是在94年9月份的时候,它被人匿名公开在了Cypherpunks 邮件列表上,很快它就被发到了sci.crypt 新闻组上,随后从这儿传播到了互联网的许多站点。随之贴出的代码后来被证明是很有水平的,因为它的输出跟取得了RC4版权的私有软件的输出是完全的。由于算法已经公开,rc4也就不再是商业秘密了,只是它的名字“RC4”仍然是一个注册商标。RC4经常被称作是“ARCFOUR”或者"ARC4"(A lleged RC4,所谓的RC4,因为RSA从来没有官方公布这个算法),这样来避免商标使用的问题。它已经成为一些广泛使用的协议和标准的一部分,比如,包括WEP和WPA的无线网卡和TLS。
让它如此广泛分布和使用的主要因素是它不可思议的简单和速度,不管是软件还是硬件,实现起来都十分容易。 -------------------------------------------------------------------------- RC4加密算法在C++中的实现 在一些场合,常需要用到一些简单的加密算法,这里的RC4就可以说是最简单的一种。只要设置一个足够强的密码,就可以适用于一些非常简单的场合了。我是用来加密HTTP传送的数据的。 RC4函数(加密/解密) 其实,RC4只有加密,将密文再加密一次,就是解密了。 GetKey函数 随机字符串产生器,呵呵,为了方便,大多数加密算法都有一个随机密码产生器,我也就附带一个了。 ByteToHex函数 把字节码转为十六进制码,一个字节两个十六进制。研究发现,十六进制字符串非常适合在HTTP中传输,Base64中的某些字符会造成转义,挺麻烦的。 HexToByte函数 把十六进制字符串,转为字节码。服务器也按照十六进制字符串的形式把数据传回来,这里就可以解码啦。同时,使用十六进制字符串传输,避开了传输过程中多国语言的问题。 Encrypt函数 把字符串经RC4加密后,再把密文转为十六进制字符串返回,可直接用于传输。 Decrypt函数 直接密码十六进制字符串密文,再解密,返回字符串明文。 源码如下: Encrypt.h文件: #ifndef _ENCRYPT_RC4_ #include #define BOX_LEN 256 int GetKey(const unsigned char* pass, int pass_len, unsigned char *out); char* Encrypt(const char* szSource, const char* szPassWord); // 加密,返回加密结果 char* ByteToHex(const unsigned char* vByte, const int vLen); // 把字节码pbBuffer转为十六进制字符串,方便传输 #endif // #ifndef _ENCRYPT_RC4_ Encrypt.cpp文件: #include "Encrypt.h" char* Encrypt(const char* szSource, const char* szPassWord) // 加密,返回加密结果 unsigned char* ret = new unsigned char[strlen(szSource)]; int ret_len = 0; if(RC4((unsigned char*)szSource, char* ret2 = ByteToHex(ret, ret_len); delete[] ret; char* Decrypt(const char* szSource, const char* szPassWord) // 解密,返回解密结果 unsigned char* src = HexToByte(szSource); unsigned char* ret = new unsigned char[strlen(szSource) / 2 + 1]; int ret_len = 0; memset(ret, strlen(szSource) / 2 + 1,0); if(RC4(src, strlen(szSource) / 2, (unsigned char*)szPassWord, strlen(szPassWord), ret, &ret_len) == NULL) ret[ret_len] = '\0'; return (char*)ret; int RC4(const unsigned char* data, int data_len, const unsigned char* key, int key_len, unsigned char* out, int* out_len) unsigned char* mBox = new unsigned char[BOX_LEN]; if(GetKey(key, key_len, mBox) == NULL) int i=0; *out_len = data_len; int GetKey(const unsigned char* pass, int pass_len, unsigned char* out) int i; for(i = 0; i < BOX_LEN; i++) int j = 0; return -1; static void swap_byte(unsigned char* a, unsigned char* b) *a = *b; *b = swapByte; // 把字节码转为十六进制码,一个字节两个十六进制,内部为字符串分配空间 |
|
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系
[邮箱地址] 删除
|