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

Тема в разделе "C/C++/C#", создана пользователем Rendall, 23 сен 2012.

Статус темы:
Закрыта.
  1. Rendall

    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 студии
     
  2. Rendall

    Rendall Гость

    пожалуйста помогите, скажите где ошибка
     
  3. rrrFer

    rrrFer Well-Known Member
    Команда форума C\C++ Team

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

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

    rrrFer Well-Known Member
    Команда форума C\C++ Team

    Регистрация:
    6 сен 2011
    Сообщения:
    1.324
    Симпатии:
    36
    Код (Text):
    //количество элементов в исходной строке s
    int sz_s = 0;
    while (s[sz_s] != '\0')
    sz_s++;
    Код (Text):
    int t = 0;
    while (s_key[t] != '\0') t++;
    используй strlen у тебя это встречается аж 3 раза
    Код (Text):
    s_key= new char[11];
    fflush(stdin);
    fgets(s_key,11, stdin);
    const int KEY_MAX_LEN = 11;
    Код (Text):
    s_key[p]-96;
    почему 96? - это код символа '`' или просто так константа?
    Код (Text):
         str[sz_s] = '\0';
    return str;
    return 0;
    }
    второй return нужен?
    Код (Text):
     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[] я не вижу.

    Код (Text):
    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().
    Код (Text):
    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. Rendall

    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;
    }
     
  6. rrrFer

    rrrFer Well-Known Member
    Команда форума C\C++ Team

    Регистрация:
    6 сен 2011
    Сообщения:
    1.324
    Симпатии:
    36
    дак и пиши s_key-='a'+1;
    это гораздо понятней и второй массив(key) заводить не обязательно, все равно числа в нем не превысят 255.

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

    Добавлено:
    И во этот фрагмент я не понял, почему codeby преобразуется в bcoyed, а не в odybce? Научите меня )
    и ИМХО программа которую вы тут скинули как образец ни разу не правильно работает.
     
Загрузка...
Статус темы:
Закрыта.

Поделиться этой страницей