0 / 0 / 0
Регистрация: 23.10.2016
Сообщений: 17
1

Шифр Виженера, добавить дешифрование

10.11.2016, 23:32. Показов 25842. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Шифр Виженера, С++, дешифрование

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

Помогите, пожалуйста

Вот код:

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
#include "stdafx.h"
#include <ctime>
#include <string>
#include <iostream>
#include <conio.h>
 
using namespace std;
 
int main()
{
    string B, C, D = "";
    string A = "abcdefghijklmnopqrstuvwxyz"; //наш алфавит
    setlocale(LC_ALL, "Rus");
    cout << "Введите слово: ";
    cin >> B;
    cout << "Введите ключ: ";
    cin >> C;
    int *F = new int[B.size()];
    int *G = new int[B.size()];
    int c = C.size(); //делаем замену переменных для удобства
    int b = B.size();
    //Первое условие. Если длина вводимого слова больше, либо равна длине ключа
    if (b >= c)
    {
        for (int i = 0; i < (b / c); i++)
        {
            D = D + C; //Записываем целое количество ключа. Растягивая ключ по длине слова.
        }
        for (int j = 0; j < (b%c); j++)
        {
            D = D + C[j];
        }
    }
    else  //Иначе если ключ длиннее слова, укорачиваем ключ до длины слова.
    {
        for (int s = 0; s < b; s++)
        {
            D = D + B[s];
        }
    }
//  cout << D << endl;
    for (int k = 0; k < b; k++)
    {
        for (int n = 0; n < 26; n++)
        {
            if (B[k] == A[n])
            {
                F[k] = n;
            }
 
            if (D[k] == A[n])
            {
                G[k] = n;
            } //Здесь мы уже начинаем шифровать. Смысл заключается втом, что мы ищем номер буквы во вводимом ключе и номере, а после чего записываем их в массив
 
        }
    }
 
    int e = 0; //Для суммы номеров символов. Чтобы при достижении 26 буквы, программа шла по кругу, начиная с первого номера
    for (int u = 0; u < b; u++)
    {
        e = ((F[u] + G[u]) % 26);
        B[u] = A[e];
    }
 
    cout << "Зашифрованное слово: " << B << endl;
 
    
    _getch();
    return 0;
 
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.11.2016, 23:32
Ответы с готовыми решениями:

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

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

Шифр Виженера
Надо написать программу на С++, расшифровывающую сообщение, зашифрованное шифром Виженера....

Шифр Виженера
У кого есть исходник на Си ?

3
385 / 279 / 478
Регистрация: 09.05.2014
Сообщений: 769
12.11.2016, 14:08 2
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
#include "stdafx.h"
#include <ctime>
#include <string>
#include <iostream>
#include <conio.h>
 
using namespace std;
 
int main()
{
    string B, C, D = "";
    string A = "abcdefghijklmnopqrstuvwxyz"; //наш алфавит
    setlocale(LC_ALL, "Rus");
    cout << "Введите слово: ";
    cin >> B;
    cout << "Введите ключ: ";
    cin >> C;
    int *F = new int[B.size()];
    int *G = new int[B.size()];
    int c = C.size(); //делаем замену переменных для удобства
    int b = B.size();
    //Первое условие. Если длина вводимого слова больше, либо равна длине ключа
    if (b >= c)
    {
        for (int i = 0; i < (b / c); i++)
        {
            D = D + C; //Записываем целое количество ключа. Растягивая ключ по длине слова.
        }
        for (int j = 0; j < (b%c); j++)
        {
            D = D + C[j];
        }
    }
    else  //Иначе если ключ длиннее слова, укорачиваем ключ до длины слова.
    {
        for (int s = 0; s < b; s++)
        {
            D = D + B[s];
        }
    }
//  cout << D << endl;
    for (int k = 0; k < b; k++)
    {
        for (int n = 0; n < 26; n++)
        {
            if (B[k] == A[n])
            {
                F[k] = n;
            }
 
            if (D[k] == A[n])
            {
                G[k] = n;
            } //Здесь мы уже начинаем шифровать. Смысл заключается втом, что мы ищем номер буквы во вводимом ключе и номере, а после чего записываем их в массив
 
        }
    }
 
    int e = 0; //Для суммы номеров символов. Чтобы при достижении 26 буквы, программа шла по кругу, начиная с первого номера
bool shifr;
cout<<"для шифрования введите 1, для расшифровки нажмите 0: ";
cin>>shifr;
if (shifr){
    for (int u = 0; u < b; u++)
    {
        e = ((F[u] + G[u]) % 26);
        B[u] = A[e];
    }
 }
else
    for (int u = 0; u < b; u++)
    {
        e = ((F[u] - G[u]));
        if (e<0)
            e+=26;
        B[u] = A[e];
    }
    cout << "Зашифрованное слово: " << B << endl;
 
    
    _getch();
    return 0;
 
}
"для удобства" гораздо лучше давать переменным осмысленные имена.
2
0 / 0 / 0
Регистрация: 23.10.2016
Сообщений: 17
13.11.2016, 20:13  [ТС] 3
Спасибо большое, выручили
0
0 / 0 / 0
Регистрация: 19.03.2023
Сообщений: 4
19.03.2023, 09:23 4
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
#include <iostream>
#include <time.h>
#include <stdlib.h>
using namespace std;
void we2(int arrmod[], char arr[], string arrposled[], const int size, string fraza) {
    for (int i = 0; i < fraza.length(); i++) {
        for (int j = 0; j < size; j++) {
            if (arrmod[i] == j) {
                arrposled[i] = arr[j];
                cout << arrposled[i] << " ";
 
            }
        }
    }
}
void we4(int arrmodn[], char arr[], string fraza, const int size, string arrposled2[]) {
    for (int i = 0; i < fraza.length(); i++) {
        for (int j = 0; j < size; j++) {
            if (arrmodn[i] == j) {
                arrposled2[i] = arr[j];
                cout << arrposled2[i] << "";
 
            }
        }
    }
}
 
 
 
 
void we3(int arrmod[], int arrkey[], int arrmodn[], string fraza) {
    for (int i = 0; i < fraza.length(); i++) {
        arrmodn[i] = ((arrmod[i] - arrkey[i]) + 26 )%26;
        cout << arrmodn[i]<<" ";
 
 
 
    }
 
 
 
}
 
void we(int arrfraza[], int arrkey[], int arrmod[], string fraza) {
    for (int i = 0; i < fraza.length(); i++) {
        arrmod[i] = (arrfraza[i] + arrkey[i]) % 26;
        cout << arrmod[i] << " ";
 
    }
 
 
 
}
 
int main() {
    const int size = 26;
    char arr[size]{ 'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z' };
    int arrmod[size];
    string arrposled[size];
    string arrposled2[size];
    string fraza;
    string arrf[size];
    string key;
    int arrmodn[size];
    int c = 0;
    int arrkey[size];
    int arrfraza[size];
    cout << "введите фразу" << " ";
    cin >> fraza;
    cout << "введите ключ" << " ";
    cin >> key;
    for (int i = 0; i < fraza.length(); i++) {
        for (int j = 0; j < size; j++) {
            if (fraza[i] == arr[j]) {
                arrfraza[i] = j;
                cout << arrfraza[i] << " ";
 
            }
        }
    }
    cout << endl;
    for (int i = 0; i < fraza.length(); i++) {
        for (int j = 0; j < size; j++) {
            if (key[i] == arr[j]) {
                arrkey[c] = j;
                cout << arrkey[c] << " ";
            }
 
        }
        if (c == fraza.length() - 1) {
            break;
 
 
        }
        if (key.length() - 1 == i)
        {
            i = -1;
        }
        c = c + 1;
    }
    cout << endl;
 
    we(arrfraza, arrkey, arrmod, fraza);
    cout << endl;
    we2(arrmod, arr, arrposled, size, fraza);
    cout << endl;
    we3(arrmod, arrkey, arrmodn, fraza);
    cout << endl;
    we4(arrmodn, arr, fraza, size, arrposled2);
}
0
19.03.2023, 09:23
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.03.2023, 09:23
Помогаю со студенческими работами здесь

Шифр Виженера
Был бы до жути благодарен с помощью шифра Виженера... С этими шифрами вообще что-то не ладится......

Шифр Виженера
Есть вот такой код (его кусок): string symbols =...

Шифр Виженера на C++
Помогите пожалуйста с заданием. От вас зависит стипендия в течении семестра. Рабочее задание:...

Шифр Виженера
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;string&gt; #include &lt;conio.h&gt; #include...


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

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

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