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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 48, средняя оценка - 4.88
DINAzavR
77 / 77 / 2
Регистрация: 11.06.2011
Сообщений: 335
04.09.2011, 22:04     Шифр Атбаш #1
Начался новый учебный год, не успел оправиться от сесси, как задали новую курсовую. Как бы то ни было учиться нужно, ну по крайней мере пытаться.
Задание выглядит примерно так: "Шифр простой замены, использованный для еврейского алфавита и
получивший оттуда свое название. Шифрование происходит заме-
ной первой буквы алфавита на последнюю, второй на предпос-
леднюю (алеф (первая буква) заменяется на тав (последнюю), бет(вторая) заменяется на шин (предпоследняя); из этих сочетани
шифр и получил свое название). Шифр Атбаш для английского
алфавита:
Исходный алфавит: 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.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.09.2011, 22:04     Шифр Атбаш
Посмотрите здесь:

шифр C++
C++ Шифр Цезаря
C++ Шифр Гронсфельда (!)
шифр Гронсфельда C++
C++ Шифр Полибия
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
xAtom
 Аватар для xAtom
910 / 735 / 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;
}
DINAzavR
77 / 77 / 2
Регистрация: 11.06.2011
Сообщений: 335
05.09.2011, 09:16  [ТС]     Шифр Атбаш #3
Извините за дурацкий вопрос, но не могли бы Вы пояснить что это за операторы: isalpha, isupper, toupper, *src, *cch, *dch?
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
05.09.2011, 10:20     Шифр Атбаш #4
Цитата Сообщение от DINAzavR Посмотреть сообщение
isalpha
Является ли символ буквой в соответствии с текущей локалью.
Цитата Сообщение от DINAzavR Посмотреть сообщение
isupper
Является ли символ прописной (заглавной) буквой в соответствии с текущей локалью.
Цитата Сообщение от DINAzavR Посмотреть сообщение
toupper
Преобразовать букву в прописную (заглавную).
Цитата Сообщение от DINAzavR Посмотреть сообщение
*src, *cch, *dch
Разыменование указателя, я так полагаю.
Nameless One
05.09.2011, 15:32
  #5

Не по теме:

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

DINAzavR
77 / 77 / 2
Регистрация: 11.06.2011
Сообщений: 335
05.09.2011, 15:59  [ТС]     Шифр Атбаш #6
Nameless One, так покажите класс и решите эту "лабораторную".
P.S. Задание может и не сомое сложное, но оформить придется по ГОСТам, как курсовую.
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
05.09.2011, 16:05     Шифр Атбаш #7
Цитата Сообщение от DINAzavR Посмотреть сообщение
так покажите класс и решите эту "лабораторную"
Так Вам уже написали решение.
Цитата Сообщение от DINAzavR Посмотреть сообщение
но оформить придется по ГОСТам, как курсовую.
Или оформить тоже за Вас надо?
DINAzavR
77 / 77 / 2
Регистрация: 11.06.2011
Сообщений: 335
05.09.2011, 22:47  [ТС]     Шифр Атбаш #8
Уточню задание, нужно ввести и обработать текс.
Решение изучаю, разбираюсь целый день, но кроме новых функций ничего не понял.
Появились мысли как решать, запишу пока не забыл: необходимо разбить введенный текст на буквы, определить их порядковые номера в соответствии с алфавитном, а потом сопоставить с обратным. Как-то так, но я не представлю как это реализовать. Программисты, вся надежда на Вас.
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
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;
}
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;
}
Thinker
Эксперт C++
 Аватар для Thinker
4215 / 2189 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
06.09.2011, 10:14     Шифр Атбаш #11
По-моему такие курсовые человек сам должен делать. Изучать литературу, вникать, предлагать свои идеи, а то потом как он будет защищать кого-то (в плане защиты информации), если себя защитить не может...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.09.2011, 17:28     Шифр Атбаш
Еще ссылки по теме:

Шифр Вижиненра, шифр скитала C++
Шифр Вижинера C++
C++ Шифр Атбаш

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

Или воспользуйтесь поиском по форуму:
Mr.X
Эксперт С++
 Аватар для Mr.X
2805 / 1581 / 248
Регистрация: 03.05.2010
Сообщений: 3,685
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;
}
Yandex
Объявления
06.09.2011, 17:28     Шифр Атбаш
Ответ Создать тему
Опции темы

Текущее время: 22:50. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru