Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 48, средняя оценка - 4.88
DINAzavR
78 / 78 / 2
Регистрация: 11.06.2011
Сообщений: 335
#1

Шифр Атбаш - C++

04.09.2011, 22:04. Просмотров 7122. Ответов 11
Метки нет (Все метки)

Начался новый учебный год, не успел оправиться от сесси, как задали новую курсовую. Как бы то ни было учиться нужно, ну по крайней мере пытаться.
Задание выглядит примерно так: "Шифр простой замены, использованный для еврейского алфавита и
получивший оттуда свое название. Шифрование происходит заме-
ной первой буквы алфавита на последнюю, второй на предпос-
леднюю (алеф (первая буква) заменяется на тав (последнюю), бет(вторая) заменяется на шин (предпоследняя); из этих сочетани
шифр и получил свое название). Шифр Атбаш для английского
алфавита:
Исходный алфавит: A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
Алфавит замены: Z Y X W V U T S R Q P O N M L K J I H G F E D C B A
Пользуясь изложенным способом:
А) зашифровать данный текст
Б) расшифровать данный текст".

Трудность заключается в способе замены букв. По идее это строка, нужно всего лишь ... и тут у меня закипает мозг.
Вот такая ситуация. У кого какие мысли по задаче, пишите, делитись.
P.S. И это все нужно оформить в forms, хотя это не такая уж проблема. Главное чтобы стало понятно как реализовать ход прог-ммы на деле, без всяких заморочек, как в Win32.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.09.2011, 22:04
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Шифр Атбаш (C++):

Шифр Атбаш - C++
Всем привет. Нужна помощь! Составить программу в Borland C++, которая позволит закодировать исходный текст шифром Атбаш и выполнить...

Шифр Вижиненра, шифр скитала - C++
Я много прочитал информации и захотел реализовать эти шифры на Buider C++, а вот как это сделать. Кому интересно, напишите мне примеры этих...

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

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

Шифр Вижинера - C++
Здравствуйте.Нужно написать шифр Вижинера с файлами,т.е. 1 файл-исходный текст,2ой зашифрованный,ну а ключ вводится в консоли.Длина...

Шифр Бэкона c++ - C++
Народ,помогите пожалуйста перевести шифр с паскаля на c++ :) program strug_production; var s_out, s_in, str,itogstroka,tekbukva:...

11
xAtom
915 / 740 / 60
Регистрация: 09.12.2010
Сообщений: 1,346
Записей в блоге: 1
04.09.2011, 23:21 #2
DINAzavR, вот в консольном набросал две функции.
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
#include <stdio.h>
#include <string.h>
#include <ctype.h>
// добавить можно кириллицу, да хоть немецкий.
#define  CODE_ATBASH       "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
#define  DECODE_ATBASH    "ZYXWVUTSRQPONMLKJIHGFEDCBA"
 
// функция кодирования
char* code_atbash(char* src) {
   char* dst = src;
   const char* cch, *dch;
 
   while( *src ) {
        if(isalpha(*src)) {
                  for(dch = DECODE_ATBASH, cch = CODE_ATBASH; *cch; *cch++, *dch++) {
                       if( *cch == toupper(*src) ) {
                            *src = (isupper(*src)) ?  *dch : tolower(*dch);
                             break;
                       }
                  }
         }
         *src++;
   }
   return dst;
}
 
// функция декодирования
char* decode_atbash(char* src) {
   char* dst = src;
   const char* cch, *dch;
 
   while( *src ) {
         if(isalpha(*src)) {
               for(dch = DECODE_ATBASH, cch = CODE_ATBASH; *cch; *cch++, *dch++) {
                    if( *dch == toupper(*src) ) {
                          *src = (isupper(*src)) ?  *cch : tolower(*cch);
                            break;
                     }
                }
         }
         *src++;
   }
   return dst;
}
 
 
int  main(void) {
    char str[64] = "ABCDEF adam";
 
    puts(str);    // исходная строка
    puts( code_atbash(str) );    // закодированная
    puts( decode_atbash(str) );   // декодированная
 
    putchar('\n');
 
    // ещё пример
    strcpy(str, "String(decode), WWW.SaMpLe.ORG");
    puts(str);    // исходная строка
    puts( code_atbash(str) );    // закодированная
    puts( decode_atbash(str) );   // декодированная
 
    getchar();
    return 0;
}
0
DINAzavR
78 / 78 / 2
Регистрация: 11.06.2011
Сообщений: 335
05.09.2011, 09:16  [ТС] #3
Извините за дурацкий вопрос, но не могли бы Вы пояснить что это за операторы: isalpha, isupper, toupper, *src, *cch, *dch?
0
fasked
Эксперт С++
4948 / 2528 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
05.09.2011, 10:20 #4
Цитата Сообщение от DINAzavR Посмотреть сообщение
isalpha
Является ли символ буквой в соответствии с текущей локалью.
Цитата Сообщение от DINAzavR Посмотреть сообщение
isupper
Является ли символ прописной (заглавной) буквой в соответствии с текущей локалью.
Цитата Сообщение от DINAzavR Посмотреть сообщение
toupper
Преобразовать букву в прописную (заглавную).
Цитата Сообщение от DINAzavR Посмотреть сообщение
*src, *cch, *dch
Разыменование указателя, я так полагаю.
0
Nameless One
05.09.2011, 15:32
  #5

