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

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

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

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

04.09.2011, 22:04. Просмотров 6729. Ответов 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.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.09.2011, 22:04     Шифр Атбаш
Посмотрите здесь:

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

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

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

Шифр Вернама - C++
Доброе время суток, совсем недавно заинтересовался С++. Скачал исходник - никак не могу понять в чем ошибка, отказывается компилироваться....

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

Шифр Гронсфельда (!) - C++
Пожалуйста, помогите! Очень срочно :) Написать программу на С++, осуществляющую шифрование и дешифрование каких-либо данных. Тип...

шифр Гронсфельда - C++
доброго времени суток! помогите, пожалуйста, написать программу "из внешнего файла в формате «ТХТ» ввести текст и зашифровать/расшифровать...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
xAtom
914 / 739 / 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
78 / 78 / 2
Регистрация: 11.06.2011
Сообщений: 335
05.09.2011, 09:16  [ТС]     Шифр Атбаш #3
Извините за дурацкий вопрос, но не могли бы Вы пояснить что это за операторы: isalpha, isupper, toupper, *src, *cch, *dch?
fasked
Эксперт С++
4933 / 2513 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 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
78 / 78 / 2
Регистрация: 11.06.2011
Сообщений: 335
05.09.2011, 15:59  [ТС]     Шифр Атбаш #6
Nameless One, так покажите класс и решите эту "лабораторную".
P.S. Задание может и не сомое сложное, но оформить придется по ГОСТам, как курсовую.
fasked
Эксперт С++
4933 / 2513 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
05.09.2011, 16:05     Шифр Атбаш #7
Цитата Сообщение от DINAzavR Посмотреть сообщение
так покажите класс и решите эту "лабораторную"
Так Вам уже написали решение.
Цитата Сообщение от DINAzavR Посмотреть сообщение
но оформить придется по ГОСТам, как курсовую.
Или оформить тоже за Вас надо?
DINAzavR
78 / 78 / 2
Регистрация: 11.06.2011
Сообщений: 335
05.09.2011, 22:47  [ТС]     Шифр Атбаш #8
Уточню задание, нужно ввести и обработать текс.
Решение изучаю, разбираюсь целый день, но кроме новых функций ничего не понял.
Появились мысли как решать, запишу пока не забыл: необходимо разбить введенный текст на буквы, определить их порядковые номера в соответствии с алфавитном, а потом сопоставить с обратным. Как-то так, но я не представлю как это реализовать. Программисты, вся надежда на Вас.
easybudda
Эксперт CЭксперт С++
9470 / 5483 / 927
Регистрация: 25.07.2009
Сообщений: 10,507
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++
4225 / 2199 / 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++ - C++
Народ,помогите пожалуйста перевести шифр с паскаля на c++ :) program strug_production; var s_out, s_in, str,itogstroka,tekbukva:...

Несложный шифр - C++
Здравтвуйте! Никак не могу придумать как реаоизовать данный &quot;шифр&quot;: Дан файл с числами и файл с буквами. Каждой букве соответствует...

Аффинный шифр - C++
Здравствуйте. Мне необходимо провести кодирование и декодирование текста при использовании аффинного шифра. Я написал следующую программу: ...

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


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

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

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