1

Тема: Шифр Цезаря

Всім привіт! Допоможіть будь ласка із алгоритмом цезаря, а саме із програмою, що має відкривати текстовий файл, щитати його зміст, зашифрувати та записати новий зашифрований файл. Наперед дякую))

2 Востаннє редагувалося yarko (25.09.2014 09:42:52)

Re: Шифр Цезаря

Алгоритм Цезаря це вже бог знає скільки століть як музейний експонат.
Для чого вам таке старе барахло, якщо не таємниця?

UPD: google "Шифр Цезаря". Вже давно є готові рішення...

3 Востаннє редагувалося volodyaadd (25.09.2014 09:45:19)

Re: Шифр Цезаря

мені треба для лабораторної роботи, можна якомога простіший варіант, а в І-неті набагато складніші

4

Re: Шифр Цезаря

Відкрию вам таємницю: цей форум - також в інтернеті, і тут вам дадуть тільки складний варіант, та й той за гроші.
І взагалі - картинку в правилах бачили? То подивіться.

5

Re: Шифр Цезаря

Готове рішення взято з гуглу
    

    using System;
    using System.Drawing;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
     
    namespace CSharpLesson14.Шифрование_Цезаря
    {
        class Program
        {
            //Главный метод, в котором будут связаны другие функции
            static void Main(string[] args)
            {
                try                                                         //Обязательно обрататываем исключение
                {
                    Console.ForegroundColor = ConsoleColor.Yellow;
                    Console.WriteLine("Здравствуйте! Это программа шифровки текста Цезаря");
                    Console.ForegroundColor = ConsoleColor.Red;
                    Console.WriteLine("Примечание: введите текст англискими буквами!");
                    Console.ResetColor();
                    Console.Write("Введите слово или словосочитание: ");
                    string str = Console.ReadLine();                        //Получаем строку
                    Console.Write("Введите число сдвига: ");
                    int offset = Convert.ToInt16(Console.ReadLine());       //Получаем индекс смещения
                    Console.Write("Сколько вариантов вывести? ");
                    int variant = Convert.ToInt16(Console.ReadLine());
                    string cryptWord = Crypt(str, offset);                  //Вызываем метод шифровки, тем самым шифруем слово
                    Console.ForegroundColor = ConsoleColor.White;
                    Console.WriteLine("Один из вариантов зашифрованного текста:");
                    Console.ForegroundColor = ConsoleColor.Green;
                    Console.WriteLine(cryptWord);                           //Выводим шифрованную строку
                    Console.ForegroundColor = ConsoleColor.White;
                    Console.WriteLine("Дешифрованное: ");
                    Console.ForegroundColor = ConsoleColor.Green;
                    Console.WriteLine(deCrypt(cryptWord, offset));          //Выводим дешифрованную строку
                    Console.ForegroundColor = ConsoleColor.White;
                    Console.WriteLine("Еще варианты зашифровки: ");
                    Console.ForegroundColor = ConsoleColor.Green;
                    hack(cryptWord, variant);
                    Console.ResetColor();
                    Console.Write("Введите любую клавишу, чтобы выйти из программы... ");
                    Console.ReadKey();                                      //Ждём выхода из программы
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex);
                }
            }
            //Метод для поиска возможных вариантов шифровки
            public static void hack(string word, int variant)
            {
                for (int i = 1; i <= variant; i++)
                {
                    Console.WriteLine(i +"."+ " " + deCrypt(word, i));
                }
            }
            //Наш метод шифровки будет принимать два параметра: слово в открытом виде и индекс смещения
            public static string Crypt(string word, int offset)
            {
                /*Внесём в функцию алфавит, предлагаю для удобства сделать две отдельные
                строки. В первой будет алфавит. Во второй заглавный алфавит.*/
     
                string Alphabet = "abcdefghijklmnopqrstuvwxyz";
                string AlphebetZagl = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
     
                string Out = "";                                // В этой переменной будет результат
     
                //Теперь создадим цикл, который позволит нам "пройтись" по строке по символьно
                for (int i = 0; i < word.Length; i++)           //word.Lenght - это длина строки. Т.е. количество символов в строке
                {
     
                    if (Alphabet.IndexOf(word[i]) != -1)        //Проверяем, есть ли в нашем алфавите данный символ
                    {
                        /*Если есть, то найдём номер этого символа в алфавите и прибавим к нему смещение
                         но есть один ньюанс, если есть символ z то при смещении в один он будет равняться символу а, т.е. отчёт символов начнётся с начала алфавита
                         для реализации этого нюанса мы просто используем остаток от деления на размерность алфавита.*/
                        Out += Alphabet[(Alphabet.IndexOf(word[i]) + offset) % Alphabet.Length];
                    }
                    //Если нашего символа нет в алфавите с маленьким регистром, то может быть он есть в алфавите с большим регистром?
                    else if (AlphebetZagl.IndexOf(word[i]) != -1)
                    {
                        // Здесь всё тоже самое, что и в предыдущем условии
                        Out += AlphebetZagl[(AlphebetZagl.IndexOf(word[i]) + offset) % AlphebetZagl.Length];
                    }
                    //Ну и если, нашего символа в алфвите нет, то мы запишем его в изначальном виде (какой вошёл, такой и выйдет), будь то знаки препинания или цифры.
                    else
                    {
                        Out += word[i];
                    }
     
                }
                return Out;  // Возвращаем значение
            }
            //Наш метод дешифровки так же будет принимать два параметра слово и индекс смещения
            public static string deCrypt(string word, int offset)
            {
                //Для начала нужно предопределить алфавит
                string Alphabet = "abcdefghijklmnopqrstuvwxyz";
                string AlphabetZagl = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
     
                string Out = ""; // тут будет результат работы функции
                for (int i = 0; i < word.Length; i++) // снова проходим по всем символам слова
                {
                    if (Alphabet.IndexOf(word[i]) != -1)// если символ имеется в алфавите
                    {
                        //От символа шифрованного текста отнимаем индекс смещения и прибавляем мощность алфавита
                        //К чему тут остаток от деления ясно из прошлой функции шифровки
                        Out += Alphabet[(Alphabet.IndexOf(word[i]) - offset + Alphabet.Length) % Alphabet.Length];
                    }
                    //Если нету символа в алфавите, то может быть он есть в алфавите заглавныхбукв?
                    else if (AlphabetZagl.IndexOf(word[i]) != -1)
                    {
                        //То же самое, что и в предыдущем шаге
                        Out += AlphabetZagl[(AlphabetZagl.IndexOf(word[i]) - offset + AlphabetZagl.Length) % Alphabet.Length];
                    }
                    else  //И если нашего символа нету в алфавитах строчных и заглавных букв, то запишем его в исходном виде (какой зашёл, такой и вышел).
                    {
                        Out += word[i];
                    }
     
                }
                return Out;
            }
        }
    }

6 Востаннє редагувалося quez (25.09.2014 11:31:15)

Re: Шифр Цезаря

Немає куди простіше

Прихований текст
import Data.Char

shift = 10

cypherCharacter c = chr (ord 'a' + ((ord c - ord 'a' + shift) `mod` 26))

cypher s = map cypherCharacter s

main = do
   src <- readFile "file.in"
   writeFile "file.out" (cypher src)

Правда, працює лише для нижнього регістру англійської, принаймні для інших не перевіряв.

7 Востаннє редагувалося Arete (25.09.2014 13:29:10)

Re: Шифр Цезаря

Наваяв щось таке... працює тільки з латиницею та з додатнім зсувом.

#include <fstream>

//--------------------------------------------------------------------
// Визначення послідовності символів в яку попадає ch
//--------------------------------------------------------------------
void getAlphaRange(const char ch, char& first, char& last ) {
  first = '\0';

  // latin uppercase
  if( ch >= 'A' && ch <= 'Z' ) {
    first = 'A';
    last = 'Z';
    return;
  }

  // latin lowercase
  if( ch >= 'a' && ch <= 'z' ) {
    first = 'a';
    last = 'z';
    return;
  }
}

//--------------------------------------------------------------------
// Кодування символу ch з кроком step
//--------------------------------------------------------------------
char codeCesar(char ch, int step) {
  char first = '\0';
  char last = '\0';
  getAlphaRange( ch, first, last );

  if( first != '\0' ) {
    step = step % (last - first);
    if( ch + step > last )
      ch = first + ( ch + step - last - 1);
    else
      ch += step;
  }
  return ch;
}


//--------------------------------------------------------------------
// Розкодування символу ch з кроком step
//--------------------------------------------------------------------
char uncodeCesar( char ch, int step) {
  char first = '\0';
  char last = '\0';
  getAlphaRange( ch, first, last );

  if( first != '\0' ) {
    step = step % (last - first);
    if( ch - step < first )
      ch = last - ( first - (ch - step) - 1 );
    else
      ch -= step;
  }
  return ch;
}

//--------------------------------------------------------------------
// Кодування та розкодування файлів
//--------------------------------------------------------------------
void cesarFile( int step ) {
  std::fstream inputFile( "/home/arete/input.txt", std::ios::in );
  std::fstream codeFile( "/home/arete/code.txt", std::ios::in | std::ios::out | std::ios::trunc );
  std::fstream uncodeFile( "/home/arete/uncode.txt", std::ios::out | std::ios::trunc );
  char ch;

  // Кодування в файл
  inputFile.unsetf( std::ios_base::skipws );
  while( inputFile >> ch )
      codeFile << codeCesar( ch, step );

  // Розкодування в файл
  codeFile.seekp( 0 );
  codeFile.unsetf( std::ios_base::skipws );
  while( codeFile >> ch )
      uncodeFile << uncodeCesar( ch, step );
}

//--------------------------------------------------------------------
// main
//--------------------------------------------------------------------
int main( int argc, char **argv ) {

  int step = 3;
  if (argc > 1)
    step = atoi( argv[1] );

  cesarFile( step );
  
  return 0;
}

./test 3

input.txt

ABC KLM XYZ
abc klm xyz

code.txt

DEF NOP ABC
def nop abc

uncode.txt

ABC KLM XYZ
abc klm xyz