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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C++]Генерация ключа по алгоритму RSA 
:(
    Опции темы
DrAcu1A
Дата 22.5.2008, 18:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Помогите пожалуйста дописать программу, она генерирует открытый и закрытый ключи по алгоритму RSA, мне нужно чтобы при тестирвании(шифровании и разшифровании) текста она шифровала и разшифровывала не только числа но и буквы. т.е. вместо параметра P1 мы вводим например ivanov и она зашифровывала этот текст тоже в буквах и разшифровывала. по сути тут надо всего лишь присвоить каждому числу свою букву, но я немогу сообразить как это реализовать, и ещё проблема в том что при больших(число большее примерно 30000) значениях n, n1 и P1 она неправельно считает.

Код

# include <iostream.h>
# include <string.h>
# include <fstream.h>
# include <math.h>
# include <stdio.h>
# include <conio.h>
# include <stdlib.h>
# define ul unsigned long
ul isPrime(ul n)
{
 ul b=1;
 for(ul i=2;i<n;i++)
  if(n%i==0) { b=0; break; }
 return b;
}
ul Power(ul x,ul y)
{
 ul ans=1;
 if(x==1) return x;
 for(ul i=1;i<=y;i++)
   ans*=x;
 return(ans);
}
char * ToBin(int x)
{
char *ans=new char[20];
int i=0;
 while(x>=1)
 {
  if(x%2==1) ans[i]='1'; else ans[i]='0';
  x/=2; i++;
 }
 if(x==1) ans[i]='1',i++;
 ans[i]='\0';
 strrev(ans);
 return(ans);
}
    ul Crypt(int x,int key,int n) // (x^y)%z //Method 2
    {
     char *B=new char[20];
     B=ToBin(key);
     ul ans=1;
     int c=1;
     for(ul i=0;i<strlen(B);i++)
     {
       c=2*c;
       ans=(ans*ans)%n;
       if(B[i]=='1')
       {
        c=c+1;
        ans=(ans*x)%n;
       }
     }
     return(ans);
    }
void main()
{
 clrscr();
 randomize();
  /* K E Y   G E N E R A T I O N */
 ul p,q,n,n1,e,d;
 Beg:    // Reading 2 random prime-numbers from 20 to 50
 p=2+rand()%200;
 q=2+rand()%200;
 if(p==q||!isPrime(p)||!isPrime(q)) goto Beg;
 n = p * q;
n1 = (p-1) * (q-1);
ul x=n1+1;
 for(e=2;e<=x/2;e++)
 {
  if(x%e==0) break;
 }
  d=x/e;
 if(p==1||q==1||e==1||d==1||e==d||
 q==e||q==d||p==e||p==d) goto Beg;
         ul P1=31,P2,Cypher;
B1:
 Cypher=Crypt(P1,e,n);  //Encrypting using public-key  'e'
 P2=Crypt(Cypher,d,n);//Decrypting using private key 'd'

 cout<<"p          = "<<p<<endl;
 cout<<"q             = "<<q<<endl;
 cout<<"n =(p*q)      = "<<n<<endl;
 cout<<"n1=(p-1)*(q-1)= "<<n1<<endl;
 cout<<"e          = "<<e<<endl;
 cout<<"d          = "<<d<<endl<<endl;
 cout<<"Public Key  : { "<<e<<","<<n<<" }"<<endl;
 cout<<"Private Key : { "<<d<<","<<n<<" }"<<endl;
cout<<"PlainText Before Encryption is : "<<P1<<endl;
cout<<"Cypher is : "<<Cypher<<endl;
cout<<"PlainText After Decryption is : "<<P2<<endl;
getch(); randomize(); clrscr();goto Beg;
 getch();
}


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

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


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

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

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

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


 




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


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

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