Не по теме:

Цитата Сообщение от DINAzavR Посмотреть сообщение
как задали новую курсовую
да это максимум на лабораторную работу тянет

0
DINAzavR
78 / 78 / 2
Регистрация: 11.06.2011
Сообщений: 335
05.09.2011, 15:59  [ТС] #6
Nameless One, так покажите класс и решите эту "лабораторную".
P.S. Задание может и не сомое сложное, но оформить придется по ГОСТам, как курсовую.
0
fasked
Эксперт С++
4948 / 2528 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
05.09.2011, 16:05 #7
Цитата Сообщение от DINAzavR Посмотреть сообщение
так покажите класс и решите эту "лабораторную"
Так Вам уже написали решение.
Цитата Сообщение от DINAzavR Посмотреть сообщение
но оформить придется по ГОСТам, как курсовую.
Или оформить тоже за Вас надо?
0
DINAzavR
78 / 78 / 2
Регистрация: 11.06.2011
Сообщений: 335
05.09.2011, 22:47  [ТС] #8
Уточню задание, нужно ввести и обработать текс.
Решение изучаю, разбираюсь целый день, но кроме новых функций ничего не понял.
Появились мысли как решать, запишу пока не забыл: необходимо разбить введенный текст на буквы, определить их порядковые номера в соответствии с алфавитном, а потом сопоставить с обратным. Как-то так, но я не представлю как это реализовать. Программисты, вся надежда на Вас.
0
easybudda
Модератор
Эксперт CЭксперт С++
9694 / 5644 / 962
Регистрация: 25.07.2009
Сообщений: 10,848
05.09.2011, 23:18 #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
#include <stdio.h>
#include <string.h>
 
