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

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

06.05.2014, 14:16. Показов 27842. Ответов 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
Ответ Создать тему
Новые блоги и статьи
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Old Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru