📄 rc5.cpp
字号:
// RC5.cpp : 定义控制台应用程序的入口点。
#include <stdio.h>
#include <string.h>
#include <math.h>
//此程序为RC5加密算法的实现--参数32/12/16
int is_Destpathright(char *dest_path);
int is_Sourcepathright(char *source_path);
int Check(int argc,char **argv);
int Encrpt(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(Encrpt(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 Key_Ger(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 Encrpt(char *sourcepath,char *destpath,char *key)
{
unsigned int sk[26]={0};
Key_Ger(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};
Key_Ger(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;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -