文件的循环移位加密和异或加密方法,让你的小片从此遁形

文件加密的几种方式

本部分内容主要讨论文件的两种加密方式,一种是循环移位加密,一种是异或加密。

循环移位加密

先了解一下什么是循环移位
//循环移位
//0101 0111 左移2位 0101 1101
//stp1: 0101 0111 <<2 0101 1100
//stp2: 0101 0111 >>6 1111 1101 mask 0000 0011
// 0000 0011 & 0000 0001
//0101 1100 | 0000 0001 结果:0101 1101
//右移
//0101 0101 右移2位 0101 0101
//stp1: 0101 0101 >>2 1101 0101 0101 0101>>6 0100 0000
//stp2: 0000 0011 mask <<6 1100 0000 保留最后两位
//stp3: 0101 0101 | ~1100 0000 0111 1111
//stp4: 1101 0101 & 0111 1111 0101 0101
通过真值表,我们可以知道任何数与1或置1,与0或置0
与1与可以保留原值,以上就是这样的一个原则。而异或操作则是相异则或,相同保持原值。与同一个数异或两次即可得到原值,这也为加密提供了一个途径。
下面给出代码,能够查看每一个数值的二进制

void bitDis(int n)
{
    int m = 32;
    while (m--)
    {
        if(n&(1<<m))
            printf("1");
        else
            printf("0");
        if(m%8==0)
            printf(" ");
    }
    printf("\n");
}

通过这个函数能够查看到每个值的二进制。
下面给出循环移位的代码:

void circleMove(int*p,int n)//输入一个数的指针,n表示移位多少,向左移为正,右移为负数
{
    int m;
    m=n>0? n:-n;
    unsigned int mask = 0;
    while(m--)
    {
        mask|=1<<m;
    }
    if (n>0)
    {
        *p=*p<<n |(*p>>32-n)&(mask);
    }
    else
    {
        *p = ((*p>>-n)) & ~(mask<<(32-(-n))) | (*p)<<(32-(-n));
    }


}

下面我们补充一下unsigned char 类型的数值在右移的过程中高位是自动补零的,而不是补1。这样为循环移位提供了便利,下面给出循环移位的加密代码:

void encode(char*p,int len)
{
    for(int i= 0;i<len;i++)
    {
        unsigned char ch=p[i];
        p[i]=((ch<<1)|(ch>>7));
    }
}

解秘代码:

void decode(char*p,int len)
{
    for(int i= 0;i<len;i++)
    {
        unsigned char ch=p[i];
        p[i]=((ch>>1)|(ch<<7));
    }
}

主菜单函数:

int mymenu()
{
    while(1)
    {
        system("cls");
        printf("       what do you want do?    \n");
        printf("   1.encode file   2.decode file  3.quit system\n");
        int a = 0;
        scanf("%d",&a);
        switch (a) {
        case 1:
            char bencod[20];
            char aencod[20];
            printf("please input your file name(before encode):");
            scanf("%s",bencod);
            printf("please input your file name(after encode):");
            scanf("%s",aencod);
            FILE *fpr = fopen(bencod,"rb");
            FILE *fpw = fopen(aencod,"wb");
            if(NULL==fpr)
                return -1;
            if (NULL==fpw)
                return -1;
            int len=0;
            char buf[1024];
            while((len=fread((void*)buf,1,1024,fpr))>0)
            {
                encode(buf,len);
                fwrite(buf,len,1,fpw);
            }
            printf("encode sucess!!\n");
            fclose(fpr);
            fclose(fpw);

            break;
        case 2:
            char bdecod[20];
            char adecod[20];
            printf("please input your file name(before decode):");
            scanf("%s",bdecod);
            printf("please input your file name(after decode):");
            scanf("%s",adecod);
            FILE * fpr1 = fopen(bdecod,"rb");
            FILE * fpw1 = fopen(adecod,"wb");
            if(NULL==fpr1)
                return -1;
            if (NULL==fpw1)
                return -1;
            int len1=0;
            char buf1[1024];
            while((len1=fread((void*)buf1,1,1024,fpr1))>0)
            {
                decode(buf1,len1);
                fwrite(buf1,len1,1,fpw1);
            }
            printf("decode sucess!!!");
            fclose(fpr1);
            fclose(fpw1);

            break;
        case 3:
            return -1;
            break;
        default:
            break;
        }
    }

}

这样一来就可以对电脑中的二进制文件进行加密和解密,可以对图片,电影…进行加密。下面给出一个效果展示。
1为加密前的文件,二为加密后,3为解密后的文件可以观察到加密和解密后的大小都相同,下面分别播放1,2,3查看效果
文件的循环移位加密和异或加密方法,让你的小片从此遁形_第1张图片1可以正常播放
文件的循环移位加密和异或加密方法,让你的小片从此遁形_第2张图片加密后的文件无法播放
文件的循环移位加密和异或加密方法,让你的小片从此遁形_第3张图片解密后的文件正常播放。
如此一来循环移位加密即完成,下面给出异或加密,原理类似,在此就不赘述,直接上代码

异或加密

void encode1(char*p,char *key)
{
    int len = strlen(p);
    int klen=strlen(key);
    int i,j;
    for(i=0,j=0;i<len;i++,j++)
    {
        if((j%klen)==0)
            j=0;
        if(p[i]!=key[j])
            p[i]^=key[j];
    }


}

void menu()
{
    char words[] = "I love you DWR";
    char *key = "19960315";
    printf("%s\n",words);
    printf("len = %d\n",strlen(words));
    encode1(words,key);
    printf("%s\n",words);
    printf("len = %d\n",strlen(words));
    printf("please input your birthday than you will look i want to express\n");
    char key1[100];
    scanf("%s",key1);
    printf("%s\n",key1);
    encode1(words,key1);
    printf("%s\n",words);



}

结尾

如有什么不妥请大家多多指正

你可能感兴趣的:(C语言学习篇)