C中Vigenere的密码移位问题

Posted

技术标签:

【中文标题】C中Vigenere的密码移位问题【英文标题】:Shift problem of cipher with Vigenere in C 【发布时间】:2019-01-31 02:03:06 【问题描述】:

我对编程非常陌生,并且在 edX 课程 CS50 中使用 C 语言 Vigenere 时遇到了一些困难。我已将问题分解为大写字母和小写字母,我现在只是试图解决大写字母问题。我使用单词“panda”作为我的密钥,使用“ILIKEYOU”作为明文。当我运行程序时,第一个字母对应于我希望它是 (23=X) 的字母。在那之后,程序似乎只是为剩下的 7 个字母吐出随机数。我没有转换回 ASCII,因为我的代码有很多问题。有什么想法吗?非常感谢大家的帮助:)

#include <cs50.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

int main(int argc, string argv[])

// Print error message if the user imput is executed without any 
command-line arguments or with more than one command-line argument
if (argc != 2)

    printf("Usage: ./vigenere k\n");
    return 1;


// Access key
string key = argv[1];

// Convert the array from a string to an int
int letter;
letter = atoi(argv[1]);

// Print error message if the user imput is one command-line argument 
and contains *any* non-alphabetical character(s)
for (int c = 0; c < strlen(key); c++)

    if (!isalpha (key[c]))
    
        printf("Usage: ./vigenere k\n");
        return 1;
    
 

// Prompt the user for a string of plaintext
string p;
p = get_string("plaintext:");

//Print ciphertext
printf("ciphertext: ");

 // Accessing each character in the plaintext
for (int i = 0, n = strlen(p); i < n; i++)

    // Shift letters only in the plaintext
    if (isalpha(p[i]))
    

        // Convert plaintext and key to ASCII capital letters to 
        alphabetical index
        // Encipher capital letters in plaintext and print
        int c = 0;
        if (isupper(p[i]))
        
           printf("%i\n", ((p[i] - 65) + (toupper(key[c]) - 65)) % 26);
        
    

【问题讨论】:

【参考方案1】:

需要少量修改 -

int index_key = 0;
int shift= 0;
int key_len = strlen(key);
for (int i = 0, n = strlen(p); i < n; i++)

    // Shift letters only in the plaintext
    if (isalpha(p[i]))
    
        // Convert plaintext and key to ASCII capital letters to 
        //alphabetical index
        // Encipher capital letters in plaintext and print
        if (isupper(p[i]))
        
           shift = ((p[i] - 'A') + (toupper(key[index_key % key_len]) - 'A')) % 26;
           index_key++;
           printf("%c", p[i] + shift);
        
    

【讨论】:

Srivatahc 非常感谢您的帮助!除了 [index_key % key_len] 我什么都懂... index_key % key_len 只是在到达密钥末尾后回绕到开头(当密钥长度小于要加密的消息长度时)。

以上是关于C中Vigenere的密码移位问题的主要内容,如果未能解决你的问题,请参考以下文章

java中的ASCII Vigenere密码实现

Vigenere Cipher(Java)[重复]

vigenere密码c语言

C Vigenere 密码不打印

C中的Vigenere密码

Vigenere密码[关闭]