Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C++] Шифрование методом Эль-Гамаля 
:(
    Опции темы
alver
Дата 5.4.2007, 22:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 74
Регистрация: 27.10.2006
Где: Питер

Репутация: нет
Всего: нет



Попросили меня зделать такую программку, шифрование методом Эль-Гамаля. Я тока где то два часа врубал этот метод, тока потом начал его описывать как код. Кое что получается, но почему то иногда выдаётся неправильный результат. Я подозреваю дело в типах, просто не хватает знаков, т.к. числа очень большие, помогите кто что знает по этому поводу. Вот то, что я успел написать: 
Код

#include "iostream"
#include "stdio.h"
#include "conio.h"
using namespace std;
unsigned long int N;
void extended_euclid(unsigned long int a, unsigned long int b, unsigned long int *x, unsigned long int *y, unsigned long int *d)
/* calculates a * *x + b * *y = gcd(a, b) = *d */
{
  unsigned long int q, r, x1, x2, y1, y2;
  if (b == 0) {
    *d = a, *x = 1, *y = 0;
    return;
  }
  x2 = 1, x1 = 0, y2 = 0, y1 = 1;
  while (b > 0) {
    q = a / b, r = a - q * b;
    *x = x2 - q * x1, *y = y2 - q * y1;
    a = b, b = r;
    x2 = x1, x1 = *x, y2 = y1, y1 = *y;
  }
  *d = a, *x = x2, *y = y2;
}

unsigned long int invmod(unsigned long int a, unsigned long int n)
/* computes the inverse of a modulo n */
{
  unsigned long int d, x, y;
  extended_euclid(a, n, &x, &y, &d);
  if (d == 1)
    if (x>0)
      return x;
    else
      return x+n;
  return 0;
}

unsigned long int powmod(unsigned long int g, unsigned long int x, unsigned long int p)
{
  unsigned long int b=1;
  unsigned long int i;
  for(i=0;i<x;i++)
  b=g*g;
  b=b%p;
  return b;
}

unsigned long int powmod(unsigned long int y, unsigned long int k, unsigned long int p, unsigned long int m)
{
    unsigned long int b=0;
    unsigned long int i;
    for(i=0;i<k;i++)
    b=y*y;
    b=b*m;
    b=b%p;
    return b;
}
unsigned long int Get() 
{
    unsigned long int val;
    while (1) {
        cin >> val;
        if (cin.peek () == '\n') break;
        else {
            cout<<"\t\t\tReenter symvol";
            cin.clear();
            while (cin.get() != '\n'){};
            }    
        }
    return val;
}

int Getint() 
{
    int val;
    while (1) {
        cin >> val;
        if (cin.peek () == '\n') break;
        else {
            cout<<"\t\t\tReenter symvol";
            cin.clear();
            while (cin.get() != '\n'){};
            }    
        }
    return val;
}
void Rus(char *y)
{
    int i;
    char *x = new char[strlen(y)];
    for (i = 0; ; i++) 
    {
        if (y[i] == 0)
        {
            x[i] = 0;                // конец символа
            break;
        }
        x[i] = y[i];
    }
    for (i = 0; ; i++) 
    {
        if (x[i] == 0) 
            break;
        if (x[i]>-65 && x[i]<-16)
        x[i] += -64;            // смещение таблиц win от dos
        if (x[i]>-17 && x[i]<0)
        x[i] += -16;            // смещение таблиц win от dos
        cout << x[i];
    }
}
unsigned long int vvod(int p)
{
    unsigned long int T=0;
    switch(p)
    {
    case 1:do{Rus("Введите любое большое(пятизначное) число P"); T=Get();N=T;}while(T<22222);break;
    case 2:do{Rus("Введите любое большое(пятизначное) число G, но меньше P");T=Get();}while(T>N&&T>22222-1);break;
    case 3:do{Rus("Введите секретный ключ - случайное целое число X <P");T=Get();}while(T>N);break;
    case 4:do{Rus("Выберите целое число K, так чтобы 1< K< P-1");T=Get();}while(T<1&&T>N-1);break;
    case 5:do{Rus("Введите число которое хотите зашифровать, должно быть меньше 55555, т.к. ограничение на тип");T=Get();}while(T>55555);break; 
    }
    return T;
}

int main() 
{
unsigned long int P,G,X,Y,K,M,A,B,ok;
int vibor;
do
{
    system("cls");
    Rus("1.Ввод данных для шифрования\n");
    Rus("2.Просмотр зашифрованных данных\n");
    Rus("3.Проверка правильности шифрования\n");
    Rus("4.Выход\n");
    vibor=Getint();
    switch(vibor)
    {
    case 1:system("cls");P=vvod(1);G=vvod(2);X=vvod(3);Y=powmod(G,X,P);K=vvod(4);M=vvod(5);break;
    case 2:system("cls");A=powmod(G,K,P);B=powmod(Y,K,P,M);cout<<"a="<<A<<endl;cout<<"b="<<B<<endl;getch();break;
    case 3:system("cls");ok=(B*invmod(powmod(A,X,P),P))%P;cout<<ok;getch();break;
    case 4:break;
    }
}
while(vibor!=4);
cin.get();
}

Вот краткое описание метода:
Получатель сообщения выбирает два больших числа P и G, причем P > G.
Получатель выбирает секретный ключ - случайное целое число X < P.
Вычисляется открытый ключ Y= G x mod P.
Получатель выбирает целое число K, 1< K< P-1.
Шифрование сообщения (M): a= GK mod P, b=Y K M mod P, где пара чисел (a,b) является шифротекстом.
Помогите спецы, задача по мне не очень то простая.!

Это сообщение отредактировал(а) alver - 5.4.2007, 22:05
PM MAIL GTalk Jabber   Вверх
permea
Дата 6.4.2007, 05:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 4.4.2007

Репутация: нет
Всего: нет



если числа большие, то почему не 64 битные целые?(непереносимо, но gcc и VC++ поддрживают 64-битные целые, хотя названия, емнип, разные
+ если целые _очень_ большие, есть спецбиблиотеки для работы с ними.
PM MAIL   Вверх
Alexandr87
Дата 6.4.2007, 06:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


дыкий псых
***


Профиль
Группа: Завсегдатай
Сообщений: 1459
Регистрация: 27.11.2004
Где: Алматы, Казахстан

Репутация: 2
Всего: 39



разрядность больших чисел, используемых в криптографии с открытым ключом очень велика, используются числа с разрядность 512-5120 бит. Соответсвенно, использовать встроенные типы здесь не получится. Есть специальные библиотеки, которые реализуют способ представления таких данных и логические операции с ними, есть и OpenSource библиотеки - вы найдете их без труда.

Это сообщение отредактировал(а) Alexandr87 - 6.4.2007, 11:25
PM Jabber   Вверх
korbian
Дата 6.4.2007, 07:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 336
Регистрация: 20.2.2007
Где: Penza

Репутация: 2
Всего: 14



Операции над числами такой разрядности "отжирают" много ресурсов, поэтому советую сразу думать над оптимизацией. Потому ищи информацию о математике над длиными (так их называют) числами. 
Очень советую книгу: А.В.Домашев, М.М. Грунтович, В.О.Попов, Д.И.Правиков,А.Ю.Щербаков "Программирование алгоритмов защиты информации"


--------------------
korbian ©
PM   Вверх
alver
Дата 6.4.2007, 11:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 74
Регистрация: 27.10.2006
Где: Питер

Репутация: нет
Всего: нет



Чего то я не нашёл такие библиотеки, может конечно плохо искал, но никто не направит на нужный сайт??
Так же кинга то может хорошая, но в электронном варианте её нигде нет, а купить это долго, мне до понедельника надо.

Это сообщение отредактировал(а) alver - 6.4.2007, 11:36
PM MAIL GTalk Jabber   Вверх
Alexandr87
Дата 6.4.2007, 20:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


дыкий псых
***


Профиль
Группа: Завсегдатай
Сообщений: 1459
Регистрация: 27.11.2004
Где: Алматы, Казахстан

Репутация: 2
Всего: 39



http://gmplib.org/

Из книг "Прикладная криптография" - но разбираться и реализовывать - дело долгое.

PM Jabber   Вверх
volatile
Дата 30.11.2011, 00:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



Цитата(Elisey44 @  29.11.2011,  14:48 Найти цитируемый пост)
не голову ломать над написанием Эль Гамаля, а купить 

Наглая реклама. 
И много вы на продаже Эль-Гамаля (фиг знает как написанного), думаете заработать? smile
да еще и 
Цитата

Технологии/языки:
C# Windows Forms

 smile 

crypto++


Это сообщение отредактировал(а) volatile - 30.11.2011, 00:13
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0856 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.