• B правой части каждого сообщения есть стрелки и . Не стесняйтесь оценивать ответы. Чтобы автору вопроса закрыть свой тикет, надо выбрать лучший ответ. Просто нажмите значок в правой части сообщения.

  • Курсы Академии Кодебай, стартующие в мае - июне, от команды The Codeby

    1. Цифровая криминалистика и реагирование на инциденты
    2. ОС Linux (DFIR) Старт: 16 мая
    3. Анализ фишинговых атак Старт: 16 мая Устройства для тестирования на проникновение Старт: 16 мая

    Скидки до 10%

    Полный список ближайших курсов ...

Шифрование Методом Перестановки

  • Автор темы Rendall
  • Дата начала
Статус
Закрыто для дальнейших ответов.
R

Rendall

<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">код</div></div><div class="sp-body"><div class="sp-content">
C++:
#include "stdafx.h"
#include <math.h>
#include <iostream>
#include <clocale>
#include <stdio.h>
//Кодировка строки
//char* s - исходная строка
//int* key - ключ
//int sz_key - количество элементов в ключе
using namespace std;
char* Encode(char* s, int* key, int sz_key);
//Декодировка строки
//char* s - закодированная строка
//int* key - ключ
//int sz_key - количество элементов в ключе
char* Decode(char * s, int * key, int sz_key);
int _tmain(int argc, _TCHAR* argv[])
{
setlocale(0, "Rus");
//ключ
cout<<"Введите ключ без повторений букв \n";
char *s_key;
s_key= new char[11];
fflush(stdin);
fgets(s_key,11, stdin);
int t = 0;
while (s_key[t] != '\0') t++;
int *key = new int[t];
for(int p=0;p<t-1;p++)
{
key[p]=(int)s_key[p]-96;
cout<<key[p]<<"\n";
}
cout<<"\n";
int i=0;
char *s= new char[100];
cout<<"введите сообщение для зашифровки"<<" \n";
fflush(stdin);
fgets(s,100, stdin);
cout<<"\n";
int sz_key = sizeof(key)/sizeof(int);
char *s_code = Encode(s, key, sz_key);
char *s_decode = Decode(s_code, key, sz_key);
printf("Исходное сообщение: %s\n", s);
printf("Зашифрованное сообщение: %s\n", s_code);
printf("Сообщение после дешифрования: %s\n", s_decode);
system("pause");
return 0;
}
char* Encode(char* s, int* key, int sz_key)
{
//количество элементов в исходной строке s
int sz_s = 0;
while (s[sz_s] != '\0')
sz_s++;
//результируюшая строка
char *str = new char[sz_s];
//кодировка строки s
//количество блоков
int rounds = ceil((double) sz_s / sz_key);
int j = 0;
for (int i = 0; i < rounds; i++)
for (int k = 0; k < sz_key; k++)
if (i*sz_key + key[k] < sz_s)
{
str[j] = s[i*sz_key + key[k]];
j++;
}
str[sz_s] = '\0';
return str;
}
char* Decode(char * s, int * key, int sz_key)
{
//количество элементов в закодированной строке s
int sz_s = 0;
while (s[sz_s] != '\0')
sz_s++;
//результируюшая строка
char *str = new char[sz_s];
//декодировка строки s
//количество блоков
int rounds = ceil((double) sz_s / sz_key);
int j = 0;
for (int i = 0; i < rounds; i++)
for (int k = 0; k < sz_key; k++)
if (i*sz_key + key[k] < sz_s)
{
str[i*sz_key + key[k]] = s[j];
j++;
}
str[sz_s] = '\0';
return str;	
return 0;
}

программа шифрует текст введенный пользователем по заданному им ключу, надо переделать Encode и Decode потому что выдает чушь, сам найти ошибку не могу, помогите пожалуйста. П.С если что делал в 12 студии
 
R

rrrFer

там вообще что-то не то. Поясните что вы хотите от этой программы (какого поведения)?
лучше всего описать суть метода перестановки и привести примеры исходных данных и ожидаемых результатов работы обоих ваших функций

Добавлено:
Код:
//Декодировка строки
//char* s - закодированная строка
//int* key - ключ
//int sz_key - количество элементов в ключе
char* Decode(char * s, int * key, int sz_key);
терминология странная, что есть "декодировка"?
decode - дешифровка, она подразумевает взлом (при отсутствии ключа), но ваша функция принимает аргумент "key", Вы решили нас запутать?
 
R

rrrFer

Код:
//количество элементов в исходной строке s
int sz_s = 0;
while (s[sz_s] != '\0')
sz_s++;
Код:
int t = 0;
while (s_key[t] != '\0') t++;
используй strlen у тебя это встречается аж 3 раза
Код:
s_key= new char[11];
fflush(stdin);
fgets(s_key,11, stdin);
const int KEY_MAX_LEN = 11;
Код:
s_key[p]-96;
почему 96? - это код символа '`' или просто так константа?
Код:
	 str[sz_s] = '\0';
return str;	
return 0;
}
второй return нужен?
Код:
 s_key= new char[11];
int *key = new int[t];
char *s= new char[100];
char *str = new char[sz_s];
char *str = new char[sz_s];
ни одного delete[] я не вижу.

Код:
char *s_key;
s_key= new char[11];
fflush(stdin);
fgets(s_key,11, stdin);
int t = 0;
while (s_key[t] != '\0') t++;
int *key = new int[t];
не вижу ни одной причины заводить еще одну строку key. используй s_key.

-------------------------------
суть всего вышенаписанного в том, что если выкинуть из кода всякий ненужный хлам он будет минимум в 3 раза короче и много понятней. Читая же ваш код я убежден, что перед публикацией его на форуме вы прогнали его через свой encode().
Код:
int rounds = ceil((double) sz_s / sz_key);
int j = 0;
for (int i = 0; i < rounds; i++)
for (int k = 0; k < sz_key; k++)
if (i*sz_key + key[k] < sz_s)
{
str[j] = s[i*sz_key + key[k]];
j++;
}
этот фрагмент я и вовсе не понял, подскажи что скурить?
---------------------------------

А если в коде написано нечто мутное и недоступное для понимания большинства, то помочь вам невозможно (ну разве если вы соизволите посвятить нас в суть метода своих хитрых перестановок)
 
R

Rendall

попытаюсь объяснить
1) я ввожу ключевую фразу и формирую массив чисел - номеров букв в алфавите,
C++:
key[p]=(int)s_key[p]-96;
присваивает элементу массива key, номер символа в таблице ASCI -96 т.к латинские буквы начинаются с 97, таким образом буква "a" становится "1", буква "в" это "2" ит.д.
C++:
cout<<"Введите ключ без повторений букв \n";
char *s_key;
s_key= new char[11];
fflush(stdin);
fgets(s_key,11, stdin);
int t = 0;
while (s_key[t] != '\0') t++;
int *key = new int[t];
for(int p=0;p<t-1;p++)
{
key[p]=(int)s_key[p]-96;
cout<<key[p]<<"\n";
}


2)я ввожу строку, которую надо закодировать
C++:
char *s= new char[100];
cout<<"введите сообщение для зашифровки"<<" \n";
fflush(stdin);
fgets(s,100, stdin);


3)считается размер ключа sz_key

4)считается количество блоков в строке, и порядок букв меняется как в ключе, т.е если ключ {4, 0, 1, 5, 3, 2} то слово codeby станет bcoyed

C++:
int rounds = ceil((double) sz_s / sz_key);
int j = 0;
for (int i = 0; i < rounds; i++)
for (int k = 0; k < sz_key; k++)
if (i*sz_key + key[k] < sz_s)
{
str[j] = s[i*sz_key + key[k]];
j++;
}

5)вот рабочий код но тут ключ объявлен в самой программе , а если ключ вводить то работает неверно :(
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">код</div></div><div class="sp-body"><div class="sp-content">
C++:
#include "stdafx.h"
#include <math.h>
#include <iostream>
#include <clocale>
#include <stdio.h>
using namespace std;
char* Encode(char* s, int* key, int sz_key);
char* Decode(char * s, int * key, int sz_key);
int _tmain(int argc, _TCHAR* argv[])
{
setlocale(0, "Rus");
//ключ
int key[]={4, 0, 1, 5, 3, 2};  
char *s= new char[100];
cout<<"введите сообщение для зашифровки"<<" \n";
fflush(stdin);
fgets(s,100, stdin);
cout<<"\n";
int sz_key = sizeof(key)/sizeof(int);
char *s_code = Encode(s, key, sz_key);
char *s_decode = Decode(s_code, key, sz_key);
printf("Исходное сообщение: %s\n", s);
printf("Зашифрованное сообщение: %s\n", s_code);
printf("Сообщение после дешифрования: %s\n", s_decode);
system("pause");
return 0;
}
char* Encode(char* s, int* key, int sz_key)
{
int sz_s = 0;
while (s[sz_s] != '\0')
sz_s++;
char *str = new char[sz_s];
int rounds = ceil((double) sz_s / sz_key);
int j = 0;
for (int i = 0; i < rounds; i++)
for (int k = 0; k < sz_key; k++)
if (i*sz_key + key[k] < sz_s)
{
str[j] = s[i*sz_key + key[k]];
j++;
}
str[sz_s] = '\0';
return str;
}
char* Decode(char * s, int * key, int sz_key)
{
int sz_s = 0;
while (s[sz_s] != '\0')
sz_s++;
char *str = new char[sz_s];
int rounds = ceil((double) sz_s / sz_key);
int j = 0;
for (int i = 0; i < rounds; i++)
for (int k = 0; k < sz_key; k++)
if (i*sz_key + key[k] < sz_s)
{
str[i*sz_key + key[k]] = s[j];
j++;
}
str[sz_s] = '\0';
return str;	
return 0;
}
 
R

rrrFer

присваивает элементу массива key, номер символа в таблице ASCI -96 т.к латинские буквы начинаются с 97, таким образом буква "a" становится "1", буква "в" это "2" ит.д.
дак и пиши s_key-='a'+1;
это гораздо понятней и второй массив(key) заводить не обязательно, все равно числа в нем не превысят 255.

Добавлено:
4)считается количество блоков в строке, и порядок букв меняется как в ключе, т.е если ключ {4, 0, 1, 5, 3, 2} то слово codeby станет bcoyed
обратите внимание, в ключе есть число 0, а если вы пишите key[p]=(int)s_key[p]-96; то букве "а" будет соответствовать 1, нуля не будет, если в тексте не будет "`".

Добавлено:
4)считается количество блоков в строке, и порядок букв меняется как в ключе, т.е если ключ {4, 0, 1, 5, 3, 2} то слово codeby станет bcoyed
И во этот фрагмент я не понял, почему codeby преобразуется в bcoyed, а не в odybce? Научите меня )
и ИМХО программа которую вы тут скинули как образец ни разу не правильно работает.
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!