| « | February 2026 | » | | 日 | 一 | 二 | 三 | 四 | 五 | 六 | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | |
| 公告 |
|
| Blog信息 |
|
blog名称:Mr.Sun 日志总数:7 评论数量:22 留言数量:1 访问次数:54446 建立时间: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;}
|
|
|
回复:RC5密码算法 原创空间, 软件技术
cc(游客)发表评论于2010/6/11 15:48:09 |
|
|
回复:RC5密码算法 原创空间, 软件技术
蕾子(游客)发表评论于2006/5/21 23:03:18 |
|
» 1 »
|