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

Поиск:

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


Новичок



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

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



Помогите, пожалуйста, переделать код.

Составить программу для шифрования и расшифровки текста методом Эль-Гамаля (простое число р должно быть не меньше 10^15). 
Исходный текст хранится в текстовом файле inp.txt и имеет объем не менее 2 Кб. Зашифрованный текст записывается в файл out.txt. Расшифрованный текст помещается в файл out.txt.
Прога работает для достаточно небольших значений P, а необходимо для P > 10^15


Код

#include <stdlib.h>
#include <stdio.h>
#include <time.h>

long P=1003;
long a=357;
long g=2;
long b;

long g_in_a(long g,long a,long P);
void shifruem();
void rasshifruem();
void ax_by_c(long A, long *X, long B, long *Y, long C);

int main()
{
    b = g_in_a(g,a,P);
    shifruem();
    rasshifruem();
    return 0;
}

void shifruem()
{
    FILE *fi,*fo;
    fi = fopen("in.txt","r");
    fo = fopen("out.txt","w");
    char c;
    long r=7;
    long C1, C2;
    long X=0;
    srand( (unsigned)time( NULL ) );
    while( fscanf(fi,"%c",&c)!=EOF )
    {
        if( c>='A' && c<='Z' ) c=c-'A'+'a';
        if( c>='a' && c<='z' )
        {
            r = (long)((double)rand()/(double)RAND_MAX*(P-2)+1);
            c -= 'a'; c += 10;
            X = c;
            C1 = g_in_a(g,r,P);
            C2 = g_in_a(b,r,P);
            C2 = (C2*X)%P;
            fprintf(fo,"%d %d  ",C1,C2);
        }
    }
    fclose(fo);
    fclose(fi);
}

void rasshifruem()
{
    FILE *fi,*fo;
    fi = fopen("out.txt","r");
    fo = fopen("out2.txt","w");

    long C1, C2;
    long X=0, t, Y;
    int k=0;
    while( fscanf(fi,"%d%d",&C1, &C2)!=EOF )
    {
        t = g_in_a(C1,a,P);
        ax_by_c( t, &X, P, &Y, C2 );        
        while( X<0 ) X += P;
        X = X%P;
        fprintf(fo,"%c",X-10+'a');
        k++;
        if( k==6 ){ k=0; fprintf(fo," "); }
    }
    fclose(fo);
    fclose(fi);
}


void ax_by_c(long A, long *X, long B, long *Y, long C)
{
    long E[2][2];
    E[0][0]=1; E[0][1]=0;
    E[1][1]=1; E[1][0]=0;
    long e1,e2,e3,e4;
    long k, r;
    while(1)
    {
        r=A%B;
        if( r==0 ) break;
        k=(A-r)/B;
        e1=E[0][1]; e2=E[0][0]-E[0][1]*k;
        e3=E[1][1]; e4=E[1][0]-E[1][1]*k;
        E[0][0]=e1; E[0][1]=e2;
        E[1][0]=e3; E[1][1]=e4;
        A=B; B=r;
    }
    (*Y)=E[1][1]*C;
    (*X)= E[0][1]*C;
}

long g_in_a(long g,long a,long P)
{
    long r;
    int d[30], n=0, i;
    
    while( a>0 )
    {
           d[n++]=a%2;
           a/=2;
    }
    for( r=g, i=n-2; i>=0; --i )
    {
        r=(r*r)%P;
        if( d[i]==1 ) r=(r*g)%P;
    }
    return r;         
}

PM MAIL   Вверх
gosn1ck
Дата 16.5.2009, 12:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



а я думал сейчас круто RSA smile а что проблема поменять строку long P=1003; ? smile

PM MAIL ICQ   Вверх
Argus
Дата 16.5.2009, 21:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(gosn1ck @ 16.5.2009,  12:38)
а я думал сейчас круто RSA smile

RSA, может, конечно, и круто. Но ток лаба мне досталась по Эль-Гамалю.  smile 
Цитата(gosn1ck @ 16.5.2009,  12:38)
 а что проблема поменять строку long P=1003; ? smile

хех  smile , если б всё так просто было. Значение P должно быть больше, чем 10^15 (читать 10 в 15-ой степени). Вот перебью я значение P, а потом что? 10^15 гораздо больше, чем максимальное значениет типа long.


Это сообщение отредактировал(а) Argus - 16.5.2009, 21:08
PM MAIL   Вверх
gosn1ck
Дата 17.5.2009, 15:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



user posted image

PM MAIL ICQ   Вверх
5u1c1de
Дата 7.6.2009, 17:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



есть в си тип __int16 __int32 __int64, думаю туда больше поместится чем в long, я бы использовал unsigned __int64 smile 
в криптографии вообще можно забыть про int и long)
в яве BigInteger можно использовать
ПС: можно самому написать класс больших чисел

Это сообщение отредактировал(а) 5u1c1de - 7.6.2009, 17:36
PM MAIL   Вверх
Henki
Дата 6.6.2011, 15:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



а кто может объяснить попдробнее функцию void ax_by_c(long A, long *X, long B, long *Y, long C)?
Конкретнее про двумерные массивы E.
Если сделать зашифрованный текст без пробелов между c1 и с2, то как реализовть расшифровку...
PM MAIL   Вверх
MrChe
Дата 19.6.2011, 15:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Если можно, попродробнее код.

Это сообщение отредактировал(а) MrChe - 19.6.2011, 15:17
PM MAIL   Вверх
Noubpoeno
Дата 10.12.2022, 04:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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




Модератор: Сообщение скрыто.

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

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

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


 




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


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

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