С Новым годом! Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.68/145: Рейтинг темы: голосов - 145, средняя оценка - 4.68
0 / 0 / 0
Регистрация: 20.09.2012
Сообщений: 40

Шифр Виженера

06.05.2014, 14:16. Показов 27840. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Салют(;
Написала прогу с реализацией одного метода, описанного на википедии, по формуле все вроде просто(на фотографии 3 метод), нужно еще два, и никак не могу понять логику.
может кто поможет?


C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
 
namespace Vishenr
{
    public partial class Form1 : Form
    {
        private string alfavit = "абвгдежзийклмнопрстуфхцчшщьыъэюя";
        public Form1()
        {
            InitializeComponent();
        }
        private int CharToNum(char c)
        {
            for (int i = 0; i < alfavit.Length; i++)
                if (alfavit[i] == c) return i;
            return -1;
        }
        private char NumToChar(int n)
        {
            if (n >= 0 && n <= alfavit.Length)
                return alfavit[n];
            else
                return '\0';
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            string ot = textBox2.Text;
            string key = textBox1.Text;
            string wt = "";
            int n = 0;      // Счетчик означающий сколько раз Мы прошли ключ
            while (n * key.Length < ot.Length)
            {
                for (int i = 0; i < key.Length; i++)
                {
                    if (n * key.Length + i == ot.Length) break;
                    if (NumToChar((CharToNum(ot[n * key.Length + i]) + CharToNum(key[i])) % alfavit.Length) != 'я') wt += NumToChar((CharToNum(ot[n * key.Length + i]) + CharToNum(key[i])) % alfavit.Length);
                    else wt += "_";
                }
                n++;
            }
            textBox3.Text = wt;
        }
 
        private void button2_Click(object sender, EventArgs e)
        {
            string wt = textBox3.Text;
            string key = textBox1.Text;
            string ot = "";
            int n = 0;
            while (n * key.Length < wt.Length)
            {
                for (int i = 0; i < key.Length; i++)
                {
                    if (n * key.Length + i == wt.Length) break;
                    if (NumToChar((CharToNum(wt[n * key.Length + i]) - CharToNum(key[i]) + alfavit.Length) % alfavit.Length) != 'я') ot += NumToChar((CharToNum(wt[n * key.Length + i]) - CharToNum(key[i]) + alfavit.Length) % alfavit.Length);
                    else ot += "_";
//                    ot += NumToChar((CharToNum(wt[n * key.Length + i]) - CharToNum(key[i]) + alfavit.Length) % alfavit.Length);
                }
                n++;
            }
            textBox2.Text = ot;
        }
    }
}
Миниатюры
Шифр Виженера  
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
06.05.2014, 14:16
Ответы с готовыми решениями:

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

Реализовать шифр Виженера
Реализовать шифр Виженера для шифрования и дешифрования данных. (В коде Виженера задан цифровой ключ и этот ключ задает смещение для...

Криптоанализ: шифр Виженера + метод Касиски
Здравствуйте всем! Найдутся тут опытные программисты, во общем такая проблема. Нужно сделать криптоанализ шифр Виженера + метод Касиски....

10
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
06.05.2014, 16:38
Что за 3 метода? Опиши яснее.
0
0 / 0 / 0
Регистрация: 20.09.2012
Сообщений: 40
06.05.2014, 16:58  [ТС]
вообщем я прикрепила листок с лекции, там как бы описаны три метода кодирования.
х1х2....Xm это слово которое надо закодировать, k1,k2....km это ключ по которому кодируем, y1,y2,y3...ym - уже закодированное слово.
и вот в лекции 3 разных способа кодировки, ну они в целом почти одинаковые,но различаются
один метод, который на вики(там все понятненько, формула и прочее) я написала в программе, нужно сделать еще две кодировки и соответственно раскодировки.
у меня не выходит
0
Заблокирован
06.05.2014, 17:01
raaawr, то есть это какие-то модификации шифра Виженера?
0
0 / 0 / 0
Регистрация: 20.09.2012
Сообщений: 40
06.05.2014, 17:06  [ТС]
именно)
ну вообщем в чем заключается шифр вижененра,мы заполняем длину слова ключем, повторяя ключ пока мы не заполним всю длину слова, и через таблицу берем буквы, а тут мы сначала подставляем ключ, кодируем, потом уже заполняем буквами слова, которые хотим закодировать,
а следующий метод опять берем ключ,кодируем, и берем уже буквы, которые получились при кодировании.
блин, я как-то фигово объяснила наверное
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
06.05.2014, 20:44
Не понятно из тетрадки, что нужно. Шифр Виженера в Википедии описан достаточно понятно. Там нет вариаций. Просто можно делать по таблице, а можно по формуле.
0
0 / 0 / 0
Регистрация: 20.09.2012
Сообщений: 40
06.05.2014, 21:33  [ТС]
ну вот на википедии описан метод, который в тетради последний, k- ключ, x- слово,которые хотим закодировать, y-закодированное.
в этом-то вся и соль, что остальные два так сказать выдуманы преподом
но могут быть реализованы так же, как и этот, как бы результат кодировки не меняется совсем, меняется только сам ход.
то есть на выходе из всех этих трех кодировок, получится одинаковое шифрование.
принимать с одним методом она не хочет, подавай ей все 3)
а у меня все 3 не получаются, думала тут смогут помочЬ,может кто уже сталкивался)
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
06.05.2014, 21:52
Вот здесь шифрование с помощью таблицы: http://cybern.ru/vizhenera-csharp.html
0
 Аватар для kuroiryuu
