本站首页    管理页面    写新日志    退出


«February 2026»
1234567
891011121314
15161718192021
22232425262728


公告

 


我的分类(专题)

日志更新

最新评论

留言板

链接


Blog信息
blog名称:Mr.Sun
日志总数:7
评论数量:22
留言数量:1
访问次数:54447
建立时间:2006年3月9日




[密码技术]RC5密码算法
原创空间,  软件技术

小骏 发表于 2006/3/9 20:26:40

写完RC4,也该写写RC5了,呵呵. 我其实是写完这些密码算法实现之后很久才把这些程序贴上来的,很多东西也记不起来了,只贴程序了.   #include <stdio.h>#include <string.h>#include <math.h>//此程序为RC5加密算法的实现--参数32/12/16int is_Sourcepathright(char *source_path);int is_Destpathright(char *dest_path);int Check(int argc,char **argv);int Crypt(char *sourcepath,char *destpath,char *key);int Decrypt(char *sourcepath,char *destpath,char *key); int main(int argc,char **argv){ if (Check(argc,argv)==0){  return -1; } if (argv[4][0]=='e'||argv[4][0]=='E'){  if(Crypt(argv[1],argv[2],argv[3]))   return 1;  else   return -1; } if (argv[4][0]=='d'||argv[4][0]=='D'){  if(Decrypt(argv[1],argv[2],argv[3]))   return 1;  else   return -1; } return -1;} int is_Sourcepathright(char *source_path){ FILE *fp; if ((fp=fopen(source_path,"rb"))==NULL){  printf("您所输入的文件不存在.");  fclose(fp);  return 0; } else{  fclose(fp);  return 1; }} int is_Destpathright(char *dest_path){ FILE *fp; if ((fp=fopen(dest_path,"wb"))==NULL){  printf("输入的路径不正确.");  fclose(fp);  return 0; } else{  fclose(fp);  return 1; }} int is_InputKeyRight(char *inputkey){ if(strlen(inputkey)==16)  return 1; else  return 0;} int Check(int argc,char **argv){ if(argc!=5){  printf("命令长度有错误。\n");  return 0; } if(is_Sourcepathright(argv[1])==0){  return 0; } if(is_Destpathright(argv[2])==0){  return 0; } if(is_InputKeyRight(argv[3])==0){  printf("输入的密钥不正确。\n");  return 0; } if(strlen(argv[4])>1){  printf("错误的加解密类型。\n");  return 0; } if(argv[4][0]!='e'&&argv[4][0]!='E'&&argv[4][0]!='d'&&argv[4][0]!='D'){  printf("错误的加解密类型。\n");  return 0; } return 1;} int ls(unsigned int input,int nbit){ unsigned int temp; temp=input; if(nbit%32==0)  return input; nbit=nbit%32; input<<=nbit; temp>>=(32-nbit); return input+temp;} int rs(unsigned int input,int nbit){ unsigned int temp; temp=input; if(nbit%32==0)  return input; nbit=nbit%32; input>>=nbit; temp<<=(32-nbit); return input+temp;} void GenerateSubKey(unsigned int *sk,char *key){ int i,j,x,y; int l[4]={0}; int times; sk[0]=0xB7E15163; for(i=1;i<=25;i++)  sk[i]=(sk[i-1]+0x9E3779B9); for(i=0;i<4;i++){  l[i]+=key[0+i*4];  l[i]<<=8;  l[i]+=key[1+i*4];  l[i]<<=8;  l[i]+=key[2+i*4];  l[i]<<=8;  l[i]+=key[3+i*4]; } i=j=x=y=0; for(times=0;times<78;times++){  sk[i]=ls((sk[i]+x+y),3);  x=sk[i];  i=(i+1)%26;  l[j]=ls((l[j]+x+y),x+y);  y=l[j];  j=(j+1)%4; }} void rc5crypt(unsigned char *buf,unsigned char *output,int *sk){ int i; unsigned int a=0,b=0; unsigned int left0=0,left1=0,right0=0,right1=0;  a+=buf[0]; a<<=8; a+=buf[1]; a<<=8; a+=buf[2]; a<<=8; a+=buf[3];  b+=buf[4]; b<<=8; b+=buf[5]; b<<=8; b+=buf[6]; b<<=8; b+=buf[7]; left0=a+sk[0]; right0=b+sk[1]; for(i=1;i<=12;i++){  left1=(ls(left0^right0,right0)+sk[2*i]);  right1=(ls(right0^left1,left1)+sk[2*i+1]);  left0=left1;  right0=right1; } for(i=0;i<8;i++)  output[i]=0; output[0]=(left0>>24)&0xFF; output[1]=(left0>>16)&0xFF; output[2]=(left0>>8)&0xFF; output[3]=(left0>>0)&0xFF;  output[4]=(right0>>24)&0xFF; output[5]=(right0>>16)&0xFF; output[6]=(right0>>8)&0xFF; output[7]=(right0>>0)&0xFF; } void rc5decrypt(unsigned char *buf,unsigned char *output,int *sk){ unsigned int left0=0,left1=0,right0=0,right1=0; unsigned int a=0,b=0; int i;   left1=buf[0];  left1<<=8;  left1+=buf[1];  left1<<=8;  left1+=buf[2];  left1<<=8;  left1+=buf[3];   right1+=buf[4];  right1<<=8;  right1+=buf[5];  right1<<=8;  right1+=buf[6];  right1<<=8;  right1+=buf[7];   for(i=12;i>=1;i--){   right0=(rs(right1-sk[2*i+1],left1)^left1);   left0=(rs(left1-sk[2*i],right0)^right0);   left1=left0;   right1=right0;  }  b=right0-sk[1];  a=left0-sk[0];   for(i=0;i<8;i++)   output[i]=0;   output[0]=(a>>24)&0xFF;  output[1]=(a>>16)&0xFF;  output[2]=(a>>8)&0xFF;  output[3]=(a>>0)&0xFF;   output[4]=(b>>24)&0xFF;  output[5]=(b>>16)&0xFF;  output[6]=(b>>8)&0xFF;  output[7]=(b>>0)&0xFF;} int Crypt(char *sourcepath,char *destpath,char *key){ unsigned int sk[26]={0}; GenerateSubKey(sk,key); FILE *fsource; FILE *fdest; int i; int filesize=0; int crypttimes=0; unsigned char buf[8]={0}; unsigned char output[8]={0}; fsource=fopen(sourcepath,"rb"); fdest=fopen(destpath,"wb"); fseek(fsource,0,2); filesize=ftell(fsource); rewind(fsource); crypttimes=filesize/8; while(crypttimes>0){  for(i=0;i<8;i++)   buf[i]=fgetc(fsource);  rc5crypt(buf,output,sk);  for(i=0;i<8;i++)   fputc(output[i],fdest);  crypttimes--; } if(filesize%8!=0){  for(i=0;i<filesize%8;i++)   buf[i]=fgetc(fsource);  for(i=filesize%8;i<8;i++)   buf[i]=0;  rc5crypt(buf,output,sk);  for(i=0;i<8;i++)   fputc(output[i],fdest); } fputc(filesize%8,fdest); fclose(fsource); fclose(fdest);  return 1;} int Decrypt(char *sourcepath,char *destpath,char *key){ unsigned int sk[26]={0}; GenerateSubKey(sk,key); FILE *fsource; FILE *fdest; int crypttimes,filesize; int i; int flag; unsigned char buf[8]={0}; unsigned char output[8]={0};  fsource=fopen(sourcepath,"rb"); fdest=fopen(destpath,"wb"); fseek(fsource,0,2); filesize=ftell(fsource); rewind(fsource); crypttimes=filesize/8; fseek(fsource,filesize-1,0); flag=fgetc(fsource); rewind(fsource); while(crypttimes>1){  for(i=0;i<8;i++)   buf[i]=fgetc(fsource);  rc5decrypt(buf,output,sk);  for(i=0;i<8;i++)   fputc(output[i],fdest);  crypttimes--; } if(flag==0){  for(i=0;i<8;i++)   buf[i]=fgetc(fsource);  rc5decrypt(buf,output,sk);  for(i=0;i<8;i++)   fputc(output[i],fdest); } else{  for(i=0;i<8;i++)   buf[i]=fgetc(fsource);  rc5decrypt(buf,output,sk);  for(i=0;i<flag;i++)   fputc(output[i],fdest); } fclose(fsource); fclose(fdest);  return 1;}  


阅读全文(3070) | 回复(1) | 编辑 | 精华
 


回复:RC5密码算法
原创空间,  软件技术

cc(游客)发表评论于2010/6/11 15:48:09

怎么运行不出来啊  


个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除
 


回复:RC5密码算法
原创空间,  软件技术

蕾子(游客)发表评论于2006/5/21 23:03:18

请问楼主有rc5的相关资料吗??

个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除
 


» 1 »

发表评论:
昵称:
密码:
主页:
标题:
验证码:  (不区分大小写,请仔细填写,输错需重写评论内容!)



站点首页 | 联系我们 | 博客注册 | 博客登陆

Sponsored By W3CHINA
W3CHINA Blog 0.8 Processed in 0.047 second(s), page refreshed 144839374 times.
《全国人大常委会关于维护互联网安全的决定》  《计算机信息网络国际联网安全保护管理办法》
苏ICP备05006046号