Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# Windows Forms
Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.75
elninho
2 / 2 / 3
Регистрация: 20.04.2014
Сообщений: 30
#1

Шифрование и расшифровка данных (логина и пароля) - C#

14.08.2014, 12:35. Просмотров 2207. Ответов 5
Метки нет (Все метки)

Здравствуйте.
Суть вопроса: есть форма. на нее вводим пароль и логин. Пароль хэшируется по алгоритму MD2, затем полученный хэш мы используем для шифрования логина (обратная связь по шифротексту, сеть Фейстеля). Полученный после шифрования результат необходимо расшифровать и вывести обратно на форму. Код написал, но в расшифровке где-то сидит ошибка, и как реализовать расшифровку я не особо понимаю, хоть на бумаге алгоритм и понятен.

Заранее спасибо за помощь.

Код привожу ниже:
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
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
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 WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            string password = "";
            int num = 0;
            int c = 0; //временные переменные с, l, t
            int l = 0;
            int t = 0;
            int[] S = new int[256]; //рандомный массив на 256 символов
            int[] C = new int[16]; //контрольная сумма
            int[] X = new int[48]; //48-битовый буфер
            int Nblock = 0; //кол-во 16-значных блоков
            password = textBox1.Text;
            
 
            num = 16 - (password.Length % 16); //дополняем пароль до кратного 16 кол-ва символов
            for (int i = 0; i < num; i++)
            {
                password = password + num;
            }
            Nblock = password.Length / 16;
            
            
            Random rand = new Random(); //заполняем массивы S и C значениями
            for (int i = 0; i < S.Length; i++)
                S[i] = rand.Next(255);
            for (int i = 0; i < C.Length; i++)
                C[i] = 0;
            for (int i = 0; i < Nblock; i++) //вычисляем контрольную сумму
            {
                for (int j = 0; j < C.Length; j++)
                {
                    c = Convert.ToInt32(password[i * 16 + j]);
                    int b;
                    b = c ^ l;
                    C[j] = C[j] ^ S[b];
                    l = C[j];
                }
            }
            for (int i = 0; i < C.Length; i++) //и прибавляем ее к паролю
                password += C[i];
 
 
            for (int i = 0; i < X.Length; i++) //обработка 48-битного буфера
                X[i] = 0;
            Nblock = password.Length / 16;
            for (int i = 0; i < Nblock; i++)
            {
                for (int j = 0; j < 16; j++)
                {
                    X[16 + j] = password[i * 16 + j];
                    X[32 + j] = Convert.ToInt32(X[16 + j]) ^ Convert.ToInt32(X[j]);
                }
                for (int j = 0; j < 18; j++)
                {
                    for (int a = 0; a < X.Length; a++)
                    {
                        X[a] = X[a] ^ S[t];
                        t = X[a];
                    }
                    t = (t + j) % 256;
                }
            }
            password = "";
            for (int i = 0; i < 16; i++) //получаем готовый хэш (хэш для дальнейшей работы брать из Х)
                password += X[i].ToString();
            textBox2.Text = password;
 
 
            int v = 0;        //две переменные для задания
            string vekt = ""; //вектора инициализации
            int temp = 0; //временная переменная
            string L = ""; //левый подблок
            string R = ""; //правый подблок
            int[] key=new int[16]; //ключ
            string shifr = ""; //результат функции блочного шифрования
            string login = ""; //открытый текст
            string itog = ""; //искомый результат - зашифрованный открытый текст
            string stroka = "";
            string text = "";
            Random r = new Random();  //рандомно задаем вектор инициализации и приводим его к 4-х значному виду.
            v = r.Next()%10000;
            vekt = v.ToString();
            if (vekt.Length != 4)
                for (int i = 0; i < 4; i++)
                    if (i > vekt.Length)
                        vekt += '0';
            for (int i = 0; i < vekt.Length; i++) //задаем левый и правый блоки
            {
                if (i < vekt.Length / 2)
                    L += vekt[i];
                else
                    R += vekt[i];
            }
            for (int i = 0; i < 16; i++) //задаем ключ
                key[i] = X[i];
            login = textBox3.Text;
            int[] kod = new int[login.Length]; //здесь хранится зашифрованный логин
            for (int j = 0; j < login.Length; j++) //обратная связь по шифротексту
            {
                for (int i = 0; i < 16; i++) //функция блочного шифрования (сеть Фейстеля)
                {
                    temp = Convert.ToInt32(R) ^ (Convert.ToInt32(L) ^ key[i]);
                    R = L;
                    L = temp.ToString();
                }
                shifr = L + R; //результат функции блочного шифрования
                kod[j] = Convert.ToInt32(login[j]) ^ Convert.ToInt32(shifr); //результат шифрования
            }
            for (int i = 0; i < login.Length; i++)
                itog += kod[i].ToString();
            textBox4.Text = itog;
 
 
            //расшифровка
            int kod1 = 0;
            for (int j = itog.Length - 1; j >= 0; j--)
            {
                for (int i = key.Length - 1; i >= 0; i--)
                {
                    temp = Convert.ToInt32(L) ^ (Convert.ToInt32(R) ^ key[i]);
                    L = R;
                    R = temp.ToString();
                }
                shifr = L + R;
                kod1 = kod[j] ^ Convert.ToInt32(shifr);
                stroka += kod.ToString();
            }
            for (int i = stroka.Length - 1; i >= 0; i--)
                text += stroka[i];
            textBox5.Text = text;
        }
    }
}

