代数密码下字符串—>二进制—>字符串

话不多说,直接上代码

这个密码算法原理很简单,《密码学引论》有介绍

#include 
#include 

int bitch(int c, int *arr,int temp) {
    int num =temp;
    for (int i = 0; i <7 ;i++) {
        arr[temp -1 -i] = (c & 1) ? 1 : 0;
        c >>= 1;
        num--;
    }
    return num;
}

void main()
{
    char M[] ="DATA";
    char S[] ="LAMB";
    size_t len = strlen(M);
    int temp = len*7;
    int M2B[temp];
    int S2B[temp];
    int C2B[temp];
    int C2C[temp];
    char B2M[len];
    while (len>0){
        int number = bitch(M[len-1],M2B,temp);
        bitch(S[len-1],S2B,temp);
        temp = number;
        len--;
    }
    //加密
    for(int k =0;k<strlen(M)*7;k++){
        C2B[k] =M2B[k]^S2B[k];
        printf("%d",C2B[k]);
    }
    printf("\n");
    //密钥
    for(int k =0;k<strlen(M)*7;k++){
        printf("%d",S2B[k]);
    }
    printf("\n");
    //解密
    for(int k =0;k<strlen(M)*7;k++){
        C2C[k] =C2B[k]^S2B[k];
        printf("%d",C2C[k]);
    }
    printf("\n");
    for(int i=0;i<strlen(M);i++){
        int B2B=0;
        for(int j=0;j<7;j++){
            B2B+=C2C[i*7+j]*pow(2,6-j);
//            printf("%d",B2B);
        }
        B2M[i]=B2B;
    }
    printf("%s\n",B2M);

我们来关注一下”字符串—>二进制—>字符串”

  1. 字符串—>二进制

    int bitch(int c, int *arr,int temp) {
        int num =temp;
        for (int i = 0; i <7 ;i++) {
            arr[temp -1 -i] = (c & 1) ? 1 : 0;
            c >>= 1;
            num--;
        }
        return num;
    }

    上面这段代码的思想其实很简单

    1. 参数:c,har,temp 看代码不用解释
    2. i 的范围为0~7,可以理解为是用7位二进制表示一个字符
    3. arr[temp -1 -i] = (c & 1) ? 1 : 0 这一句是移位,目的是得到c中的二进制串
    4. num 是为了输出(密文等)拼接成一个整体
    5. 供参考:如何利用C语言将一句英语转换成01二进制序列
  2. 二进制—>字符串

    for(int i=0;iint B2B=0;
            for(int j=0;j<7;j++){
                B2B+=C2C[i*7+j]*pow(2,6-j);
    //            printf("%d",B2B);
            }
            B2M[i]=B2B;
        }
    1. 可以理解为上面的逆过程(j:0~7)
    2. B2B+=C2C[i*7+j]*pow(2,6-j) 目的是得到明文单个字符对应的ascii码

输出结果:
0001000000000000110010000011
1001100100000110011011000010
1000100100000110101001000001
DATA


总结

  • c语言很重要的位移(c 中最重要的内容之一)
  • 执行逻辑关系,对应转换关系

你可能感兴趣的:(语法,实验,c,c语言,二进制,密码)