Другие языки программирования и технологии

помогите пожалуйста зашифровать сообщения квадратом полибия 6х6

а) (замена на другую такую же в нижнем столбце ) Состоянием защищенности объекта от внешних и внутренних угроз называется безопасностью объекта
б) (шифруемая буква заменяется на кординаты квадрата -строка- столбец в котором она записана,

Гаммирование это процесс наложения по определенному закону гаммы шифра на открытые данные
SG
Sultan Gasanov
155
уважуха тебе !! как же я далёк от этого, ничего не бум бум в этом) ) сорри что не по теме пишу)
6975Иван Гонзолюк
5 332
Лучший ответ
Для начала сделайте матрицу 6х6 и занесите в неё алфавит шифрования.

1. Вообще-то это называется шифр Цезаря, но не в этом суть.

Просто найдите букву в 2-мерном массиве.
Добавьте к номеру строки 1 и возьмите остаток от деления на 6 (чтобы 5+1=6 -> 0).
Потом возьмите букву в получившейся строке и том же столбце.
Для обратного шифрования надо добавлять 5 (это равносильно -1 после остатка по модулю 6)

ЗЫ
Этот метод не требует таких усилий. Обычно ЗАРАНЕЕ делают вектор перестановок char p[char] и просто посимвольно заменяют s[i]=p[s[i]]

2. Если основываться на википедии, то при шифровании нужно менять номера столбцов и строк разных символов. Но это алгоритм для человека. Для компьютера он чуток другой.

Для получения одной буквы результата шифрования используются 2 подряд идущие буквы исходного текста.
Поэтому, чтобы получать 1 символ за шаг, удвоим исходный текст:
пример 'секретно'->'секретносекретно'
попутно запомним длину исходной строки (обозначим её len) в примере len=8
Пробежимся с шагом 2 по удвоенной строке:
-- на каждом шаге работаем с символами A=s[2*i] и B=s[2*i+1]
-- найдём строку и столбец для A: rowA, colA и для B: rowB, colB
-- посчитаем idxA=(2*i<len)?rowA: colA; - если номер в первой части удвоенного текста, то берём строку, иначе - столбец
-- аналогично idxB=((2*i+1)<len)?rowB: colB;
-- в результат добавим символ матрицы строки idxA и столбца idxB

Для обратного шифрования нужно брать пару символов A=s[i] и B=s[i+len/2] (для простоты считаем len чётным, нечётный - вам для самостоятельной работы) .
Первый символ: cтрока rowA и столбец rowB. Второй символ: строка colA и столбец colB.
Таким образом 2 зашифрованных символа преобразуются 2 дешифрованных.

ЗЫ можно не удваивать строку, а брать символы 2*i и 2*i+1 в исходной строке, только не напрямую, а остаток от деления на len

ЗЗЫ
Метод сложный, теоретически должен работать. Но что называется на свой страх и риск =)
Юрий Притула
Юрий Притула
11 112
Это не ответ на Ваш вопрос, но вот реализация шифровки текста из латинских букв с помощью квадрата 5х5.
========================================
#include <iostream>

using namespace std;

int main(){

char sqr[5][5] = {
{'a','b','c','d','e'},
{'f','g','h','i','k'},
{'l','m','n','o','p'},
{'q','r','s','t','u'},
{'v','w','x','y','z'},
};

char word[80];// = "sometext"; // шифруемый текст
gets(word);

char *pword = new char[strlen(word)+1]; // массив для шифровки.
int b;

for(int i(0); i < 5*5; i++){ // шифруем
for(int j(0); j < strlen(word); j++){
if(word[j] == sqr[0][i] || tolower(word[j]) == sqr[0][i]){
b=i;
if((b+5) < 25){ pword[j] = sqr[0][b+5];}
else{ pword[j] = sqr[0][b+5-25];}
}
else if(word[j] == ' ') pword[j] = ' ';
else if(word[j] == 'j' || word[j] == 'J') pword[j] = 'j';
if(isupper(word[j])) pword[j] = toupper(pword[j]);
if(!isalpha(word[j])) pword[j] = word[j];
}
}
pword[strlen(word)] = '\0';

cout << pword << endl; // смотрим, что получилось

char *ppword = new char[strlen(pword)]; // массив для дешифровки

for(int i(0); i < strlen(pword); i++){ // дешфруем
for(int j(0); j < 25; j++){
if(pword[i] == sqr[0][j] || tolower(pword[i]) == sqr[0][j]) {
b = j;
if((b-5) >= 0) ppword[i] = sqr[0][b-5];
else ppword[i] = sqr[0][b-5+25];
}
else if(pword[i] == ' ') ppword[i] = ' ';
else if(pword[i] == 'j' || pword[i] == 'J') ppword[i] = 'j';
if(isupper(pword[i])) ppword[i] = toupper(ppword[i]);
if(!isalpha(pword[i])) ppword[i] = pword[i];
}
}
ppword[strlen(pword)] = '\0';

cout << ppword << endl; // смотрим на дешифровку

system("pause >> void");
return 0;
}