Форум программистов, компьютерный форум CyberForum.ru

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Построить контуры своей области и заполнить её заданными наклонными линиями http://www.cyberforum.ru/cpp-beginners/thread970390.html
Задание: 1. Построить контуры своей области и заполнить её заданными наклонными линиями.. 2. В своей области построить из отрезков прямых линий контуры заданного объекта. 1 и 2 задание выполнить в двух вариантах: с использованием стандартной функцию line BorlandC и собственной функции, написанной по алгоритму Брезенхейма. 1)Из нижнего левого угла сначала вправо, потом налево. 2)Из нижнего...
C++ Работа с изображениями в GIT Более подходящего раздела для этой темы на форуме не нашел, поэтому пишу здесь. Сегодня зарегистрировался на github и встал такой вопрос. Git хранит не сами файлы, а их изменения. Так вот, если загрузить изображение, то получается, если есть много версий этого изображения, то гит хранит каждую версию? Он ведь не может запоминать изменения для изображений, как для текста, где он просто... http://www.cyberforum.ru/cpp-beginners/thread970389.html
Последовательно заполнить заданную прямоугольную область экрана точками по заданному алгоритму C++
Задание: 1. Последовательно заполнить заданную прямоугольную область экрана точками по заданному алгоритму (схема заполнения области). Для вывода точки в каждом режиме использовать: - А) стандартную функцию языка программирования; - Б) прямую запись в видеопамять. 2. Предложить 5 вариантов изменения цвета точки таким образом, что бы получить различные рисунки заполнения области. 3. Сделать...
почему clrser(); не работает C++
#include<stdio.h> #include<conio.h> main() { int i,n,result=1; clrser(); printf("Vvedit n:"); scanf("%d",&n);
C++ Написать программу на языке СИ++ для установки графического режима работы экрана и вывода основных характеристик этого режима http://www.cyberforum.ru/cpp-beginners/thread970377.html
Задание: 1. Написать программу на языке СИ++ для установки графического режима работы экрана и вывода основных характеристик этого режима. 2. Проверить основные графические режимы работы (сколько получится установить) для данной видеосистемы.
C++ ListControl редактирование столбцов у записей есть ListControl. Вид - отчет. Есть несколько записей. Есть колонки. В колонках для каждой записи есть значение. Нужно по нажатию на клавишу Обновить, сменить для выбранной записи значение в столбце например на "***" Для наглядности вот скрин: хочу для записи 3.3.3.3 по нажатию на клавишу сменить статус на "online" и активность например на "up". подробнее

Показать сообщение отдельно
Streecs
1 / 1 / 0
Регистрация: 03.07.2013
Сообщений: 31

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

07.10.2013, 15:42. Просмотров 4582. Ответов 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 минуты
Перепроверил уравнения шифрования и дешифрования. Они работают правильно. Косяк в нахождении обратного числа. Если кто может объяснить как его правильно высчитывать буду очень признателен.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru