Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Алгоритм] Шифр Цезаря с ключевым словом, Шифр Цезаря с ключевым словом 
:(
    Опции темы
000000
Дата 3.11.2007, 09:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 31.10.2007

Репутация: нет
Всего: нет



помогите пожалуйста с алгоритмом  Если можно то на С++ 
В данной разновидности шифра Цезаря ключ задается числом k (0<=k<=n-1) и коротким ключевым словом или предложением. Выписывается алфавит, а под ним, начиная с k-й позиции, ключевое слово. Оставшиеся буквы записываются в алфавитном порядке после ключевого слова. В итоге мы получаем подстановку для каждой буквы. Требование, чтобы все буквы ключевого слова были различ-ными не обязательно, необходимо только записывать ключевое слово без повто-рения одинаковых букв 

ключевое слово – ‘ключ’
k=2
Исходный алфавит    а    б    в    г    д    е    ё    ж    …    э    ю    я
Измененный алфавит    э    я    к    л    ю    ч    а    б    …    ь    ы    ъ

Исходный текст:                 пример шифрования 
Зашифрованный текст:      ймгжчм фгрмикэзгъ

Количество ключей в системе Цезаря с ключевым словом равно n!. Для де-шифрации необходимо с использованием известного ключа шифрования опреде-лить соответствие исходного и заменяющего алфавита и выполнить обратную подстановку. 
PM MAIL   Вверх
Fin
Дата 4.11.2007, 00:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дракон->Спать();
**


Профиль
Группа: Участник
Сообщений: 687
Регистрация: 4.1.2006

Репутация: 1
Всего: 10



smile
Код

#include <stdio.h>

typedef unsigned char uchar;

// Формируем таблицу перевода. keyAlpha будет содержать таблицу ключей
bool convertAlphaBet(uchar *Alphabet,  uchar *key, int k, uchar keyAlpha[256])
{
    bool res=false;
    int lenght=0;
    if (Alphabet != NULL)
    {
       while (Alphabet[lenght] != 0) lenght++;
       if (lenght >= 256) lenght = 0;
    }
    if ((lenght > 0) && (keyAlpha != NULL) && (key != NULL) 
        && (k < lenght) && (k >= 0))
    {
        uchar let[256] = {0};
        int i=0;
        while (i<256) keyAlpha[i++]=0;           
        i=0;
        while ((i<lenght) && (key[i] != 0))                 // Цикл для ключа
        {
           
           if (let[key[i]] == 0) 
           {
               keyAlpha[Alphabet[k++]]=key[i];
               if (k == lenght) k=0;
               let[key[i]]=1;
           }
           i++;
        }
        int z=0;
        while (i<lenght)                                  // Цикл для отсавшихся букв алфавита
        {
           if (let[Alphabet[z]] == 0)
           {
              keyAlpha[Alphabet[k++]]=Alphabet[z];
              if (k == lenght) k=0;
              let[Alphabet[z]]=1;
              i++;
           }
           z++;
           
        }
        res=true;
    }   
    return res;
}

// Шифрование
bool Crypt(uchar keyAlpha[256], uchar *src, uchar *crp)
{
    bool res=false;
    if ((src !=NULL) && (crp != NULL))
    {
        int i=0;
        while (src[i] != 0)
        {
           if (keyAlpha[src[i]] != 0) crp[i]=keyAlpha[src[i]];
           else crp[i]=src[i];
           i++;
        }
        crp[i]=0;
        res=true;
    }
    return res;
}


// расшифровка
bool Encrypt(uchar keyAlpha[256], uchar *src, uchar *crp)
{
   bool res=false;
    if ((src !=NULL) && (crp != NULL))
    {
        int i=0;
        int z=0;
        while (src[i] != 0)
        {
           z=0;
           while ((z<256) && (keyAlpha[z] != src[i])) z++;
           if (z == 256) crp[i]=src[i];
           else crp[i]=(uchar)z;
           i++;
        }
        crp[i]=0;
        res=true;
    }
    return res;
}

int main(int argv, char **argc)
{
    if (argv == 2)
    {
       uchar AlphaBet[]="abcdefghijklmnopqrstuvwxyz";  // Алфавит 
       uchar key[]="klin";                             // Ключевое слово 
       int k=7;                                        // Смешение
       uchar keyAlpha[256];
       uchar *Phr=NULL;
       uchar *EnPhr = NULL;
       if (convertAlphaBet(AlphaBet, key, k, keyAlpha))
       {
            int len = 0;
            while (argc[1][len] != 0) len++;
            len++;
            Phr=new uchar[len];
            EnPhr = new uchar [len];
            if (Phr != NULL) 
            {
                if (Crypt(keyAlpha, (uchar*) argc[1],  Phr))
                {
                   printf("%s\n", Phr);
                   Encrypt(keyAlpha, Phr, EnPhr);
                   printf("%s\n", EnPhr);
                }
                
            }
            
       }
       if (Phr != NULL) delete [] Phr;
       if (EnPhr != NULL) delete [] EnPhr;
    }
    return 0;
}



--------------------
Пролетал мимо.
PM MAIL   Вверх
000000
Дата 12.11.2007, 19:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 31.10.2007

Репутация: нет
Всего: нет



я извиняюсь но как заставить ее работать 
чтобы ввести и закодировать информацию?
помогите пожалуйста я в ВИСУАЛЕ 6
попробовал что то он у меня после моих добавлений завис 

Это сообщение отредактировал(а) 000000 - 12.11.2007, 19:54
PM MAIL   Вверх
betal
Дата 16.9.2008, 13:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 208
Регистрация: 26.12.2006

Репутация: 1
Всего: 1



а как насчет того же самое но если дан только зашифрованный текст ?
--------------------
101100010100001101100001110100101111011легкие деньги
PM WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.1246 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.