328 / 312 / 68
Регистрация: 05.11.2009
Сообщений: 712
06.05.2014, 21:56
судя по фотографии конспекта, в одном случай в качестве ключа выступает сам ключ (k) + кусок слова (x)
но вот последнюю интерпретацию алгоритма я так и не понял ключ + часть результата?
это расшифровка или что-то иное?
0
0 / 0 / 0
Регистрация: 20.09.2012
Сообщений: 40
06.05.2014, 23:35  [ТС]
дада, ключ + часть результата
нужно шифровку и дешифровку сделать для двух этих оставшихся методов)
вы правильно все поняли)

Добавлено через 2 минуты
Дак с помощью таблицы делаются все три метода, только разными способами.
только как бы внутри программы
0
 Аватар для kuroiryuu
328 / 312 / 68
Регистрация: 05.11.2009
Сообщений: 712
07.05.2014, 12:59
шифровку сделать этим методом просто
но вот дешифровка просто напросто не работает по описанному методу
поясню на примере кода, что написал:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
using System;
using System.Text;
 
namespace Algorithms
{
    class Vijener
    {
        public enum Option
        {
            First,
            Second
        }
 
        private const string abc = "abcdefghijklmnopqrstuvwxyzабвгдежзийклмнопрстуфхцчшщьыъэюя";
 
        public string Encryption(string originalText, string secretKey, Option option)
        {
            StringBuilder result = new StringBuilder();
 
            var abcLength = abc.Length;
            var lowerOriginalText = originalText.ToLower();
            var lowerSecretKey = secretKey.ToLower();
 
            var newSecretKey = GenerateSecretKeyRelativeToInputString(lowerOriginalText, lowerSecretKey, option);
 
            Console.WriteLine("New secret key: {0}", newSecretKey);
 
            for(var i = 0; i < lowerOriginalText.Length; i++)
            {
                if (lowerOriginalText[i] == ' ')
                {
                    result.Append(lowerOriginalText[i]);
                    continue;
                }
 
                var p = GetIndexRelativeToABC(lowerOriginalText[i]);
                var k = GetIndexRelativeToABC(newSecretKey[i]);
                var charIndex = (p + k) % abcLength;
                result.Append(GetCharFromABCByIndex(charIndex));
            }
 
            return result.ToString();
        }
 
        public string Decryption(string encryptingText, string secretKey, Option option)
        {
            StringBuilder result = new StringBuilder();
 
            var abcLength = abc.Length;
            var lowerEncryptingText = encryptingText.ToLower();
            var lowerSecretKey = secretKey.ToLower();
 
            var newSecretKey = GenerateSecretKeyRelativeToInputString(lowerEncryptingText, lowerSecretKey, option);
            for (var i = 0; i < lowerEncryptingText.Length; i++)
            {
                if (lowerEncryptingText[i] == ' ')
                {
                    result.Append(lowerEncryptingText[i]);
                    continue;
                }
 
                var c = GetIndexRelativeToABC(lowerEncryptingText[i]);
                var k = GetIndexRelativeToABC(newSecretKey[i]);
                var charIndex = (c - k + abcLength) % abcLength;
                result.Append(GetCharFromABCByIndex(charIndex));
            }
 
            return result.ToString();
        }
 
        private int GetIndexRelativeToABC(char inputChar)
        {
            return abc.IndexOf(inputChar);
        }
 
        private char GetCharFromABCByIndex(int index)
        {
            if (index >= abc.Length) throw new ArgumentOutOfRangeException("index");
            return abc[index];
        }
 
        private string GenerateSecretKeyRelativeToInputString(string inputString, string secretKey, Option option)
        {
            StringBuilder result = new StringBuilder();
 
            var inputStringWithOutSpace = inputString.Replace(" ", "");
 
            for (var i = 0; i < inputString.Length; i++)
            {
                switch(option)
                {
                    case Option.First:
                        var index = i >= secretKey.Length ? i % secretKey.Length : i;
                        result.Append(secretKey[index]);
                        break;
                    case Option.Second:
                        if (i >= secretKey.Length)
                        {
                            var idx = (i - secretKey.Length) % inputStringWithOutSpace.Length;
                            result.Append(inputStringWithOutSpace[idx]);
                        }
                        else
                        {
                            result.Append(secretKey[i]);
                        }
                        break;
                }
            }
            return result.ToString();
        }
    }
}
где-то создаём объект этого класса и запускаем:
C#
1
2
3
4
5
6
7
8
9
10
11
Vijener a = new Vijener();
 
var result = a.Encryption("ATTACK AT DAWN", "LEMON", Vijener.Option.First);
Console.WriteLine(result);
result = a.Decryption(result, "LEMON", Vijener.Option.First);
Console.WriteLine(result);
Console.WriteLine("");
result = a.Encryption("ATTACK AT DAWN", "LEMON", Vijener.Option.Second);
Console.WriteLine(result);
result = a.Decryption(result, "LEMON", Vijener.Option.Second);
Console.WriteLine(result);
Предусловие: для шифрования использовался пример из вики и латинский алфавит.

Так вот во второй способ шифрования использует часть исходного сообщения получается:

Исходный текст: ATTACKATDAWN
Ключ: LEMONATTACKA
Зашифрованный текст: LXFOPKTMDCGN

А дешифрование (как я понял) использует часть шифрованного сообщения, пытаемся расшифровать:

Исходный текст: LXFOPKTMDCGN
Ключ: LEMONLXFOPKT
Расшифрованный текст: ATTACZWHPNWU

Отсюда следует, чтобы дешифрование прошло успешно надо сохранять ключ шифрования (LEMONATTACKA), иначе ничего не получится.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
07.05.2014, 12:59
Помогаю со студенческими работами здесь

Квадрат Виженера
Есть код который заполняет из массива только строки столбцы static string alph = { &quot;A&quot;, &quot;B&quot;, &quot;C&quot;,...

Принцип шифрования Виженера
возникла вот такая не лепая ошибка в коде, не как не могу решить( Проэкт прикрепил! using System; using System.Collections.Generic; ...

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

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

Шифр Виженера, шифр Скитала
Я много прочитал информации и захотел реализовать эти шифры на Buider C++, а вот как это сделать. Кому интересно, напишите мне примеры этих...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru