已阅读5页,还剩1页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
RC4加密算法C语言实现代码文件名RC4.cpp Encrypt.h(代码详见后文)备注:将以上两个文件放在相同的路径(建议不要放在中文路径下)编译执行!编译环境Microsoft Visual C+ 6.0C-Free 5.0代码解释RC4加密算法是大名鼎鼎的RSA三人组中的头号人物Ron Rivest在1987年设计的密钥长度可变的流加密算法簇。之所以称其为簇,是由于其核心部分的S-box长度可为任意,但一般为256字节。该算法的速度可以达到DES加密的10倍左右。RC4算法的原理很简单,包括初始化算法和伪随机子密码生成算法两大部分。假设S-box长度和密钥长度均为为n。先来看看算法的初始化部分(用类C伪代码表示):for (i=0; in; i+)s=i;j=0;for (i=0; in; i+)j=(j+s+k)%256;swap(s, sj);在初始化的过程中,密钥的主要功能是将S-box搅乱,i确保S-box的每个元素都得到处理,j保证S-box的搅乱是随机的。而不同的S-box在经过伪随机子密码生成算法的处理后可以得到不同的子密钥序列,并且,该序列是随机的:i=j=0;while (明文未结束)+i%=n;j=(j+s)%n;swap(s, sj);sub_k=s(s+sj)%n);得到的子密码sub_k用以和明文进行xor运算,得到密文,解密过程也完全相同。RC4加密算法在C+中的实现: RC4函数(加密/解密):其实RC4只有加密,将密文再加密一次,就是解密了。 GetKey函数:随机字符串产生器。 ByteToHex函数:把字节码转为十六进制码,一个字节两个十六进制。十六进制字符串非常适合在HTTP中传输。 HexToByte函数:把十六进制字符串,转为字节码。 Encrypt函数:把字符串经RC4加密后,再把密文转为十六进制字符串返回,可直接用于传输。 Decrypt函数:直接密码十六进制字符串密文,再解密,返回字符串明文。 源代码以下为 Encrypt.h 文件代码#ifndef _ENCRYPT_RC4_#define _ENCRYPT_RC4_#include #define BOX_LEN 256int GetKey(const unsigned char* pass, int pass_len, unsigned char *out);int RC4(const unsigned char* data, int data_len, const unsigned char* key, int key_len, unsigned char* out, int* out_len); static void swap_byte(unsigned char* a, unsigned char* b);char* Encrypt(const char* szSource, const char* szPassWord); / 加密,返回加密结果char* Decrypt(const char* szSource, const char* szPassWord); / 解密,返回解密结果char* ByteToHex(const unsigned char* vByte, const int vLen); / 把字节码pbBuffer转为十六进制字符串,方便传输unsigned char* HexToByte(const char* szHex); / 把十六进制字符串转为字节码pbBuffer,解码#endif / #ifndef _ENCRYPT_RC4_以下为RC4.cpp 文件代码/ 版权信息/#include #include #include #include Encrypt.h.const int maxn=256+10;char* Encrypt(const char* szSource, const char* szPassWord) / 加密,返回加密结果if(szSource = NULL | szPassWord = NULL) return NULL;unsigned char* ret = new unsigned charstrlen(szSource);int ret_len = 0;if(RC4(unsigned char*)szSource, strlen(szSource), (unsigned char*)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;unsigned char* src = HexToByte(szSource);unsigned char* ret = new unsigned charstrlen(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) return NULL;retret_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)if (data = NULL | key = NULL | out = NULL) return NULL;unsigned char* mBox = new unsigned charBOX_LEN;if(GetKey(key, key_len, mBox) = NULL) return NULL;int i=0;int x=0;int y=0;for(int k = 0; k data_len; k+) x = (x + 1) % BOX_LEN; y = (mBoxx + y) % BOX_LEN; swap_byte(&mBoxx, &mBoxy); outk = datak mBox(mBoxx + mBoxy) % BOX_LEN;*out_len = data_len;delete mBox;return -1;int GetKey(const unsigned char* pass, int pass_len, unsigned char* out)if(pass = NULL | out = NULL) return NULL;int i;for(i = 0; i BOX_LEN; i+) outi = i;int j = 0;for(i = 0; i BOX_LEN; i+) j = (passi % pass_len + outi + j) % BOX_LEN; swap_byte(&outi, &outj); return -1;static void swap_byte(unsigned char* a, unsigned char* b)unsigned char swapByte; swapByte = *a;*a = *b;*b = swapByte;/ 把字节码转为十六进制码,一个字节两个十六进制,内部为字符串分配空间char* ByteToHex(const unsigned char* vByte, const int vLen)if(!vByte) return NULL;char* tmp = new charvLen * 2 + 1; / 一个字节两个十六进制码,最后要多一个0int tmp2;for (int i=0;i9)?A-10:0); tmp2 = (int)(vBytei)%16; tmpi*2+1 = (char)(tmp2+(tmp29)?A-10:0);tmpvLen * 2 = 0;return tmp;/ 把十六进制字符串,转为字节码,每两个十六进制字符作为一个字节unsigned char* HexToByte(const char* szHex)if(!szHex) return NULL;int iLen = strlen(szHex);if (iLen=0 | 0!=iLen%2) return NULL;unsigned char* pbBuf = new unsigned chariLen/2; / 数据缓冲区int tmp1, tmp2;for (int i=0;i=A)?A-10:0); if(tmp1=16) return NULL; tmp2 = (int)szHexi*2+1 - (int)szHexi*2+1=A)?A-10:0); if(tmp2=16) return NULL; pbBufi = (tmp1*16+tmp2);return pbBuf;int main(int argc,char *argv) int size = 0;char Messagemaxn;printf(n=);printf(n RC4 );printf(n=n);printf(n请输入需要加密的消息:);scanf(%s, Message);char sourcemaxn;strcpy(source,Message);char Keymaxn;printf(n请输入符合要求的密钥:);scanf(%s, Key);char passmaxn;strcpy(
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 初中中考试题库及答案
- 传票期末试题及答案
- 春考试题及答案理论
- 初二七巧板试题及答案
- 高中历史“中-国古代选官制度”时空线索梳理复习教案-从世卿世禄到科举取士一条线拉通三千年
- 护理机理与护理哲学
- 抑郁障碍患者的护理人文关怀
- 护理营养支持:优化患者营养
- 护理肿瘤科护理技巧
- 护理管理中的PDCA循环工具箱
- GB/T 7991.6-2025搪玻璃层试验方法第6部分:高电压试验
- DB53∕T 1255-2024 山坝地区建设项目节地评价技术规程
- 会计研究方法论 第4版 课件汇 吴溪 第1-10章 导论- 因果关系推断与内生性问题处理
- 2023年海南海口市疾病预防控制中心及下属单位招考聘用20人笔试题库含答案解析
- 小蚂蚁搬家绘本故事
- 北京2023年北京农商银行社会招聘考试参考题库含答案详解
- 原始记录表格优质资料
- 电网调度自动化系统调试报告模板
- 2022年辽宁省大连市沙河口区小升初数学试卷
- GB/T 713-2014锅炉和压力容器用钢板
- GB/T 27664.1-2011无损检测超声检测设备的性能与检验第1部分:仪器
评论
0/150
提交评论