25 / 25 / 10
Регистрация: 27.11.2011
Сообщений: 272
1

Шифрование текста методом замены

24.09.2014, 19:40. Показов 5184. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрых времени суток. Делаю шифрование текста который вводится в текст бокс. Если убрать цикл форич, тогда будет шифровать только 1 слово - все норм. Если хочу сделать что бы можно было вводить предложение, начинает каряво работать:
Шифрование текста методом замены
.
Собсвенно код:
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
string words = "абвгґдеєжзиіїйклмнопрстуфхцчшщьюя";
        string[] NewWords = new string[100];
        public void Sub(TextBox t1, TextBox t2)
        {
            string[] mass = t1.Text.Split(' ');
            char[] charWords = words.ToCharArray();
            foreach (string s in mass)
            {
                for (int i = 0; i < s.Length; i++)
                    for (int j = 0; j < words.Length; j++)
                    {
                        if (s.ElementAt(i) == charWords[j])
                        {
                            NewWords[i] = charWords[(j + i) % words.Length].ToString();
                        }
                    }
                foreach (string r in NewWords)
                {
                    t2.Text += r;
                }
                t2.Text += " ";
            }
        }
 
        public void SubRe(TextBox t2, TextBox t3)
        {
            string[] mass = t2.Text.Split(' ');
            char[] charWords = words.ToCharArray();
            foreach (string s in mass)
            {
                for (int i = 0; i < s.Length; i++)
                    for (int j = 0; j < words.Length; j++)
                    {
                        if (s.ElementAt(i) == charWords[j])
                        {
                            NewWords[i] = charWords[(j - i) % words.Length].ToString();
                        }
                    }
                foreach (string r in NewWords)
                {
                    t3.Text += r;
                }
                t3.Text += " ";
            }
        }
В чем ошибка?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.09.2014, 19:40
Ответы с готовыми решениями:

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

Шифрование текста
Произвожу сложение по модулю два 8-битных чисел и символов текста (текст может состоять из русских,...

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

Шифрование текста
Помогите пожалуста сделать еще одно шифрование(например текст перевернуть Текст-Тскет) что-то...

7
3457 / 2469 / 695
Регистрация: 02.08.2011
Сообщений: 6,690
24.09.2014, 20:10 2
мат.модель шифра Цезаря: (из вики)
Изображения
 
0
3457 / 2469 / 695
Регистрация: 02.08.2011
Сообщений: 6,690
24.09.2014, 20:12 3
где x — символ открытого текста, y — символ шифрованного текста, n — мощность алфавита, а k — ключ.
Изображения
 
0
3457 / 2469 / 695
Регистрация: 02.08.2011
Сообщений: 6,690
24.09.2014, 20:23 4
У вас же ключ для одной и той же буквы, которая будет находится в разных частях слова, будет разным, то есть разными шифралфавитами, а шифр Цезаря и его общий вид - одноалфавитный шифр замены.
k - должна быть константа, а у вас это i - может менять свое значение.

Добавлено через 5 минут
И лучше бы в функции передавать не текстбоксы, а строки (соответственно для методов открытый и зашифрованный тексты) и вторым параметром значение ключа.
0
25 / 25 / 10
Регистрация: 27.11.2011
Сообщений: 272
24.09.2014, 21:18  [ТС] 5
Сделал как вы и сказали, получил точно такой же результат.
C#
1
2
NewWords[i] = charWords[(j + 13) % words.Length].ToString();
NewWords[i] = charWords[(j - 13 + words.Length) % words.Length].ToString();
Добавлено через 33 минуты
Если сделать так:
C#
1
2
3
4
public void SubRe(TextBox t2, TextBox t3)
        {
            string[] mass = t2.Text.Split(' ');
            MessageBox.Show(mass.Count().ToString());
И ввести одно слово, то в ответ получаю что
C#
1
mass.Count() = 2
Хотя должно равняться 1, думаю в єтом вся причина. Но вот почему там 2 элемента я не могу понять.
0
3457 / 2469 / 695
Регистрация: 02.08.2011
Сообщений: 6,690
24.09.2014, 22:26 6
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
 public partial class Form1 : Form
    {
        private const string opentextalphabet = "абвгдежзиклмнопрстуфхцчшщъэьэюя";
        
        public Form1()
        {
            InitializeComponent();
            numericUpDown1.Value = 5;
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            if (String.IsNullOrEmpty(richTextBox1.Text))
                return;
 
            var key = (int) numericUpDown1.Value;
            richTextBox2.Text = EncryptText(richTextBox1.Text, key);
        }
 
        private void button2_Click(object sender, EventArgs e)
        {
            if (String.IsNullOrEmpty(richTextBox2.Text))
                return;
            var key = (int) numericUpDown1.Value;
            richTextBox3.Text = DecryptText(richTextBox2.Text, key);
        }
 
 
        private string EncryptText(string plaintext, int key)
        {
            if (plaintext == null) throw new ArgumentNullException("plaintext");
            if (key%opentextalphabet.Length == 0)
                return plaintext;
            if (key < 0)
                key = Math.Abs(key);
 
            int alphLength = opentextalphabet.Length;
 
            string[] words = plaintext.Trim().Split(new[] {' ', '\n'}, StringSplitOptions.RemoveEmptyEntries);
            string res = string.Empty;
 
            foreach (string word in words)
            {
                res += word;
            }
            char[] result = res.ToCharArray();
            for (int i = 0; i < res.Length; i++)
                for (int j = 0; j < opentextalphabet.Length; j++)
                {
                    if (result[i] == opentextalphabet[j])
                    {
                        result[i] = opentextalphabet[(j + key) % alphLength];
                        break;
                    }
                }
            return new string(result);
        }
 
 
        private string DecryptText(string encryptedtext, int key)
        {
            if (encryptedtext == null) throw new ArgumentNullException("encryptedtext");
            if (key%opentextalphabet.Length == 0)
                return encryptedtext;
            if (key < 0)
                key = Math.Abs(key);
 
            int alphLength = opentextalphabet.Length;
            var result = encryptedtext.ToCharArray();
 
            for (int i = 0; i < result.Length; i++)
                for (int j = 0; j < opentextalphabet.Length; j++)
                {
                    if (result[i] == opentextalphabet[j])
                    {
                        result[i] = opentextalphabet[(j - key + alphLength) % alphLength];
                        break;
                    }
                }
             
            return new string(result);
        }
    }
На форме должно быть три richtextbox-а, две кнопки и numericUpDown - все с именованием по умолчанию.
Немного не доработано: не могу понять, если например при key = 5 при дешифровке ш расшифровывается на ц.
Остальные буквы нормально. Видимо, какие-то пограничные значения индекса.

Добавлено через 4 минуты
Обычно весь текст для шифрования объединяют в единую строку - так и сделал.
0
25 / 25 / 10
Регистрация: 27.11.2011
Сообщений: 272
24.09.2014, 23:27  [ТС] 7
Цитата Сообщение от IamRain Посмотреть сообщение
Обычно весь текст для шифрования объединяют в единую строку - так и сделал.
Передо мною стоит задача зашифровать исходный текст включая пробелы, и дешифровать так же включая проблемы, эту задачу я как раз и не могу решить(
0
3457 / 2469 / 695
Регистрация: 02.08.2011
Сообщений: 6,690
24.09.2014, 23:37 8
Тогда в обработчике кнопок:
C#
1
2
3
4
5
6
7
 var strings = richTextBox1.Text.Split(new[]{' ','\n','\r'},StringSplitOptions.RemoveEmptySpaces);
 var results = new string[strings.Length];
int i=0;
   foreach(var item in strings)
{
    results[i++] = EncrypText(item,key);
}
И еще нужно в методах перед проверкой на отрицательность:
C#
1
key = key % opentextAlphabet.Length;
Либо ограничить поле ввода длиной алфавита -1.

Добавлено через 1 минуту
Просто модифицируйте методы, чтобы работали как с одной целой строкой.
PS: пробела нет в алфавите.
0
24.09.2014, 23:37
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.09.2014, 23:37
Помогаю со студенческими работами здесь

Шифрование методом гаммирования (XOR)
Добрый вечер. Нужна помощь с правильным выводом результат кода при шифровании. В общем, ввожу...

Интерфейс поиска и замены текста в richTextBox
Добрый день! Преподаватель дал задание с помощью текстбокса сделать аналог блокнота с...

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

Шифрование текста в файле
Шифрование текста в файле методом Цезаря не происходит в чем ошибка ? using System; using...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru