Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [Алгоритм] Шифр Цезаря с ключевым словом


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

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

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

Количество ключей в системе Цезаря с ключевым словом равно n!. Для де-шифрации необходимо с использованием известного ключа шифрования опреде-лить соответствие исходного и заменяющего алфавита и выполнить обратную подстановку. 

Автор: Fin 4.11.2007, 00:33
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;
}

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

Автор: betal 16.9.2008, 13:42
а как насчет того же самое но если дан только зашифрованный текст ?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)