Проeкт - шифровка



До сих пор мы ознакомились с вводом и выводом из консоли, управлением переменными и строками, простой математикой. А теперь самое время написать простую программу, где мы все это используем. Создадим программу, которая будет спрашивать у пользователя четырехзначное число и шифровать его. Возникает вопрос : как, ведь мы не учили технику шифрования? Верно, но мы уже знаем достаточно, чтобы обойтись и без этого: мы знаем как обращаться со строками и этого хватит для простого примера.

Начнем с того, что спросим у пользователя число. К этому моменту мы должны хорошо знать, как это делать:

Console.Write("Введите 4-хзначное число для шифровки:");
string rawNumber = Console.ReadLine();
  Почему стока, а не целое? Потому, что нам надо совершить различные операции для шифровки над каждой цифрой, а "нарезать" число удобнее с помощью Substring(), вот так:
int digit1 = Convert.ToInt32(rawNumber.Substring(0,1));
int digit2 = Convert.ToInt32(rawNumber.Substring(1,1));
int digit3 = Convert.ToInt32(rawNumber.Substring(2,1));
int digit4 = Convert.ToInt32(rawNumber.Substring(3,1));
  Хорошо, теперь у нас каждая цифра хранится в своей переменной. Что дальше? Ради упражнения, допустим, что мы хотим увеличить каждую цифру на 4. То есть, 4 станет 8, 5 - 9, а 6 - 0. так что , число 1236 "превратится" в 5670. Ну, легче всего это делается с помощью "%" (надеюсь еще помним, что это). Потому, что цифр всего 10 (0 - 9) и нам надо "поправить" каждую на 4, все что надо сделать это :
digit1 = (digit1 + 4) % 10;
digit2 = (digit2 + 4) % 10;
digit3 = (digit3 + 4) % 10;
digit4 = (digit4 + 4) % 10;
  К каждой цифре добавляется 4, а "%" отсекает десятки. Значит, если число до операции было 11, то останется 1. От 13 останется 3, а если была девятка, то так и останется 9. Все что мы делаем это: увеличиваем значение цифр на 4, а если значение превышает 9, отсекаем десятки. К сожалению, я не математик, поэтому не судите строго за такое объяснение.
  Отлично, каждая цифра зашифрована и сохранена. А как же собрать их обратно в число? Ну, один из вариантов - соединить их в одну строку, а потом эту строку сконвертировать в число:
rawNumber = digit1.ToString() + digit2.ToString() + digit3.ToString() + digit4.ToString(););
int convertedNumber = Convert.ToInt32(rawNumber);
  Может показаться странным то, что мы вызвали метод ToString() на каждую цифру при "склеивании" числа. Ну, а что же происходит, когда мы просто используем оператор "+" над двумя целыми? Правильно, складываются они. Ведь если наши цифры 1,2,3,4 наше конечное число должно быть 1234... не 10, которое мобы получили при простом складывании.Мы используем ToString() чтобы заставить С# складывать переменные как стоки, а не как числа. Ну, конечно есть и более простой способ "склеивания" цифр в число:
int convertedNumber = (digit1*1000) + (digit2*100) + (digit3*10) + digit4;
Например, наши цифры 1,2,3,4. Мы можем выразить этот конкретный случай более наглядно:
int convertedNumber = (1000) + (200) + (30) + 4;
Да здравствует старая добрая десятичная система исчисления! С шифровкой покончили, теперь будем расшифровывать. Это практически то же самое, только наоборот. В нашем случае с зашифрованными цифрами мы делаем следующее:
digit1 = (digit1 + 6) % 10;
digit2 = (digit2 + 6) % 10;
digit3 = (digit3 + 6) % 10;
digit4 = (digit4 + 6) % 10;
Почему добавляем 6? Просто мы уже добавили 4, и при добавлении еще 6-ти, цифры сделают полный оборот(тот же принцип, когда цифры при шифровке превышали 9). Можно это проверить сделав шифрование а затем расшифровку. Мы получим те же числа, что были в начале.
 
int decryptedNumber = (digit1*1000) + (digit2*100) + (digit3*10) + digit4;
Console.WriteLine("Decrypted Value: " + decryptedNumber);
  Естественно, эта программа ОЧЕНЬ ограничена. Она расчитана на то, что пользователь ТОЧНО введет 4-значое число. Если введут меньше 4 чисел, программа вызовет ошибку. Если введут не цифры, программа тоже вызовет ошибку. К тому же нет другого пути зашифровать новое число, не перезапустив программу. На конец-то пришло время перейти к более сложным программам, которые будут использовать настоящую логику, протекать по-разному, опираясь на действия пользователя. Все это мы узнаем из следующего раздела. Не выключаем компьютер!
  А пока, вот пример кода для шифровальной программы:
using System;

namespace F_ProjectEncrpyt
{
    class Class1
    {
        [STAThread]
        static void Main(string[] args)
        {
            // Запрашиваем число
            Console.Write("Введите 4-хзначное число для шифровки:");
            string rawNumber = Console.ReadLine();
            Console.WriteLine(Environment.NewLine + "Изначальное значение: " + rawNumber);

            // Сохраняем каждую цифру:
            int digit1 = Convert.ToInt32(rawNumber.Substring(0, 1));
            int digit2 = Convert.ToInt32(rawNumber.Substring(1, 1));
            int digit3 = Convert.ToInt32(rawNumber.Substring(2, 1));
            int digit4 = Convert.ToInt32(rawNumber.Substring(3, 1));

            // Увеличиваем каждую на 4 (4 становится 8 , 5 становится 9, 6 - 0 и т.д...)
            digit1 = (digit1 + 4) % 10;
            digit2 = (digit2 + 4) % 10;
            digit3 = (digit3 + 4) % 10;
            digit4 = (digit4 + 4) % 10;

            // Используем цифры для "склеивания" нашего зашифрованного числа
            int convertedNumber = (digit1 * 1000) + (digit2 * 100) + (digit3 * 10) + digit4;
            Console.WriteLine("Зашифрованное значение: " + convertedNumber);

            // Увеличиваем каждую цифру на 6 (возвращаем ей ее начальное значение)
            digit1 = (digit1 + 6) % 10;
            digit2 = (digit2 + 6) % 10;
            digit3 = (digit3 + 6) % 10;
            digit4 = (digit4 + 6) % 10;

            // Используем цифры для "склеивания" нашего разшифрованного числа
            int decryptedNumber = (digit1 * 1000) + (digit2 * 100) + (digit3 * 10) + digit4;
            Console.WriteLine("Разшифрованное значение: " + decryptedNumber);

            // А теперь попросим пользователя нажать "Enter" для выхода из программы
            Console.WriteLine("Программа завершена. Нажмите "Enter" для выхода...");
            Console.ReadLine();

        }
    }
}

***

В данной статье был использован материал из цикла "Professor Mustard Lessons - Learn C# or Die Trying"


Автор: Макагон Сергей
Источник: http://devoid.com.ua

Полезные ссылки:

Опубликовал admin
6 Июл, Воскресенье 2008г.
stimulsoft Скачать StimulsoftReportsNetTrial.zip Скачать StimulsoftReportsWebTrial.zip Stimulsoft Reports.Net Stimulsoft Reports.Web

Объявления

Последние комментарии

Ваше мнение

Для чего мы апгрейдим свой компьютер?: