#include <stdio.h>
#include <stdlib.h>
#define N_P 8
#define N_K 3
int main()
{
unsigned char password[N_P+1],key[N_K+1];
//如果不加一的话,最后加的'\0'可能会占用下一个数组的位置
int en_password[N_P+1];
int i,j;
void encrypt(unsigned char *,unsigned char *);
void decrypt(unsigned char *,int *,unsigned char *);
while(1)
{
fflush(stdin);//清空缓存区
//stdin是文件指针,是编译器默认指向标准输入文件的指针,fflush是对文件的操作
printf("Please enter 1 to encrypt or 2 to decrypt or 3 to exit: ");
scanf("%d",&j);
if(j==3)
exit(0);
if(j!=1&&j!=2)
continue;
printf("Please enter the key:");
scanf("%s",key);//gets接收空格和回车,而scanf不接收空格和回车
while(key[N_K]!='\0')//防止key的格式错误
{
printf("Please enter 3 characters as a key:");
scanf("%s",key);
}
//得到八个字符的字符串实际长度是九个字节,会把'\0'会把key[0]挤掉
key[0]=(key[0]<<N_K)|(key[0]>>(sizeof(key[0])*8-N_K));
//newkey[0]=(key[0]<<3)|(key[0]>>(sizeof(key[0])*8-3));
//_rotl和_rotr函数式对无符号整数进行循环移位的,这里是无符号字符型数据
//newkey[2]=(key[2]>>3)|(key[2]<<(sizeof(key[2])*8-3));
key[2]=(key[2]>>N_K)|(key[2]<<(sizeof(key[2])*8-N_K));
//这里key[2]>>3)|(key[2]<<(sizeof(key[2])*8-3))操作之后得到的是一个整型值
//因为>>后面跟的3是一个整型,所以自动把key[0]<<3的结果转化为了整型
//而把它赋值给一个unsigned char型变量后,结果自动转化为unsigned char型数
//即转化为一个字节存储
//而之前我直接把key[2]>>3)|(key[2]<<(sizeof(key[2])*8-3))赋值给整型变量,就
//没有转化为unsigned char型的过程,所以还是按照整型的四个字节存储
//所以本该溢出的位储存下来,并按照整型解释,所以结果就不对了
//整型数化为无符号的字符型数会发生截断,即把前三个字节截掉
if(j==1)
{
printf("Please enter the original password:");
scanf("%s",password);
while(password[N_P]!='\0')//防止password的格式错误
{
printf("Please enter 8 characters as a password:");
scanf("%s",password);
}
encrypt(password,key);
printf("The password encrypted is:");
for(i=0; i<N_P; ++i)
printf("%d ",password[i]);
printf("\n");
}
else
{
printf("Please enter the encrypted password:");
for(i=0; i<N_P; ++i)
scanf("%d",&en_password[i]);
decrypt(password,en_password,key);
printf("The original password is:");
for(i=0; i<N_P; ++i)
printf("%c",password[i]);
printf("\n");
}
}
return 0;
}
void encrypt(unsigned char *password,unsigned char *key)
{
int i;
for(i=0; i<N_P; ++i)
{
switch(i+1)
{
case 1:
case 4:
case 7:
password[i]^=key[0];
break;
case 2:
case 5:
case 8:
password[i]^=key[1];
break;
default:
password[i]^=key[2];
break;
}
}
}
void decrypt(unsigned char *password,int *en_password,unsigned char *key)
{
int i;
for(i=0; i<N_P; ++i)
{
switch(i+1)
{
case 1:
case 4:
case 7:
password[i]=en_password[i]^key[0];
break;
case 2:
case 5:
case 8:
password[i]=en_password[i]^key[1];
break;
default:
password[i]=en_password[i]^key[2];
break;
}
}
}
测试结果: