期末程序设计——利用位运算加密

#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;
        }
    }
}


 测试结果:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值