http://www.cyberforum.ru/windows-forms/thread622463.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.08.2014, 12:35
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Шифрование и расшифровка данных (логина и пароля) (C#):

Проверка логина и пароля
Вот код: using System; using System.Collections.Generic; using...

Запрос логина/пароля
Все доброго времени суток. Я начинающий программист. И данную задачу я придумал...

Проверка логина и пароля.
Вопрос такой: Я сделал форму проверку пароля и есть у меня кнопка Clir,так вот...

Синхронизация логина и пароля с сайтом
Всем привет. Вот на форме есть Textbox'ы Логин и пароль. Некто вводит их, и...

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

5
temonig
0 / 0 / 1
Регистрация: 16.02.2014
Сообщений: 45
14.08.2014, 21:45 #2
А где собственно ошибка? Не сходится результат?

А вообще рекомендую md5 или System...Cryptography
0
elninho
2 / 2 / 3
Регистрация: 20.04.2014
Сообщений: 30
14.08.2014, 21:55  [ТС] #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
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
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
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 WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            string password = "";
            int num = 0;
            int c = 0; //временные переменные с, l, t
            int l = 0;
            int t = 0;
            int[] S = new int[256]; //рандомный массив на 256 символов
            int[] C = new int[16]; //контрольная сумма
            int[] X = new int[48]; //48-битовый буфер
            int Nblock = 0; //кол-во 16-значных блоков
            password = textBox1.Text;
            
 
            num = 16 - (password.Length % 16); //дополняем пароль до кратного 16 кол-ва символов
            for (int i = 0; i < num; i++)
            {
                password = password + num;
            }
            Nblock = password.Length / 16;
            
            
            Random rand = new Random(); //заполняем массивы S и C значениями
            for (int i = 0; i < S.Length; i++)
                S[i] = rand.Next(255);
            for (int i = 0; i < C.Length; i++)
                C[i] = 0;
            for (int i = 0; i < Nblock; i++) //вычисляем контрольную сумму
            {
                for (int j = 0; j < C.Length; j++)
                {
                    c = Convert.ToInt32(password[i * 16 + j]);
                    int b;
                    b = c ^ l;
                    C[j] = C[j] ^ S[b];
                    l = C[j];
                }
            }
            for (int i = 0; i < C.Length; i++) //и прибавляем ее к паролю
                password += C[i];
 
 
            for (int i = 0; i < X.Length; i++) //обработка 48-битного буфера
                X[i] = 0;
            Nblock = password.Length / 16;
            for (int i = 0; i < Nblock; i++)
            {
                for (int j = 0; j < 16; j++)
                {
                    X[16 + j] = password[i * 16 + j];
                    X[32 + j] = Convert.ToInt32(X[16 + j]) ^ Convert.ToInt32(X[j]);
                }
                for (int j = 0; j < 18; j++)
                {
                    for (int a = 0; a < X.Length; a++)
                    {
                        X[a] = X[a] ^ S[t];
                        t = X[a];
                    }
                    t = (t + j) % 256;
                }
            }
            password = "";
            for (int i = 0; i < 16; i++) //получаем готовый хэш (хэш для дальнейшей работы брать из Х)
                password += X[i].ToString();
            textBox2.Text = password;
 
 
            int v = 0;        //две переменные для задания
            string vekt = ""; //вектора инициализации
            int temp = 0; //временная переменная
            string L = ""; //левый подблок
            string R = ""; //правый подблок
            int[] key=new int[16]; //ключ
            string shifr = ""; //результат функции блочного шифрования
            string login = ""; //открытый текст
            string itog = ""; //искомый результат - зашифрованный открытый текст
            string stroka = "";
            string text = "";
            Random r = new Random();  //рандомно задаем вектор инициализации и приводим его к 4-х значному виду.
            v = r.Next()%10000;
            vekt = v.ToString();
            if (vekt.Length != 4)
                for (int i = 0; i < 4; i++)
                    if (i > vekt.Length)
                        vekt += '0';
            for (int i = 0; i < vekt.Length; i++) //задаем левый и правый блоки
            {
                if (i < vekt.Length / 2)
                    L += vekt[i];
                else
                    R += vekt[i];
            }
            for (int i = 0; i < 16; i++) //задаем ключ
                key[i] = X[i];
            login = textBox3.Text;
            int[] kod = new int[login.Length]; //здесь хранится зашифрованный логин
            for (int j = 0; j < login.Length; j++) //обратная связь по шифротексту
            {
                for (int i = 0; i < 16; i++) //функция блочного шифрования (сеть Фейстеля)
                {
                    temp = Convert.ToInt32(R) ^ (Convert.ToInt32(L) ^ key[i]);
                    R = L;
                    L = temp.ToString();
                }
                shifr = L + R; //результат функции блочного шифрования
                kod[j] = Convert.ToInt32(login[j]) ^ Convert.ToInt32(shifr); //результат шифрования
            }
            for (int i = 0; i < login.Length; i++)
                itog += kod[i].ToString();
            textBox4.Text = itog;
 
 
            //расшифровка
            int kod1 = 0;
            for (int j = kod.Length - 1; j >= 0; j--)
            {
                for (int i = key.Length - 1; i >= 0; i--)
                {
                    temp = Convert.ToInt32(L) ^ (Convert.ToInt32(R) ^ key[i]);
                    L = R;
                    R = temp.ToString();
                }
                shifr = L + R;
                kod1 = kod[j] ^ Convert.ToInt32(shifr);
                stroka += kod.ToString();
            }
            for (int i = stroka.Length - 1; i >= 0; i--)
                text += stroka[i];
            textBox5.Text = text;
        }
    }
}
0
elninho
2 / 2 / 3
Регистрация: 20.04.2014
Сообщений: 30
22.08.2014, 09:16  [ТС] #4
Ошибку нашел, алгоритм наладил. Если нужно, могу выложить готовый код.
0
naJlaguH
17 / 17 / 4
Регистрация: 19.06.2014
Сообщений: 85
24.08.2014, 06:28 #5
нужно, интересно было бы посмотреть
0
elninho
2 / 2 / 3
Регистрация: 20.04.2014
Сообщений: 30
24.08.2014, 12:11  [ТС] #6
Цитата Сообщение от naJlaguH Посмотреть сообщение
нужно, интересно было бы посмотреть
может, конечно, что-то реализовал и не правильно, на все 100 не уверен, но работает нормально)
небольшое примечание: в textBox1 вводится хэшируемый пароль, результат хэширования отображается в textBox2, в textBox3 пользователь вводит шифруемый логин, а в textBox4 и textBox5 выводятся зашифрованный и расшифрованный логин соответственно.

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
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
using System;
using System.IO;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
 
namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            string password = "";
            int num = 0;
            int c = 0; //временные переменные с, l, t
            int l = 0;
            int t = 0;
            int[] S = new int[256]; //рандомный массив на 256 символов
            int[] C = new int[16]; //контрольная сумма
            int[] X = new int[48]; //48-битовый буфер
            int Nblock = 0; //кол-во 16-значных блоков
 
            //переменные для шифрования и расшифровки
            int v = 0;        //две переменные для задания
            string vekt = ""; //вектора инициализации
            int temp = 0; //временная переменная
            string L = ""; //левый подблок
            string R = ""; //правый подблок
            int[] key = new int[16]; //ключ
            string shifr = ""; //результат функции блочного шифрования
            string login = ""; //открытый текст
            string itog = ""; //искомый результат - зашифрованный открытый текст
            string stroka = "";
            string text = "";
            password = textBox1.Text;
            
 
            num = 16 - (password.Length % 16); //дополняем пароль до кратного 16 кол-ва символов
            for (int i = 0; i < num; i++)
            {
                password = password + num;
            }
            Nblock = password.Length / 16;
 
            
 
            Random rand = new Random();//рандомим S
            for (int i = 0; i < S.Length; i++)
                S[i] = rand.Next(255);
            for (int i = 0; i < C.Length; i++) //заполняем С
                C[i] = 0;
            for (int i = 0; i < Nblock; i++) //вычисляем контрольную сумму
            {
                for (int j = 0; j < C.Length; j++)
                {
                    c = Convert.ToInt32(password[i * 16 + j]);
                    int b;
                    b = c ^ l;
                    C[j] = C[j] ^ S[b];
                    l = C[j];
                }
            }
            for (int i = 0; i < C.Length; i++) //и прибавляем ее к паролю
                password += C[i];
 
 
            for (int i = 0; i < X.Length; i++) //обработка 48-битного буфера
                X[i] = 0;
            Nblock = password.Length / 16;
            for (int i = 0; i < Nblock; i++)
            {
                for (int j = 0; j < 16; j++)
                {
                    X[16 + j] = password[i * 16 + j];
                    X[32 + j] = Convert.ToInt32(X[16 + j]) ^ Convert.ToInt32(X[j]);
                }
                for (int j = 0; j < 18; j++)
                {
                    for (int a = 0; a < X.Length; a++)
                    {
                        X[a] = X[a] ^ S[t];
                        t = X[a];
                    }
                    t = (t + j) % 256;
                }
            }
            password = "";
            for (int i = 0; i < 16; i++) //получаем готовый хэш (хэш для дальнейшей работы брать из Х)
                password += X[i].ToString();
            textBox2.Text = password;
 
 
 
            Random r = new Random();//рандомно задаем вектор инициализации и приводим его к 2-х значному виду
            v = r.Next(0, 99);
            vekt = v.ToString();
            if (vekt.Length != 2)
                for (int i = 0; i < 2; i++)
                    if (i > vekt.Length)
                        vekt += '0';
            for (int i = 0; i < vekt.Length; i++) //задаем левый и правый блоки
            {
                if (i < vekt.Length / 2)
                    L = vekt[i].ToString();
                else
                    R = vekt[i].ToString();
            }
            for (int i = 0; i < 16; i++) //задаем ключ
                key[i] = X[i];
            login = textBox3.Text;
            byte[] log = Encoding.Default.GetBytes(login); //здесь хранится ascii-код символов логина.
            int[] kod = new int[login.Length]; //здесь хранится зашифрованный логин
            for (int i = 0; i < 16; i++) //функция блочного шифрования (сеть Фейстеля)
            {
                temp = Convert.ToInt32(R) ^ (Convert.ToInt32(L) ^ key[i]);
                R = L;
                L = temp.ToString();
            }
            shifr = L + R; //результат функции блочного шифрования
            for (int j = 0; j < login.Length; j++) //обратная связь по шифротексту
            {
                kod[j] = Convert.ToInt32(log[j]) ^ Convert.ToInt32(shifr); //результат шифрования
            }
            for (int i = 0; i < login.Length; i++)
                itog += kod[i].ToString();
            textBox4.Text = itog;
 
 
 
            //расшифровка
            int kod1 = 0;
            for (int j = kod.Length - 1; j >= 0; j--)
            {
                kod1 = kod[j] ^ Convert.ToInt32(shifr);
                stroka += Convert.ToChar(kod1);
            }
            for (int i = stroka.Length - 1; i >= 0; i--)
                text += stroka[i];
            textBox5.Text = text;
        }
    }
}
1
24.08.2014, 12:11
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.08.2014, 12:11
Привет! Вот еще темы с решениями:

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

Вызвать стандартный диалог ввода логина/пароля
Здравствуйте, подскажите как вызвать диалог &quot;Безопасность Windows&quot; и после...

Как связать формы для ввода логина и пароля с кнопкой войти
Итак, друзья, есть у меня два text.Box (login:password), как это все связать с...

Ввод логина и пароля
private void button5_Click(object sender, EventArgs e) { ...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru