Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.05.2015, 15:06   #1
WhiteJoker
Пользователь
 
Регистрация: 26.10.2014
Сообщений: 10
По умолчанию RSA cipher

доброго времени суток всем!)
занимаюсь реализацией алгоритма рса
и возникли кое какие траблы

прога более менее готова но надо еще реализовать шифрование не по одному символу а по полтора\два символа
и надо еще шифровать не по таблице символов а по собственному алфавиту
Прошу помощи в решении даных задач

собственно код программы
Код:
#include<stdio.h> 
#include<conio.h> 
#include<stdlib.h> 
#include<math.h> 
#include<string.h> 

typedef long int U64;

U64 p,q,n,t,flag,e[10000],d[10000],temp[10000],j,m[10000],en[10000],i; 
char msg[10000]; 
int prime(U64); 
void CalcE(); 
U64 CalcD(U64); 
void RSAencrypt(); 
void RSAdecrypt(); 

int main() 
{ 
//clrscr(); 
    printf("\nENTER FIRST PRIME NUMBER\n"); 
    scanf("%d",&p); 
    flag = prime(p); 
    if( flag==0 ) 
    {   
        printf("\nWRONG INPUT\n"); 
        getch(); 
        exit(1); 
    } 
    printf("\nENTER ANOTHER PRIME NUMBER\n"); 
    scanf("%d",&q); 
    flag = prime(q); 
    if( flag==0 || p==q ) 
    { 
        printf("\nWRONG INPUT\n"); 
        getch(); 
        exit(1); 
    } 
    printf("\nENTER MESSAGE\n"); 
    fflush(stdin); 
    scanf("%s",msg); 
    for( i=0; msg[i] != NULL; i++) 
        m[i] = msg[i]; 
    n = p*q; 
    t = (p-1)*(q-1); 
CalcE(); 
printf("\nPOSSIBLE VALUES OF e AND d ARE\n"); 
for(i=0;i<j-1;i++) 
printf("\n%ld\t%ld",e[i],d[i]); 
RSAencrypt(); 
RSAdecrypt(); 
getch(); 
} 

int prime(U64 pr) 
{ 
    int i; 
    j = sqrt(pr); 
    for(i=2; i<=j; i++) 
    { 
        if( pr%i == 0 ) 
        return 0; 
    } 
    return 1; 
} 

void CalcE() 
{ 
    int k; 
    k = 0; 
    for(i=2; i<t; i++) 
    { 
        if( t%i==0 ) 
        continue; 
        flag = prime(i); 
        if( flag==1 && i!=p && i!=q) 
        { 
            e[k] = i; 
            flag = CalcD(e[k]); 
            if(flag > 0) 
            { 
                d[k] = flag; 
                k++; 
            } 
            if( k==99 ) 
            break; 
        } 
    } 
} 

U64 CalcD(U64 x) 
{ 
    U64 k = 1; 
    while(1) 
    { 
        k = k+t; 
        if( k%x==0 ) 
        return(k/x); 
    }    
} 

void RSAencrypt() 
{ 
    U64 pt, ct, key = e[0], k, len; 
    i = 0; 
    len = strlen(msg); 
    while( i != len) 
    { 
        pt = m[i]; 
        pt = pt-96; 
        k = 1; 
        for(j=0; j<key; j++) 
        { 
            k = k*pt; 
            k = k%n; 
        } 
        temp[i]=k; 
        ct = k+96; 
        en[i] = ct; 
        i++; 
    } 
    en[i] = -1; 
    printf("\nTHE ENCRYPTED MESSAGE IS\n"); 
    for(i=0; en[i]!=-1; i++) 
    printf("%c",(int)en[i]); 
} 

void RSAdecrypt() 
{ 
    U64 pt,ct,key=d[0],k; 
    i = 0; 
    while( en[i] != -1 ) 
    { 
        ct = temp[i]; 
        k = 1; 
        for(j=0; j<key; j++) 
        { 
            k = k*ct; 
            k = k%n; 
        } 
        pt = k+96; 
        m[i] = pt; 
        i++; 
    } 
    m[i] = -1; 
    printf("\nTHE RSAdecryptED MESSAGE IS\n"); 
    for(i=0; m[i]!=-1; i++) 
    printf("%c",m[i]); 
}
WhiteJoker вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нужна программа для работы с щелевым считывателем магнитных карт Cipher 1023 Online NOX Фриланс 1 26.07.2012 18:38
RSA fawr Помощь студентам 0 02.05.2011 13:59
rsa zaya Помощь студентам 1 28.04.2011 17:07