Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 5.00
Ники
1 / 1 / 0
Регистрация: 21.04.2010
Сообщений: 50
#1

Шифровка табличной заменой - C++

12.06.2010, 15:21. Просмотров 1302. Ответов 9
Метки нет (Все метки)

Помогите написать на с++

Один из простейших способов шифровки текста состоит в том, что каждой букве алфавита ставится в соответствии другая буква( ее шифр), выбор которой произволен. составьте свою шифровальную таблицу, разработайте способ ее представления, затем напишите программу, зашифровывающую и расшифровывающую текст.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.06.2010, 15:21     Шифровка табличной заменой
Посмотрите здесь:

Шифровка текста - C++
Реализовать шифрование, который заключается в табличной замене каждого символа другим символом - его шифром. Выбрать некоторую таблицу,...

Шифровка в ASCII - C++
Зашифровать введенное с клавиатуры слово с помощью ASCII.

Простейшая шифровка текста. - C++
Программа должна шифровать и расшифровывать введенный пользователем текст. Вот что я имею: #include <stdio.h> int main () {char...

Шифровка и расшифровка текста - C++
Зравствуйте! нижепредставленный код шифрует данные списком без проблем. Обратно не расшифровывает. Вернее, создаёт файл, но не то в нём...

Шифровка и дешифровка текста - C++
Помогите, пожалуйста, кто может. Буду очень благодарен. Написать программу шифровки и дешифровки текста по сделующему алгоритму:...

Шифровка по треугольнику (пирамиде) Паскаля - C++
шифровка по треугольнику паскаля! в чем ошибка подскажите... вижуал студио ругается на 72 строчку #include<stdio.h> ...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Андрейка
419 / 223 / 27
Регистрация: 25.03.2009
Сообщений: 744
12.06.2010, 15:30     Шифровка табличной заменой #2
Ники, Шифр Цезаря и не парься )
Mur3ik
102 / 102 / 4
Регистрация: 12.05.2010
Сообщений: 232
12.06.2010, 16:12     Шифровка табличной заменой #3
там и шифр замены, и шифр цезаря
PointsEqual
ниначмуроФ
834 / 518 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
22.07.2010, 09:52     Шифровка табличной заменой #4
Ники, в чем именно помочь. ? Вроде ничего сверхестественного нет.
Ники
1 / 1 / 0
Регистрация: 21.04.2010
Сообщений: 50
22.07.2010, 12:28  [ТС]     Шифровка табличной заменой #5
Трудность в том, что я не знаю, как текст, который ввел пользователь, разбить на отдельные символы и потом загнать их в динамический массив
Nameless One
Эксперт С++
5769 / 3418 / 255
Регистрация: 08.02.2010
Сообщений: 7,444
22.07.2010, 12:35     Шифровка табличной заменой #6
А зачем нужен динамический массив? Строки в С - на самом деле массивы символов, поэтому работать по идее нужно с ними.
PointsEqual
ниначмуроФ
834 / 518 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
22.07.2010, 12:39     Шифровка табличной заменой #7
Ники, пример(с++)


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <string>
 
int main()
{
    std::string text="Hello";
    std::string result;
    result.clear();
 
    int i=0;
    while(i<text.size()){
        result+=(char)(text[i]+1);
        ++i;
    }
 
    std::cout<<result;
 
 
    return 0;
}
text[i] - и есть смвол
Nameless One
Эксперт С++
5769 / 3418 / 255
Регистрация: 08.02.2010
Сообщений: 7,444
22.07.2010, 13:59     Шифровка табличной заменой #8
Вот с помощью классов:
cipher.h:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#ifndef CIPHER_H
#define CIPHER_H
 
#include <string>
#include <map>
 
class cipher
{
public:
    cipher(char start = alphaStart, char end = alphaEnd);
    ~cipher() {}
    void encrypt(const std::string& str, std::string& result) const;
    void decrypt(const std::string& str, std::string& result) const;
private:
    std::map<char, char> encryptionMap;
    std::map<char, char> decryptionMap;
    const static char alphaStart = 'a';
    const static char alphaEnd = 'z';
};
 
