Шифрование методом плейфера с++

Рейтинг: 0Ответов: 1Опубликовано: 07.04.2015

Просить написать программу - глупо(ну я и сам хочу ее написать), но я споткнулся на моменте когда нужно зашифровывать данные, не могу понять как это сделать, может кто подскажет, от чего надо отталкиваться(правила шифровки знаю, код написать не получается)

Ответы

▲ 2Принят

Ну вот вам код.

Предполагая, что вы правильно заполнили матрицу 5x5 в двумерном массиве mat[5, 5]:

using namespace std;

string Encode(string cleartext)
{
    string result;
    char prev;
    bool hasPrev = false;
    for (char curr : cleartext)
    {
        if (!hasPrev) // ожидаем конца биграммы
        {
            prev = curr;
            hasPrev = true;
            continue;
        }
        char c1, c2;
        // правило 1
        if (prev == curr)
        {
            EncodePair(curr, 'X', result);
        }
        else
        {
            EncodePair(prev, curr, result);
            hasPrev = false;
        }
    }
    if (hasPrev)
        EncodePair(prev, 'X', result);
    return result;
}

void EncodePair(char prev, char curr, string& s)
{
    Index idxPrev = indexByChar[prev];
    Index idxCurr = indexByChar[curr];
    assert(idxPrev.Row != idxCurr.Row ||
           idxPrev.Col != idxCurr.Col);
    Index resPrev, resNext;
    if (idxPrev.Row == idxCurr.Row) // правило 2
    {
        resPrev = idxPrev.NextCol();
        resNext = idxNext.NextCol();
    }
    else if (idxPrev.Col == idxCurr.Col) // правило 3
    {
        resPrev = idxPrev.NextRow();
        resNext = idxNext.NextRow();
    }
    else // правило 4
    {
        resPrev = Index(idxPrev.Row, idxNext.Col);
        resNext = Index(idxNext.Row, idxPrev.Col);
    }
    s += matrix[resPrev.Row, resPrev.Col];
    s += matrix[resNext.Row, resNext.Col];
}

Вам придётся заполнить map<char, Index> indexByChar, чтобы по символу находить его строку и столбец в матрице (понятно, как?). Структура Index очевидна:

struct Index
{
    int Row;
    int Col;

    Index(int row, int col)
    {
        Row = row;
        Col = col;
    }

    static Index NextRow()
    {
        int r = (Row + 1) % 5;
        return Index(r, Col);
    }

    static Index NextCol()
    {
        int c = (Col + 1) % 5;
        return Index(Row, c);
    }
};