const char UPPER_DECODED[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
const char UPPER_ENCODED[] = "ZYXWVUTSRQPONMLKJIHGFEDCBA";
const char LOWER_DECODED[] = "abcdefghijklmnopqrstuvwxyz";
const char LOWER_ENCODED[] = "zyxwvutsrqponmlkjihgfedcba";
 
char * encode(char * str){
    char * p, * f;
    
    for ( p = str; *p; ++p ){
        if ( f = strchr(UPPER_DECODED, *p) )
            *p = UPPER_ENCODED[f - UPPER_DECODED];
        else if ( f = strchr(LOWER_DECODED, *p) )
            *p = LOWER_ENCODED[f - LOWER_DECODED];
    }
    
    return str;
}
 
char * decode(char * str){
    char * p, * f;
    
    for ( p = str; *p; ++p ){
        if ( f = strchr(UPPER_ENCODED, *p) )
            *p = UPPER_DECODED[f - UPPER_ENCODED];
        else if ( f = strchr(LOWER_ENCODED, *p) )
            *p = LOWER_DECODED[f - LOWER_ENCODED];
    }
    
    return str;
}
 
int main(void){
    char buf[BUFSIZ];
    
    while ( printf("String:  ") && scanf("%[^\n]%*c", buf) == 1 ){
        printf("Encoded: %s\n", encode(buf));
        printf("Decoded: %s\n", decode(buf));
    }
    
    return 0;
}
1
An1ka
65 / 70 / 2
Регистрация: 30.06.2011
Сообщений: 176
06.09.2011, 08:30 #10
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
 void code( const char* text, char* newtext)
{
  do {
     if ( *text > 64 && *text < 91) *newtext = 155 - *text;
     else if ( *text > 96 && *text < 123) *newtext = 219 - *text;
     else *newtext = *text;
  } while ( newtext++, *text++);
  *newtext =0;
}
 
int main() {
   setlocale( LC_ALL, "Rus");
   char s1[100], s2[100];
   std::cout << "Введите исходную строку: ";
   std::cin >> s1;
   code( s1, s2);
   std::cout << "Закодированная/раскодированная строка: " << s2 << std::endl;
   return 0;
}
0
Thinker
Эксперт С++
4228 / 2202 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
06.09.2011, 10:14 #11
По-моему такие курсовые человек сам должен делать. Изучать литературу, вникать, предлагать свои идеи, а то потом как он будет защищать кого-то (в плане защиты информации), если себя защитить не может...
1
Mr.X
Эксперт С++
3051 / 1696 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
06.09.2011, 17:28 #12
Цитата Сообщение от xAtom Посмотреть сообщение
C++
1
// добавить можно кириллицу, да хоть немецкий.
Не получится, так как функции isalpha и другие из файла cctype работают только с символами
английского алфавита. Можно использовать одноименные функции из файла locale, где
вторым параметром задается локаль, но такой код будет непереносимым, так как стандарт
не обязывает компилятор иметь национальные локали.
Вот так можно сделать:
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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
/////////////////////////////////////////////////////////////////////////////////////////
//                       ШИФР АТБАШ
//Шифр простой замены, использованный для еврейского алфавита и
//получивший оттуда свое название. Шифрование происходит заме-
//ной первой буквы алфавита на последнюю, второй на предпос-
//леднюю (алеф (первая буква) заменяется на тав (последнюю), бет(вторая) заменяется на шин 
//(предпоследняя); из этих сочетани
//шифр и получил свое название). Шифр Атбаш для английского
//алфавита:
//Исходный алфавит: A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
//Алфавит замены:   Z Y X W V U T S R Q P O N M L K J I H G F E D C B A
//Пользуясь изложенным способом:
//А) зашифровать данный текст
//Б) расшифровать данный текст.
/////////////////////////////////////////////////////////////////////////////////////////
// В данной программе можно шифровать атбашем одновременно по нескольким непересекающимся 
//алфавитам. В общем, на курсовую уже не тянет, как минимум на дипломную. 
/////////////////////////////////////////////////////////////////////////////////////////
#include <algorithm>
#include <ctime>
#include <cstdlib>
#include <iostream>
#include <iterator>
#include <set>
#include <string>
/////////////////////////////////////////////////////////////////////////////////////////
typedef std::string       T_str;
typedef T_str::size_type  T_pos;
typedef std::set<T_str>   T_alphabets;
/////////////////////////////////////////////////////////////////////////////////////////
struct  T_get_atbash_symb
{
    const T_alphabets&  alphabets_;
    //-----------------------------------------------------------------------------------
    T_get_atbash_symb(const T_alphabets&  alphabets) : alphabets_(alphabets)
    {}
    //-----------------------------------------------------------------------------------
    char operator() (char  symb)
    {
        for(T_alphabets::const_iterator  alphabet_it = alphabets_.begin();
            alphabet_it != alphabets_.end(); ++alphabet_it)
        {
            T_pos  symb_pos = alphabet_it->find(symb);
            if(symb_pos != T_str::npos)
            {
                return (*alphabet_it)[alphabet_it->size() - symb_pos - 1];
            }
        }
        return  symb;    
    }
};
/////////////////////////////////////////////////////////////////////////////////////////
T_str  get_atbash_str
    (
        const T_str&        s,
        const T_alphabets&  alphabets
    )
{
    T_str  res_str;
    std::transform
        (
            s.begin(),
            s.end(),
            std::back_inserter(res_str),
            T_get_atbash_symb(alphabets)
        );
    return  res_str;
}
/////////////////////////////////////////////////////////////////////////////////////////
struct  T_gen_rand_simb_from
{    
    T_str  str_for_gen_;
    //-----------------------------------------------------------------------------------
    T_gen_rand_simb_from(const T_alphabets&  alphabets)
    {
        for(T_alphabets::const_iterator  alphabet_it = alphabets.begin();
            alphabet_it != alphabets.end(); ++alphabet_it)
        {
            str_for_gen_ += *alphabet_it;
        }
    }
    //-----------------------------------------------------------------------------------
    char operator() ()
    {
        return  str_for_gen_[rand() % str_for_gen_.size()];
    }
};
/////////////////////////////////////////////////////////////////////////////////////////
int main()
{
    std::locale::global(std::locale(""));
    srand( unsigned( time(0) ) );
 
    T_alphabets  alphabets;
    alphabets.insert("abcdefghijklmnopqrstuvwxyz");
    alphabets.insert("ABCDEFGHIJKLMNOPQRSTUVWXYZ");
    alphabets.insert("абвгдеёжзийклмнопрстуфхцчшщъыьэюя");
    alphabets.insert("АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ");
    alphabets.insert("0123456789");        
    alphabets.insert("+*#([.,])№/-");    
 
    const int  S_LEN = 50;
    T_str      s;
    std::generate_n
        (
            std::back_inserter(s),
            S_LEN,
            T_gen_rand_simb_from(alphabets)          
        );
 
    std::cout << "Initial line:"
              << std::endl
              << s
              << std::endl;
    
    std::cout << std::endl
              << "The encrypted line:"
              << std::endl
              << get_atbash_str(s, alphabets)
              << std::endl;
 
    std::cout << std::endl
              << "The decrypted encrypted line:"
              << std::endl
              << get_atbash_str
                     (
                         get_atbash_str(s, alphabets), 
                         alphabets
                     )
              << std::endl;
}
1
06.09.2011, 17:28
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.09.2011, 17:28
Привет! Вот еще темы с ответами:

Шифр Цезаря - C++
Створити програму, що реалізовує алгоритм дешифрування Цезаря, для латинського алфавіту з прогресуючим кроком від 3 до 10 (ВЕЛИКІ малі...

шифр RSA - C++
Добрый день, люди добрые помогите )) не могу понять в чем ошибка... сам алгоритм Два больших простых числа P и Q N=PQ затем...

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

Шифр цезаря - C++
Столкнулся с такой проблемой нужно &quot;Разработать прикладное приложение для шифрования текста с помощью шифра простой замены. Приложение...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

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