Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > .NET > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail


Ответ
 
Опции темы
Старый 05.02.2012, 18:19   #1
unijkoder
Пользователь
 
Регистрация: 21.01.2012
Сообщений: 37
По умолчанию Шифр Цезаря. Апгрейд.

Здравствуйте уважаемые.

Написал прогу реализующую шифр Цезаря со смешением. Все работает.

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

Код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace cezar
{
    class Program
    {
        static void Main(string[] args)
        {
            int n = 1, key = 1;
            //количество сдвигов
 
            Console.WriteLine("Введите слово,которое нужно зашифровать:");
            string s = Console.ReadLine();//храню слово, которое будем шифровать
 
            Console.WriteLine("Введите ключ:");
            key = Convert.ToInt32(Console.ReadLine());
 
            string s1 = "";//храню результат шифрования
 
            //string alf = "abcdefghijklmnopqrstuvwxyz";//работаю с английским алфавитом
            string alfphabet = "абвгдеёжзийклмнопрстуфхцчшщъыьэюя";//работаю с русским алфавитом
 
            int m = alfphabet.Length; //количество знаков в алфавите
 
            for (int i = 0; i < s.Length; i++)//цикл перебора букв шифруемого слова
            {
                for (int j = 0; j < alfphabet.Length; j++)//цикл сравнения каждой бкувы с алфавитом
                {
                    if (s[i] == alfphabet[j]) // в случае совпадения создаем темп, где храню номер буквы со сдвигом
                    {
                        int temp = j * n + key;//номер буквы+сдвиг в темп
 
                        while (temp >= m)//чтобы темп не уходил за рамки алфавита
                            temp -= m;
 
                        s1 = s1 + alfphabet[temp];//заношу зашифрованную букву в переменную для ее хранения
                    }
                }
 
            }
 
            Console.WriteLine("Зашифрованное слово:" + s1);
            Console.ReadLine();
        }
    }
}

Последний раз редактировалось Stilet; 05.02.2012 в 18:35.
unijkoder вне форума Ответить с цитированием
Старый 05.02.2012, 18:37   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,840
По умолчанию

Цитата:
чтобы было еще ключевое слово
Так ведь оно у тебя уже есть...
Цитата:
возможность дешифрования.
Да то же самое только
Код:
 int temp = j - key;//номер буквы-сдвиг в темп
Это же Цезарь.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 05.02.2012, 20:29   #3
unijkoder
Пользователь
 
Регистрация: 21.01.2012
Сообщений: 37
По умолчанию

У меня есть просто смещение. А нужно добавить еще ключевое слово.
Ну и прошу помочь интегрировать в прогу декодирование.
unijkoder вне форума Ответить с цитированием
Старый 05.02.2012, 21:57   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,840
По умолчанию

Цитата:
ключевое слово.
Тогда поясняй что имеется ввиду.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 05.02.2012, 22:38   #5
unijkoder
Пользователь
 
Регистрация: 21.01.2012
Сообщений: 37
По умолчанию

Шифр Цезаря
Юлий Цезарь повествует о посылке зашифрованного сообщения Цицерону. Используемая при этом система подстановок была одноалфавитной, но не являлась системой Цезаря: латинские буквы заменялись на греческие способом, который не был ясен из рассказа Цезаря. Информация о том, что Цезарь действительно использовал систем у Цезаря, пришла от Светония.
В шифре Цезаря каждая буква замещается на букву, находящуюся k символами правее по модулю равному количеству букв в алфавите. (Согласно Светонию у Цезаря k=3 n=50)

Ck(j)=(j+k)(mod n), n - количество букв в алфавите (1.2)

Очевидно, что обратной подстановкой является:

Ck-1(j)=Сn-k=(j+n-k)(mod n) (1.3)

Шифр Цезаря с ключевым словомВ данной разновидности шифра Цезаря ключ задается числом k (0<=k<=n-1) и коротким ключевым словом или предложением. Выписывается алфавит, а под ним, начиная с k-й позиции, ключевое слово. Оставшиеся буквы записываются в алфавитном порядке после ключевого слова. В итоге мы получаем подстановку для каждой буквы.
unijkoder вне форума Ответить с цитированием
Старый 05.02.2012, 23:04   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,840
По умолчанию

Покажу как бы делал я:
Код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Цезарь
{
    class Program
    {
        static string abc = "qwertyuiopasdfghjklzxcvbnm йцукенгшщзфывапролджэячсмитьбю";
        static string Шифровка(int Key, string Word, bool encode)
        {
            string res = "";
            for (int i = 0; i < Word.Length; i++)
            {
                int k = abc.IndexOf(Word[i]);
                k += (encode)?Key:-Key;
                res += abc[k];
            }
            return res;
        }
        static void Main(string[] args)
        {
            string w = "hello world";
            string e = Шифровка(5, w,true);
            string r = Шифровка(5, e, false);
            Console.WriteLine("{0}\n{1}",e,r);
            Console.ReadKey();
        }
    }
}
Однако тут есть прикол - я не учитываю что будет если закодированный символ попадет за пределы диапазона алфавита.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 06.02.2012, 00:00   #7
unijkoder
Пользователь
 
Регистрация: 21.01.2012
Сообщений: 37
По умолчанию

как учесть?
unijkoder вне форума Ответить с цитированием
Старый 06.02.2012, 00:07   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,840
По умолчанию

А ты подключи смекалку
Подумай что нужно сделать чтоб в переменной "к" в моем примере не было значений больше чем длина алфавита и меньше нуля.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 06.02.2012, 00:46   #9
unijkoder
Пользователь
 
Регистрация: 21.01.2012
Сообщений: 37
По умолчанию

былаб смекалка, я бы сюда не зашел)))

А могешь мою прогу переделать? Я так понимаю для тебя - нетрудно.
unijkoder вне форума Ответить с цитированием
Старый 06.02.2012, 02:20   #10
MooNDeaR
В стагнации
Участник клуба
 
Аватар для MooNDeaR
 
Регистрация: 29.07.2011
Сообщений: 1,306
По умолчанию

Сто лет уже ничего не шифровал
Хотя помню в прошлом году была лабораторная на С++ реализовал шифр виженера. Причем и для русского и для английского алфавитов. Во мороки было
E-mail: pashaworking@gmail.com | ICQ: 479914426 | Skype: moondearr
Понять, чего от тебя требует заказчик – это уже половина всей работы, а иногда и полностью выполненное задание.
MooNDeaR вне форума Ответить с цитированием
Ответ

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
шифр Цезаря Defa4ka Помощь студентам 5 23.10.2011 13:48
Расшифруйте шифр Цезаря Мокрый Помощь студентам 8 22.04.2011 17:24
Шифр цезаря (не работает) Айдар Помощь студентам 3 21.06.2010 11:15
Шифр Цезаря Goracio Помощь студентам 1 19.04.2010 14:53
Шифр Цезаря Jasper92 Помощь студентам 3 02.12.2009 19:47