Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

algebra3

.cpp
Скачиваний:
0
Добавлен:
18.02.2023
Размер:
3.84 Кб
Скачать
// algebra3.cpp

#include <iostream>
#include <string>
using namespace std;

const int kk = 12;
const int p = 257;
const int len = 3 * kk;

int x, y, z, z3;
int d[4][4], delta;
int shifr[4][len + 1], mas0[3][len + 1];
int b[4] = { 0, 123, 66, 38 };
int a[4][4] = {
    {0, 0, 0, 0},
    {0, 3, 0, 5},
    {0, 13, 15, 7},
    {0, 4, 6, 18}
};
string s;
int mas[len + 2];

int f(int delta, int p);

int main()
{
    cout << "algebra3.cpp" << endl;
    s = "Moscow State University 265 years";

    s += string(len - s.length(), ' '); // наращиваем строку до len

    d[1][1] = (a[2][2] * a[3][3] - a[2][3] * a[3][2]) % p;
    d[2][1] = (a[3][1] * a[2][3] - a[2][1] * a[3][3]) % p;
    d[3][1] = (a[2][1] * a[3][2] - a[2][2] * a[3][1]) % p;
    d[1][2] = (a[3][2] * a[1][3] - a[1][2] * a[3][3]) % p;
    d[2][2] = (a[1][1] * a[3][3] - a[1][3] * a[3][1]) % p;
    d[3][2] = (a[1][2] * a[3][1] - a[1][1] * a[3][2]) % p;
    d[1][3] = (a[1][2] * a[2][3] - a[1][3] * a[2][2]) % p;
    d[2][3] = (-1 * a[1][1] * a[2][3] + a[2][1] * a[1][3]) % p;
    d[3][3] = (a[2][2] * a[1][1] - a[1][2] * a[2][1]) % p;
    delta = a[1][1] * (a[2][2] * a[3][3] - a[3][2] * a[2][3]);
    delta -= a[1][2] * (a[2][1] * a[3][3] - a[3][1] * a[2][3]);
    delta += a[1][3] * (a[2][1] * a[3][2] - a[3][1] * a[2][2]);
    delta %= p;
    z3 = f(delta, p);
    cout << (delta * z3) % p << endl;
    if (!delta == 0)
        cout << "delta = " << delta << endl;
    else
    {
        cout << "viberete drugie kluchi" << endl;
        cout << "delta = " << delta << endl;
    }
    cout << "delta^-1 = " << z3 << endl;
    for (int i = 0; i < len; i++)
    {
        mas[i] = s[i];
        cout << i << "\t" << s[i] << "\t" << mas[i] << endl;
    }
    int k = 0;
    cout << "*****************************shifr*******************" << endl;
    for (int i = 1; i <= len; i++)
    {
        if (i % 3 == 1)
        {
            x = mas[i - 1];
            k++;
        }
        else if (i % 3 == 2)
        {
            y = mas[i - 1];
            k++;
        }
        else if (i % 3 == 0)
        {
            z = mas[i - 1];
            k++;
        }
        if (k % 3 == 0)
        {
            shifr[1][k / 3] = (a[1][1] * x + a[1][2] * y + a[1][3] * z + b[1]) % p;
            shifr[2][k / 3] = (a[2][1] * x + a[2][2] * y + a[2][3] * z + b[2]) % p;
            shifr[3][k / 3] = (a[3][1] * x + a[3][2] * y + a[3][3] * z + b[3]) % p;
            cout << shifr[1][k / 3] << "\t" << shifr[2][k / 3] << "\t" << shifr[3][k / 3] << endl;
        }
    }
    cout << "******************************deshifr*********************" << endl;
    for (int i = 1; i <= len / 3; i++)
    {
        x = (z3 * (d[1][1] * (shifr[1][i] - b[1]) + d[1][2] * (shifr[2][i] - b[2]) + d[1][3] * (shifr[3][i] - b[3]))) % p;
        y = (z3 * (d[2][1] * (shifr[1][i] - b[1]) + d[2][2] * (shifr[2][i] - b[2]) + d[2][3] * (shifr[3][i] - b[3]))) % p;
        z = (z3 * (d[3][1] * (shifr[1][i] - b[1]) + d[3][2] * (shifr[2][i] - b[2]) + d[3][3] * (shifr[3][i] - b[3]))) % p;
        x %= p;
        y %= p;
        z %= p;
        if (x < 0) x += p;
        if (y < 0) y += p;
        if (z < 0) z += p;
        mas0[0][i] = x;
        mas0[1][i] = y;
        mas0[2][i] = z;
        cout << x << "\t" << y << "\t" << z << endl;
    }
    cout << "*****************************pause*******************" << endl;
    for (int i = 1; i < len / 3; i++)
    {
        cout << char(mas0[0][i]) << endl;
        cout << char(mas0[1][i]) << endl;
        cout << char(mas0[2][i]) << endl;
    }
    return 0;
}

int f(int t, int p)
{
    int z0 = 0;
    for (int i = 1; i <= p - 1; i++)
    {
        if ((i * t) % p == 1) z0 = i;
    }
    return z0;
}
Соседние файлы в предмете Теория информации