Задать вопрос
@EgaNator
Учусь на программиста

Как реализовать шифр блочной одинарной перестановки?

По заданию нужно реализовать шифр блочной одинарной перестановки.
Например, вводится слово "СТРЕЛКА" и ключ "2 3 1". В результате получается "ТРСЛКЕЭЭА". То есть, исходное слово делится на блоки по 3 буквы, если символов в последнем блоке не достаёт, то добавляется символ "Э": "СТР", "ЕЛК" "АЭЭ".
Я реализовал шифр простой одинарной перестановки, но блочной что-то не выходит. Как его реализовать?
Моя реализация шифра простой одинарной перестановки:
#include <iostream>
#include <conio.h>
#include <string>
#include <windows.h>
using namespace std;
 
int main() {
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
 
    string message;
    const int n = 8;
    int key[n];
 
    cout << "Введите текст: ";
    cin >> message;
    cout << "Введите ключ (размер ключа = 8): ";
    for (int i = 0; i < n; i++)
    {
        cin >> key[i];
    }
 
    string new_message = "";
    for (int i = 0; i < n; i++) {
        new_message += message[key[i] - 1];
    }
    cout << "Зашифрованный текст: " << new_message;
 
 
    _getch();
    return 0;
}
  • Вопрос задан
  • 1761 просмотр
Подписаться 2 Простой Комментировать
Решения вопроса 1
ProgrammerForever
@ProgrammerForever
Учитель, автоэлектрик, программист, музыкант
Вот так, например:
int main() {
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
 
    string message;
    const int block_size = 8;
    int key[block_size];
 
    cout << "Введите текст: ";
    cin >> message;
    for (int i = 0; i < message.length()%block_size; i++){
        message+= "_"; // default symbol
    };
    cout << "Введите ключ через пробел(размер ключа: " << block_size << " ): ";
    for (int i = 0; i < block_size; i++)
    {
        cin >> key[i];
    }
 
    string encrypt_message = "";
    
    int text_length = message.length();
    for (int block_index = 0; block_index <= text_length/block_size; block_index++) {
    	for (int offset = 0; offset < block_size; offset++) {
    		encrypt_message += message[block_index*block_size + key[offset] - 1];
    	};
    };

    cout << "Зашифрованный текст: " << encrypt_message;
    
    _getch();
    return 0;
}

Пример в онлайн-компиляторе
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы