Простое шифрование с ключом шифрования - PullRequest
0 голосов
/ 31 января 2019

Я делаю простое шифрование.У меня есть функция под названием шифрование (текст строки, строка encryption_key).Он должен заменить текст a на первую букву encryption_key, b на секунду и так далее.Я пытаюсь решить это с помощью значений ASCII.

Я не уверен, что считаю это правильным, но я пробовал что-то вроде этого:

void encryption(std::string text, std::string encryption_key){
    for(long unsigned int i=0; i< encryption_key.length();i++){
        char letter = encryption_key.at(i);
        for(char j = 'a'; j<='z'; j++){
            if(text.find(j) != std::string::npos){
                text.at(j)= letter;
            }
        }
    std::cout<<"Encrypted text: "<< text<<std::endl;
    }
}

Я получаю "terminate" после вызова экземпляра 'std :: out_of_range'what (): basic_string :: at: __n (который равен 101)> = this-> size () (который равен 5) Нажмите, чтобы закрыть это окно ... "

Правильна ли идея, которую я пробуюсначала пройти символы ключа шифрования и заменить символы (az) в тексте?

Ответы [ 3 ]

0 голосов
/ 31 января 2019

Исправление к вашему коду: text.at(text.find(j)) = letter;

void encryption(std::string text, std::string encryption_key){
    for(long unsigned int i=0; i< encryption_key.length();i++){
        char letter = encryption_key.at(i);
        for(char j = 'a'; j<='z'; j++){
            if(text.find(j) != std::string::npos){
                text.at(text.find(j))= letter;
            }
        }
    std::cout<<"Encrypted text: "<< text<<std::endl;
    }
}

Я верю, однако, алгоритм неверен из того, что вы описали.

РЕДАКТИРОВАТЬ: Без использования библиотек вы можете сделать:

void encryption(std::string text, std::string encryption_key)
{
    for (int i=0; i<text.length(); i++)
    {
        for (char ch = 'a'; ch<='z'; ch++)
        {
            if (text[i] == ch)
            {
                text[i] = encryption_key[ch-'a'];
                break;
            }
        }    
    }

    std::cout<<"Encrypted text: "<< text<<std::endl;
}
0 голосов
/ 31 января 2019

Используя алгоритм replace, вы можете просто сделать это.Он пройдет через строку text и заменит все вхождения определенной буквы на соответствующее значение в encryption_key.Здесь encryption_key содержит зашифрованные значения для всех маленьких букв.

void encryption(std::string text, std::string encryption_key){
    int j = 0;
    for(auto i = 'a'; i <= 'z'; i++) //text has only small letters
    {
        std::replace( text.begin(), text.end(), i, encryption_key.at(j)); 
        j++;
    }
    std::cout <<"Encrypted text: "<< text<<std::endl;   
}

См. DEMO

0 голосов
/ 31 января 2019

Исправлено:

auto pos = text.find(j);
if(pos != std::string::npos) {
    text[pos] = letter;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...