Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 35, средняя оценка - 4.94
Streecs
1 / 1 / 0
Регистрация: 03.07.2013
Сообщений: 31
#1

Проблемы с Аффинным шифром - C++

07.10.2013, 15:42. Просмотров 5046. Ответов 17
Метки нет (Все метки)

Всем привет! У меня возникли проблемы при реализации программы, которая должна брать исходный текстовый файл и шифровать/дешифровать его Аффинным шифром. Главные проблемы: 1) программа шифрует(не уверен что правильно), но не может дешифровать(скорее всего проблема в моей формуле дешифровки-плохо разбираюсь с модулями) 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
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
#include <stdio.h>
#include <stdlib.h>
 
// Вычисление размера файла
int get_file_size(FILE *fp)
{
    int rv;
    fseek(fp,0,SEEK_END);
    rv=ftell(fp);
    fseek(fp,0,SEEK_SET);
    return rv;
}
// Функция шифрования
int encripting(char *text,int key_a,int key_b,int x)
{
    int ok=0,y=0;
    for (y;y<x;y++)
    {
        text[y]=((key_a*text[y])+key_b)%256;
    }
    // Создаём новый файл и записываем полученое
    FILE *fp=fopen("new_text.txt","w");
    for (y=0;y<x;y++)
    {
        fputc(text[y],fp);
    }
    fclose(fp);
    ok=1;
    return ok;
}
// Функция дешифрования
int decripting(char *text,int key_a,int key_b,int x)
{
    int ok=0,y=0;
    int a=(key_a*256)+1;
    for (y=0;y<x;y++)
    {
        text[y]=a*(text[y]-key_b)%256;
    }
    // Создаём новый файл и записываем полученое
    FILE *fp=fopen("new_text.txt","w");
    for (int y=0;y<x;y++)
    {
        fputc(text[y],fp);
    }
    fclose(fp);
    ok=1;
    return ok;
}
// Проверка взаимно простых чисел
int pr(int a, int b)
{
    int c=0,d=0,buf=0;
    if(b>a)
    {
        buf=a;
        a=b;
        b=buf;
    }
    c=a%b;
    if(c!=1 && c!=0)
    {
        c=pr(a,c);      
    }
    if(c==1)
    {
        d=1;
        return d;
    }
    if(c==0)
    {
        d=0;
        return d;
    }       
}
void main()
{
    char namef[256], choise[1];
    int size=0,ok=0,x=0,key_a=0,key_b=0,m=256;
    char c;
    //Берём файл
    printf ("Give me your file: ");
    gets (namef);
    FILE *file_in = fopen(namef,"rb");
    if (file_in == NULL)
    {
        printf("Error!!!\n");
        exit(1);
    }
    // Спрашиваем что делать.
    printf("\n For encripting enter e, for decripting d: ");
    scanf("%c", & choise[0]);
    if(choise[0]!='e' && choise[0]!='d')
    {
        while (choise[0]!='e' && choise[0]!='d')
        {
            printf("\n There is only 2 choices - e or d! \n For encripting enter e, for decripting d: ");
            scanf("%c", & choise[0]);
        }
    }
    // Узнаём размер файла для создания массива в памяти для него
    size=get_file_size(file_in);
    // Создаём новый массив
    char *mass = new char[size];
    // Переписываем из файла в массив
    for(x,c;(c=fgetc(file_in))!=EOF;x++)
    {
        mass[x]=c;
    }
    fclose (file_in);
    // Спрашиваем ключи
    printf ("\nEnter first key. Note, it must be relatively 256: ");
    scanf ("%d", &key_a);
    if (pr(key_a,m)!=1)
    {
        while(pr(key_a,m)!=1)
        {
            printf ("\nTry enter anothe key. Note, it must be relatively 256: ");
            scanf ("%d", &key_a);
        }
    }
    printf ("\nEnter second key: ");
    scanf ("%d", &key_b);
    // Выполняем задачу
    if (choise[0]=='e')
        int ok = encripting(mass,key_a,key_b,x);
    else
        int ok = decripting(mass,key_a,key_b,x);
    // Заключение
    if (ok=1)   
    printf ("\nYour new file in the solution directory. Enjoy!\n");
    else
    printf ("\nFail, sorry :(");
}
Добавлено через 21 час 24 минуты
Перепроверил уравнения шифрования и дешифрования. Они работают правильно. Косяк в нахождении обратного числа. Если кто может объяснить как его правильно высчитывать буду очень признателен.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.10.2013, 15:42
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Проблемы с Аффинным шифром (C++):

