Vigenère Cipher code

0

Как я могу изменить этот код, чтобы принимать входные данные от пользователя, а не использовать заданную строку? В частности, мне нужна программа, требующая ровно два аргумента командной строки. Первым будет либо код "-e", либо "-d", чтобы указать кодировку или декодирование сообщения (это определяет добавление или вычитание значений сдвига), а вторым параметром будет одно слово, которое будет ключевым словом которые вы используете для шифрования или дешифрования.

#include <iostream>
#include <cstring>
#include <algorithm>

// Vigenere Cipher Methods:
// Note: assumes that both strings as arguments have length > 0, and that
//       the key only contains letters of the alphabet from [A-Z]

void vigenere_encrypt(std::string& s, std::string key)
{
    std::transform(s.begin(), s.end(), s.begin(), ::toupper);
    std::transform(key.begin(), key.end(), key.begin(), ::toupper);
    unsigned int j = 0;
    for (int i = 0; i < s.length(); i++)
    {
        if (isalpha(s[i]))
        {
            s[i] += key[j] - 'A';
            if (s[i] > 'Z') s[i] += -'Z' + 'A' - 1;
        }
        j = j + 1 == key.length() ? 0 : j + 1;
    }
}

void vigenere_decrypt(std::string& s, std::string key)
{
    std::transform(s.begin(), s.end(), s.begin(), ::toupper);
    std::transform(key.begin(), key.end(), key.begin(), ::toupper);
    unsigned int j = 0;
    for (int i = 0; i < s.length(); i++)
    {
        if (isalpha(s[i]))
        {
            s[i] = s[i] >= key[j] ?
                s[i] - key[j] + 'A' :
                'A' + ('Z' - key[j] + s[i] - 'A') + 1;
        }
        j = j + 1 == key.length() ? 0 : j + 1;
    }
}

int main(void)
{
    std::string s("AceInfinity Example");
    std::string key("Passkey");
    vigenere_encrypt(s, key);
    std::cout << "Encrypted: " << s << std::endl;
    vigenere_decrypt(s, key);
    std::cout << "Decrypted: " << s << std::endl;
    return 0;
}

Обновить

Благодаря вашему вводу и нескольким другим источникам я снова -d разработал мой основной код, как показано ниже. У меня возникают проблемы с тем, что программа расшифровывает и шифрует строки правильно, и я не уверен, что ошибка где-то в самом коде или ошибка оператора. Что-то выглядит необычно здесь и как я могу получить этот функциональный код, где он может шифровать или расшифровывать данные пользователя?

#include <iostream>
#include <string>

int usage( const char* exe_name )
{
    std::cerr << "Usage: " << exe_name << " -e <text to encrypt>\n"
              << "       " << exe_name << " -d <text to decrypt>\n" ;
    return 1 ;
}

int main( int argc, char* argv[] )
{
    if (argc < 3 ) return usage( argv[0] ) ;

    const std::string option = argv[1];

    std::string text = argv[2];
    // cat the remaining cmd line args
    for( int i = 3 ; i < argc ; ++i ) { text += ' ' ; text += argv[i] ; }

    const std::string key("Passkey");

    if ( option== "-e" )
        std::cout << "Encrypt: '" << text << "'\n" ;

    else if ( option == "-d" )
        std::cout << "Decrypt: '" << text << "'\n" ;

    else
    {
        std::cout << "Unrecognised command line option '" << option << "'\n";
        return usage( argv[0] ) ;
    }
}
  • 2
    Что именно вы пробовали? что случилось потом? и как это отличалось от того, что вы ожидали?
  • 0
    Этот текущий код просто содержит одну фиксированную строку для декодирования. Мне нужен код, чтобы принять ввод, указанный для шифрования или дешифрования. Проблема в том, что я новичок в C ++ и обладаю очень ограниченными знаниями. Я собираюсь реализовать синтаксический анализ, как предложено ниже, но я не уверен, как отправить проанализированный ввод в состояние шифрования или дешифрования на основе флага (-e для шифрования или -d для дешифрования). Не могли бы вы дать какой-нибудь совет о том, как действовать?
Показать ещё 2 комментария
Теги:
encryption
vigenere

2 ответа

1

Если вам нужны аргументы командной строки, вам нужно немного изменить прототип вашей основной функции и использовать стандартный массив argv:

int main(int argc, const char** argv)
{
    std::string s("AceInfinity Example");

    if (argc != 3)
    {
        std::cout << "Usage: -e text\n" << "       -d text\n";
        return 0;
    }

    std::string arg1 = argv[1];
    std::string arg2 = argv[2];

    if (arg1 == "-e")
    {
        vigenere_encrypt(s, arg2);
        std::cout << "Encrypted: " << s << std::endl;
    }
    else if (arg1 == "-d")
    {
        vigenere_decrypt(s, arg2);
        std::cout << "Decrypted: " << s << std::endl;
    }
    else
        std::cout << "Unrecognised command line option " << arg1 << "\n";

    return 0;
}

Минимальное усилие сделано для быстрого примера, код, вероятно, работает, e & oe, caveat emptor и т.д.

Конечно, вам будет лучше всего использовать правильный парсинг аргументов командной строки, например getopt, и вам все равно понадобится какой-то способ предоставить открытый текст для шифрования или шифрованного текста для decription, но это оставило упражнение для читателя. Например, чтение из stdin с помощью std::cin - один из способов сделать это.

  • 0
    Парсинг здесь имеет смысл, я не думал об этом раньше, потому что я просто не знал об этой функции (я новичок в C ++). Что касается предоставления текста для шифрования или дешифрования, буду ли я отправлять проанализированные термины из основного в любую функцию в зависимости от флага? Какой лучший способ пойти по этому поводу? Это на грани моих знаний в области программирования
  • 1
    @ kdg926: это начинает отходить от темы. Но короткий ответ о том, где искать дальше: вы могли бы читать текст из stdin, как я и предлагал, вы могли читать текст из файла, анализируя аргументы для -f или чего-то еще, и вы могли бы достаточно легко объединить их, переписав свое шифрование / процедуры дешифрования для использования потоков (см. stackoverflow.com/questions/23050273/… для начала). Но на самом деле следует пробовать что-то и открывать новые вопросы, когда вы сталкиваетесь с конкретными трудностями.
0

Используйте cin для ввода ввода от пользователя и ввода его в строку. Разберите строку, чтобы получить флаги -e / - d и ключевое слово. Если вход не является тем, что вы хотите, попросите пользователя повторить попытку.

  • 1
    Это не соответствует требованию «аргументов командной строки».

Ещё вопросы

Сообщество Overcoder
Наверх
Меню