Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.RU > Алгоритмы > Шифр Виженера: переписать код


Автор: jaha 27.12.16, 17:09
Шифр Виженера: переписать код так, чтобы программа не только зашифровала, но и расшифровала текст ...Текст он зашифрует но не расшифрует. А как сделать чтобы он зашифровал и расшифровал текст???

<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    #include "stdafx.h"
    #include <ctime>
    #include <string>
    #include <iostream>
     
    using namespace std;
     
    int _tmain(int argc, _TCHAR* argv[])
     
    {
        string B, C, D = "";
        string A = "abcdefghijklmnopqrstuvwxyz"; //наш алфавит
        setlocale(LC_ALL, "RUS");
        cout « "Введите слово : ";
        cin » B;
        cout « "Введите ключ : ";
        cin » C;
        int* F = new int[B.size()];
        int* G = new int[B.size()];
        int c = C.size(); //делаем замену переменных для удобства
        int b = B.size();
        //Первое условие. Если длина вводимого слова болше, либо равна длине ключа
        if (b >= c)
        {
            for (int i = 0; i < (b / c); i++)
            {
                D = D + C; //Записываем целое количество ключа. Растягиваем ключ по длине слова.
            }
            for (int j = 0; j < (b % c); j++)
            {
                D = D + C[j];
            }
        }
        else
        {
            for (int s = 0; s < b; s++)
            {
                D = D + B[s];
            } //Иначе если ключ длинее слова, ускорачиваем ключ до длины слова.
        }
        cout « D « endl;
        for (int k = 0; k < b; k++)
        {
            for (int n = 0; n < 26; n++)
            {
                if (B[k] == A[n])
                {
                    F[k] = n;
                }
                if (D[k] == A[n])
                {
                    G[k] = n;
                } //Здесь мы уже начинаем щифровать. Смысл заключается а том, что мы ишем номер буквы во
                  //вводимом ключе и номере, а после чего записываем
                //их в массив
            }
        }
        int e = 0;
        for (int u = 0; u < b; u++)
        {
            e = ((F[u] + G[u]) % 26);
            B[u] = A[e];
        }
        cout « "Ваше зашифрованоое слово: " « B « endl;
     
        system("pause");
     
        return 0;
    }

Автор: Славян 27.12.16, 17:33
Ну, согласно вики:
Если буквы A—Z соответствуют числам 0—25, то шифрование Виженера можно записать в виде формулы:
C[u] = (F[u] + G[u]) % 26
Расшифровка:
F[u] = (C[u] - G[u] + 26) % 26

Powered by Invision Power Board (https://www.invisionboard.com)
© Invision Power Services (https://www.invisionpower.com)