Помогите с Шифром Цезаря - C++
Вообщем народ! Необходимо чтоб на вход поступала зашифрованная строка на латинице и далее выдавались все варианты перебора... Не могу...

Шифрование файлов шифром Вернама - C++
Всем здравствуйте.Нужно написать программу для шифрования файлов шифром Вернама.В качестве ключа программа должна хавать строку,сама...

Программа для шифрования английского текста шифром ROT13 - C++
Доброго времени суток, формучане! Очень нужна ваша помощь, не могу понять, как написать программу для шифрования текста шифром ROT13. В С++...

Сведения о книгах в библиотеке, получить информацию о книге с заданным шифром - C++
(На С++) Сведения о книгах в библиотеке. Структура записи: шифр книги, автор, название, год издания, местоположение (номер стеллажа,...

Пользуясь шифром Полибия зашифровать, а потом расшифровать текст введённый пользователем - C++
Смысл задания в том, чтобы пользуясь шифром Полибия зашифровать, а потом расшифровать текст введённый пользователем. Вот написал цикл, а...

Шифрования моноалфавитным шифром - C#
Всем привет! Помогите ,пожалуйста ( Нужно написать код в программе C#. Кодовым словом будет &quot;ШИФР&quot;. Оно определяет четыре алфавита...

17
Streecs
1 / 1 / 0
Регистрация: 03.07.2013
Сообщений: 31
10.10.2013, 22:33  [ТС] #16
Цитата Сообщение от AnyOne697 Посмотреть сообщение
Алфавит должен быть мощностью равной простому числу.
По моему это не обязательно. Главное чтоб число символов в нем(алфавите) было взаимно простым с ключом.
0
AnyOne697
134 / 106 / 5
Регистрация: 22.05.2010
Сообщений: 533
10.10.2013, 22:34 #17
Цитата Сообщение от Streecs Посмотреть сообщение
Подскажите в чём косяки - буду исправлять.
Начинайте исправлять.
А также прочтите искусства Кнута и алгоритмы Кормена (оба гугляться).

Добавлено через 43 секунды
Цитата Сообщение от Streecs Посмотреть сообщение
По моему это не обязательно. Главное чтоб число символов в нем(алфавите) было взаимно простым с ключом.
Возмоно я не прав. Я же сказал, что я особо не разбирался. Лень.
0
Streecs
1 / 1 / 0
Регистрация: 03.07.2013
Сообщений: 31
10.10.2013, 22:36  [ТС] #18
Цитата Сообщение от AnyOne697 Посмотреть сообщение
Начинайте исправлять.
Название статьи заманчивое. Обязательно почитаю.
0
10.10.2013, 22:36
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.10.2013, 22:36
Привет! Вот еще темы с ответами:

Шифрования перестановочным шифром - C#
Всем привет! :) Помогите ,пожалуйста ( Нужно написать код в программе C#. Задание: Разработать алгоритм для шифрования...

Шифрование и дешифрование шифром Петра 1 - C#
Требуется шифровать и дешифровать шифром Петра 1 текст. Шифр Петра 1 - это простая подстановка (смотрите во вложении) Зашифровать у меня...

Расшифровать шифром простой замены - Криптография
Доброе время суток всем! Помогите расшифровать текст вместо одной буквы ставится другая буква или символ. Точки, запятые и другие знаки...

Закодировать текст шифром Цезаря - C (СИ)
Нужна программа, которая будет считывать текстовое сообщение из файла и зашифровывать его при помощи шифра Цезаря(например есть ключ 123. и...


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

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

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