#endif //CIPHER_H
cipher.cpp:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include "cipher.h"
#include <vector>
 
cipher::cipher(char start, char end)
{
    if(end<=start)
        throw(std::exception("Incorrect alphabetic range"));
    size_t lettersCount = end - start + 1;
    std::vector<char> alph(lettersCount);
    for(size_t i = 0; i < lettersCount; ++i)
        alph[i] = start + i;
    size_t it = 0;
    while(lettersCount)
    {
        int ch = rand() % lettersCount;
        encryptionMap[start + it] = alph[ch];
        decryptionMap[ alph[ch] ] = start + it;
        alph.erase(alph.begin() + ch);
        ++it;
        --lettersCount;
    }
    encryptionMap[' '] = ' ';
    decryptionMap[' '] = ' ';
}
 
void cipher::encrypt(const std::string& str, std::string& result) const
{
    result.resize(str.size());
    for(size_t i = 0; i < str.size(); ++i)
        result[i] = encryptionMap.at( str[i] );
}
 
void cipher::decrypt(const std::string& str, std::string& result) const
{
    result.resize(str.size());
    for(size_t i = 0; i < str.size(); ++i)
        result[i] = decryptionMap.at( str[i] );
}
main.cpp:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <iostream>
#include <string>
#include <ctime>
#include "cipher.h"
 
int main()
{
    try
    {
        srand(static_cast<unsigned int>(time(NULL)));
        std::string str("a string for encryption");
        //Создаем таблицу шифровки/дешифровки для алфавита 'a'-'z'
        cipher c1;
        std::string encryptedString;
        std::string decryptedString;
        c1.encrypt(str, encryptedString);
        c1.decrypt(encryptedString, decryptedString);
        std::cout << "Initial text:\n\t\"" << str << "\"" << std::endl;
        std::cout << "Encrypted text:\n\t\"" << encryptedString << "\"" << std::endl;
        std::cout << "Decrypted text:\n\t\"" << decryptedString << "\"" << std::endl;
        std::cout << "Initital text is equal to decrypted text? " << std::boolalpha << (str == decryptedString) << std::endl;
    }
    catch(std::exception& e)
    {
        std::cerr << e.what() << std::endl;
        system("pause");
        return EXIT_FAILURE;
    }
    system("pause");
    return EXIT_SUCCESS;
}
Каждый элемент класса cipher создает случайные таблицы шифровки/дешифровки. Конструктор принимает два символа, задающих начало и конец алфавитного диапазона, для которого создается шифр. Диапазон по умолчанию: 'a'-'z'. Пробел соответствует самому себе. Регистр символов имеет значение.

Метод encrypt (decrypt) принимает ссылку на строку, которую нужно зашифровать (расшифровать), и ссылку на строку, которая будет хранить результат.

Если исходная строка будет содержать символы, которых нет в таблице, то в процессе шифровки произойдет ошибка. Если алфавитный диапазон, задающий шифр, будет содержать символ пробела, то программа будет работать неправильно
easybudda
Эксперт С++
9456 / 5469 / 927
Регистрация: 25.07.2009
Сообщений: 10,495
22.07.2010, 17:17     Шифровка табличной заменой #9
Не то, чтобы по заданию. Сделал так, как самому интереснее было...
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
#define LETTERS "AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz0123456789 -_+='.,;:!@#$%^&*()[]{}/|\\\"\t\n"
 
int letter_index(const char * s, char ch){
    char * pFound;
    
    return ( ( pFound = strchr(s, ch) ) == NULL ) ? -1 : pFound - s;
}
 
char * encrypt(char * buf, const char * letters, const char * key){
    int bufPos, keyPos;
    int lettersLen = strlen(letters);
    int keyLen = strlen(key);
    const char * pKey;
    char * pBuf;
        
    pKey = key;
    pBuf = buf;
    while ( *pBuf ){
        if ( ( bufPos = letter_index(letters, *pBuf) ) < 0 )
            return NULL;
        if ( ( keyPos = letter_index(letters, *pKey) ) < 0 )
            return NULL;
        if ( letters[keyPos] & 1 ){
            if ( ( bufPos = bufPos + keyPos) >= lettersLen )
                bufPos -= lettersLen;
        }
        else {
            if ( ( bufPos = bufPos - keyPos ) < 0 )
                bufPos += lettersLen;
        }
        *pBuf++ = letters[bufPos];
        ++pKey;
        if ( pKey >= key + keyLen )
            pKey = key;
    }
    return buf;
}
 
char * decrypt(char * buf, const char * letters, const char * key){
    int bufPos, keyPos;
    int lettersLen = strlen(letters);
    int keyLen = strlen(key);
    const char * pKey;
    char * pBuf;
        
    pKey = key;
    pBuf = buf;
    while ( *pBuf ){
        if ( ( bufPos = letter_index(letters, *pBuf) ) < 0 )
            return NULL;
        if ( ( keyPos = letter_index(letters, *pKey) ) < 0 )
            return NULL;
        if ( letters[keyPos] & 1 ){
            if ( ( bufPos = bufPos - keyPos ) < 0 )
                bufPos += lettersLen;
        }
        else {
            if ( ( bufPos = bufPos + keyPos) >= lettersLen )
                bufPos -= lettersLen;
        }
        *pBuf++ = letters[bufPos];
        ++pKey;
        if ( pKey >= key + keyLen )
            pKey = key;
    }
    return buf;
}
 
int main(int argc, char ** argv){
    char testStr[] = "Man Page Lookup searches for man pages name and section as given in the selection menu and the query dialog. Apropos Keyword "
        "Search searches the database for the string given in the query dialog. There are also several hypertext links provided as short-cuts to "
        "various queries: Section Indexes is apropos listings of all man pages by section. Explanations of Man Sections contains pointers to the "
        "intro pages for various man sections.";
    
    printf("\nString:    %s\n", testStr);
    printf("\nEncrypted: %s\n", encrypt(testStr, LETTERS, "qwerty"));
    printf("\nDecrypted: %s\n", decrypt(testStr, LETTERS, "qwerty"));
    
    exit(EXIT_SUCCESS);
}
Интересно, какой нибудь средненький шифровальщик хоть час на этот шифр потратил бы, или прям с хода бы разгадал?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.07.2010, 18:03     Шифровка табличной заменой
Еще ссылки по теме:

Шифровка текста двунаправленным списком - C++
Надо написать программу для шифровки и расшифровки текстового файла, используя двунаправленный список. Зашифровать получается, а вот...

Шифровка и дешифровка текстового сообщения - C++
Помогите ,пожалуйста.Задание: написать программу шифровки и дешифровки текстового сообщения. Шифровку выполнить следующим образом:...

Шифровка данных элементарным способом - C++
Всем привет. Нес-ко дней изучаю C++. Пишу, дописываю, перерабатываю примеры из книг по некоторые задачи. Вот вчера пришла мысль...

Шифровка/Дешифровка методом Карно (поворота решеткой) - C++
Пожалуйста у кого есть дайте код шифровки/дешифровки,облазил много много станиц ничего подходящего не нашел.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Mr.X
Эксперт С++
3042 / 1687 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
22.07.2010, 18:03     Шифровка табличной заменой #10
Цитата Сообщение от easybudda Посмотреть сообщение
Интересно, какой нибудь средненький шифровальщик хоть час на этот шифр потратил бы, или прям с хода бы разгадал?
Я читал про одного гениального дешифровщика дореволюционных времен. Когда к нему попадала сложная шифровка, он приходил в состояние аффекта, и не успокаивался, пока не прочитывал. Шифры замены он читал с листа.
Yandex
Объявления
22.07.2010, 18:03     Шифровка табличной заменой
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru