Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [С++] Шифрование текста методом Эль-Гамаля


Автор: Argus 15.5.2009, 22:48
Помогите, пожалуйста, переделать код.

Составить программу для шифрования и расшифровки текста методом Эль-Гамаля (простое число р должно быть не меньше 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;         
}

Автор: gosn1ck 16.5.2009, 12:38
а я думал сейчас круто RSA smile а что проблема поменять строку long P=1003; ? smile

Автор: Argus 16.5.2009, 21:04
Цитата(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.

Автор: gosn1ck 17.5.2009, 15:19
http://fotki.yandex.ru/users/gosn1ck/view/183260/

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

Автор: Henki 6.6.2011, 15:21
а кто может объяснить попдробнее функцию void ax_by_c(long A, long *X, long B, long *Y, long C)?
Конкретнее про двумерные массивы E.
Если сделать зашифрованный текст без пробелов между c1 и с2, то как реализовть расшифровку...

Автор: MrChe 19.6.2011, 15:16
Если можно, попродробнее код.

Автор: Noubpoeno 10.12.2022, 04:04
Модератор: Сообщение скрыто.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)