Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 解密Vernam密码_C - Fatal编程技术网

C 解密Vernam密码

C 解密Vernam密码,c,C,我正在为Vernam Cipher创建一个加密和解密代码 最初,要加密消息,我必须使用生成OTP的函数。此函数生成1-26之间的随机数(表示英文字母),并存储在整数数组中。大小等于要加密的消息的长度 我能做到。我的问题是如何解密它 我有这个密码 我的OTP数组,因为每个元素在1-26之间随机化,将表示字母表的第n个字母。e、 g.25表示字母“y”等。 我的加密逻辑是,由于我的OTP数组的大小等于我的消息的长度,我将对我的消息和我的OTP的每个字符执行异或。这是在根据每个元素的随机分配编号将我的

我正在为Vernam Cipher创建一个加密和解密代码

最初,要加密消息,我必须使用生成OTP的函数。此函数生成1-26之间的随机数(表示英文字母),并存储在整数数组中。大小等于要加密的消息的长度

我能做到。我的问题是如何解密它

我有这个密码

我的OTP数组,因为每个元素在1-26之间随机化,将表示字母表的第n个字母。e、 g.25表示字母“y”等。 我的加密逻辑是,由于我的OTP数组的大小等于我的消息的长度,我将对我的消息和我的OTP的每个字符执行异或。这是在根据每个元素的随机分配编号将我的OTP数组转换为字母表中相应的字母之后。 我已经可以做加密部分了。但每当我尝试解密时,我得到的信息与我最初输入的不同

void encryptiondecryption(char msg[], char key[]){
    
    int i,j=0,x,m=0;

    char output[100];
    char output2[100];

/* Loop to remove all spaces in the message here*/  

/*Encryption*/    
    int modd;
    for(x = 0; msg[x]!='\0'; x++) {
    printf("\nletter:%c - key:%c",msg[x], key[x] );
        modd = (msg[x] ^ key[x]);
        if(modd == 26){
            output[x] = 'a'+ (modd%26)+25;
        }else{
            output[x] = 'a'+ (modd%26)-1;
        }
    }
    output[x]='\0';

    printf("\nEncrypted Message:\n");
    for(x = 0; output[x]!='\0'; x++) {
        printf("%c",output[x]);
    }

/* decryption */

    int modd2,diff,sum, toXOR;
    printf("\n\ndecryption\n");

    for(x = 0; output[x]!='\0'; x++) {
        printf("\nletter:%c - key:%c",output[x], key[x] );
        diff = output[x] - 'a';
        if(diff == 25){
            sum = diff - 25;
            toXOR = sum + 26;
            output2[x] = toXOR ^ key[x];
        }else{
            sum = diff + 1;
            toXOR = sum + 26;
            output2[x] = toXOR ^ key[x];
        }

    }

    output2[x]='\0';
    printf("\n Output for Decryption\n");
        for(i = 0;  output2[i]!='\0'; i++) {
        printf("%c",output2[i]);
    }
}
此外,这是我的generateOTP函数

char* generateKey(char msg[]){
    srand(time(NULL)); 
    int len = strlen(msg);
    

    int numbers[len];
    int x,y=0, m=0,a;
    
    for(x=0;x<len;x++){
        if(msg[x]!='_') m++;
    }

    
    printf("generated key is . . .\n");
    int *getOTP = malloc (sizeof (int)*len);
    
    for(x=0;x<m;x++){
        getOTP[x] = rand() % (26 - 1 + 1) + 1;
    }
    for(x=0;x<m;x++){
        printf("%d ", getOTP[x]);
    }
    
    char *letterOTP = malloc (sizeof (char) * len);
    int getOTP2[m];
    for(x=0;x<m;x++){
        getOTP2[x] = getOTP[x];
    }

    int md;
    for(x=0;x<m;x++){
        md = (getOTP2[x]) % 26;
        if(md ==0){
            letterOTP[x] =( 97 + (md));
        }else{
            letterOTP[x] =( 97 + (md) - 1);
        }
        
    }
    letterOTP[x] = '\0';

    return letterOTP;
    
}
char*generateKey(char msg[]){
srand(时间(空));
int len=strlen(msg);
整数[len];
int x,y=0,m=0,a;

对于(x=0;xyo在用密钥对消息进行异或运算后应用模26。这会不会导致信息松散?@Emanuel P我也是这么想的。例如,我在加密后得到了“c”,可能会有多种可能性。因为在应用模26之前,我可能得到了4或30左右。是的,但我认为这正是问题所在。如果“c”代表e示例是30,“z”是4,然后在mod 26之后,它们都是4。因此,您无法知道将4解密为什么。@rinrin我真的不明白为什么您在加密期间执行
%26
。对于Vernam cipher,只需将密钥与加密输出进行异或即可解密。这就是全部内容。可以吗你解释模运算的原因吗?@Zoso我在课堂上讨论了它是如何被加密的。我应用了mod 26,这样我就可以用字母来显示它了