从别的博主那里找来的代码简单修改了点点,可以循环进行加密:
//RC6加密过程:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
const unsigned int r=20;
const unsigned int w=32;
const unsigned int b=16;
const unsigned int c=4;
const unsigned int p=0xb7e15163;
const unsigned int q=0x9e3779b9;
unsigned int moveleft(unsigned int x,unsigned int y);
unsigned int moveright(unsigned int x,unsigned int y);
void keyextend(unsigned int *s,unsigned int *l);
void encryp(unsigned int *A,unsigned int *B,unsigned int *C,unsigned int *D,unsigned int *S);
void decryp(unsigned int *A,unsigned int *B,unsigned int *C,unsigned int *D,unsigned int *S);
unsigned int moveleft(unsigned int x,unsigned int y)
{
unsigned int i,temp;// 将需要处理的数据统一当做十六进制运算,输入字符的asc码可以通过位移运算处理成十六进制
if(y/32!=0)
y=y%32;
for (i=0; i<y; i++)
{
temp=x&0x80000000;
x=x<<1;//<<和>>表示左移和右移(二进制,十进制的话相当于乘上2的n次方),是不循环的!左移末尾补0,右移前端补1!
x=x+((temp>>31)&0x00000001);
}
return x;
}
unsigned int moveright(unsigned int x,unsigned int y)
{
unsigned int i,temp;//int型和unsigned int最高都可以存放0xffffffff,但前者的第一位(二进制)表示正负,后者才是真正的0xffffffff
if(y/32!=0)
y=y%32;
for (i=0; i<y; i++)
{
temp=x&0x00000001;
x=x>>1;//右移
x=(x&0x7fffffff)+(temp<<31);
}
return x;
}
void keyextend(unsigned int *s,unsigned int *l)//密钥扩展
{
unsigned int i,j,k,a,b;
s[0]=p;
for (i=1; i<=43; i++)
s[i]=s[i-1]+q;
a=0;
b=0;
i=0;
j=0;
for (k=1; k<=132; k++)
{
s[i]=s[i]+a+b;
s[i]=moveleft(s[i],3);
a=s[i];
l[j]=l[j]+a+b;
l[j]=moveleft(l[j],(a+b));
b=l[j];
i=(i+1)%44;
j=(j+1)%4;
}
}
void encryp(unsigned int *A,unsigned int *B,unsigned int *C,unsigned int *D,unsigned int *S)//加密
{
int i,j,t,u,temp;
*B=*B+S[0];
*D=*D+S[1];
j=(unsigned int)(log(w)/log(2));
for (i=1; i<=r; i++)
{
t=moveleft(((*B)*(2*(*B)+1)),j);//t=ROL(B*(2B+1),log2w)
u=moveleft(((*D)*(2*(*D)+1)),j);//u=ROL(D*(2D+1),log2w)
temp=moveleft(((*A)^t),u);//A=ROL(A⊕t,u)+S[2i]
*A=temp+S[2*i];
temp=moveleft(((*C)^u), t);//C=ROL(C⊕u,t)+S[2i+1]
*C=temp+S[2*i+1];
temp=*A;//(A,B,C,D)=(B,C,D,A)
*A=*B;
*B=*C;
*C=*D;
*D=temp;
}
*A=*A+S[2*r+2];
*C=*C+S[2*r+3];
}
void decryp(unsigned int *A,unsigned int *B,unsigned int *C,unsigned int *D,unsigned int *S)//解密
{
unsigned int i,j,u,t,temp;
j=(unsigned int)(log(w)/log(2));
*C=*C-S[2*r+3];
*A=*A-S[2*r+2];
for (i=r; i>=1; i--)
{
temp=*D;// (A,B,C,D)=(D,A,B,C)
*D=*C;
*C=*B;
*B=*A;
*A=temp;
u=moveleft(((*D)*(2*(*D)+1)),j);// u=ROL(D*(2D+1),log2w)
t=moveleft(((*B)*(2*(*B)+1)),j);//t=ROL(B*(2B+1),log2w)
temp=moveright(((*C)-S[2*i+1]),t);//C=ROR(C-S[2i+1],t)⊕u
*C=temp^u;
temp=moveright(((*A)-S[2*i]), u);//A=ROR(A-S[2i],u)⊕t
*A=temp^t;
}
*D=*D-S[1];
*B=*B-S[0];
}
int main()
{
while(1){
unsigned int A,B,C,D,S[2*r+4],L[c]={0};
char plaintxt[16]={0},key[c*4],ciphertxt[16]; //plaintxt接收明文,key接收用户密钥,cipertxt存放解密后明文
unsigned int i,j,temp,keylong;
char g;
printf("请输入明文: ");
for(i=0;i<16;i++)
{
g=getchar();
if (g==' ')
g=getchar();
else if(g=='\n')
break;
plaintxt[i]=g;
}
if(i==16)
getchar(); //缓冲回车符
printf("请输入密钥: ");
for(i=0;i<16;i++)
{
g=getchar();
if (g==' ') {
g=getchar();
}
else if (g=='\n')
break;
key[i]=g;
}
keylong=i;
j=0;
for (i=0; i<keylong; i++)
{
temp=(unsigned int)key[i];
if(i%4==3)
temp=temp<<24;
else if(i%4==2)
temp=temp<<16;
else if(i%4==1)
temp=temp<<8;
L[j]=L[j]+temp;
if (i%4==3)
j++;
}
/*明文处理成十六进制*/
A=((unsigned int)plaintxt[0]<<24)+((unsigned int)plaintxt[1]<<16)+((unsigned int)plaintxt[2]<<8)+(unsigned int)plaintxt[3];
B=((unsigned int)plaintxt[4]<<24)+((unsigned int)plaintxt[5]<<16)+((unsigned int)plaintxt[6]<<8)+(unsigned int)plaintxt[7];
C=((unsigned int)plaintxt[8]<<24)+((unsigned int)plaintxt[9]<<16)+((unsigned int)plaintxt[10]<<8)+(unsigned int)plaintxt[11];
D=((unsigned int)plaintxt[12]<<24)+((unsigned int)plaintxt[13]<<16)+((unsigned int)plaintxt[14]<<8)+(unsigned int)plaintxt[15];
keyextend(S,L);
encryp(&A,&B,&C,&D,S);
printf("密文(A,B,C,D): ");
printf("%x %x %x %x\n",A,B,C,D);
decryp(&A,&B,&C,&D,S);
/*十六进制还原成明文*/
ciphertxt[0]=((A&0xff000000)>>24)&0xff;
ciphertxt[1]=((A&0xff0000)>>16)&0xff;
ciphertxt[2]=((A&0xff00)>>8)&0xff;
ciphertxt[3]=A&0xff;
ciphertxt[4]=((B&0xff000000)>>24)&0xff;
ciphertxt[5]=((B&0xff0000)>>16)&0xff;
ciphertxt[6]=((B&0xff00)>>8)&0xff;
ciphertxt[7]=B&0xff;
ciphertxt[8]=((C&0xff000000)>>24)&0xff;
ciphertxt[9]=((C&0xff0000)>>16)&0xff;
ciphertxt[10]=((C&0xff00)>>8)&0xff;
ciphertxt[11]=C&0xff;
ciphertxt[12]=((D&0xff000000)>>24)&0xff;
ciphertxt[13]=((D&0xff0000)>>16)&0xff;
ciphertxt[14]=((D&0xff00)>>8)&0xff;
ciphertxt[15]=D&0xff;
printf("解密后: ");
for(i=0;i<16;i++)
{
if(ciphertxt[i]==0)
{
printf("\n");
break;
}
printf("%c",ciphertxt[i]);
}
}
return 0;
}
运行截图: