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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 10.01.2014, 23:08   #1
evklid
Пользователь
 
Регистрация: 29.09.2010
Сообщений: 57
Стрелка функция pow

Добрый вечер.
Написал программу реализации алгоритма RSA, по нему вопросов нет.
Но программа неправильно считает данные, хотя если считать вручную все правильно.
Конкретно ошибка в функции возведения в степень pow (выделил жирным). Может я неправильно записал, или неправильный тип данных?

в кратце поясню что делает прога:
берем два простых числа 3 и 11
считаем n=3*11
считаем функцию эйлера (3-1)*(11-1)=20
выбираем число e = 3
находим значение d = 7 //(d*e mod 20 =1)
число которое будем шифровать =5
суть алгоритма в том что сначала шифруем путем: 5^3 mod 20 что равняется 26, расшифровка: 26^7mod 33 =5, получаем исходное число, но это работает только на бумаге, а в программе нет.
Прошу помощи

вот код
PHP код:
 unsigned int num1 3num2 11nfid;
double e 3;
 
unsigned int multiplic(unsigned int xunsigned int y)
{
    
unsigned int s 0;
    while((
y) != 1)
        {
                
s++;
        }
    return 
s;
}
 
int _tmain(int argc_TCHARargv[])
{
        
setlocale(LC_ALL"russian");
       
unsigned  int num 5;
 
        
cout<<"___________________________________"<<endl<<endl;
 
        
cout<<"1. Берем 2 простых числа p = "<<num1<<", q = "<<num2<<endl;
        
num1 num2;
        
cout<<"2. Вычисляем модуль n = p * q = "<<num1<<" * "<<num2<<" = "<<n<<endl;
        
fi = (num1 1) * (num2 1);
        
cout<<"3. Функция Эйлера f(n) = (p-1) * (q-1) = ("<<num1<<"-1) * ("<<num2<<"-1) = "<<fi<<endl;
        
cout<<"4. Выбираем открытую экспоненту e [1 < e <f (n)] = "<<e<<endl;
        
multiplic(3fi);
        
cout<<"5. Вычисляем секретную экспоненту d = "<<d<<endl<<endl;
        
cout<<"формируем ключи:"<<endl;
        
cout<<" - открытый ключ (e, n) = ("<<e<<", "<<n<<");"<<endl;
        
cout<<" - секретный ключ (d, n) = ("<<d<<", "<<n<<")"<<endl<<endl;
 
        
cout<<"_____________________________________"<<endl<<endl;  
        
cout<<"Шифруем заданное число  "<<num<<"."<<endl;
        
long s1 int(pow(long double(num), int(e))) % n;
        
        
cout<<"получаем c= "<<s1<<endl<<endl;
 
        
cout<<"____________________________________"<<endl<<endl;
 
        
cout<<"Расшифровываем число "<<s1<<"."<<endl;
        [
B]unsigned long s2 unsigned long(pow(long double(s1),int(d))) % n;[/B]

        
cout<<"Получаем m= "<<s2<<endl<<endl;
 
         
cout<<"проверка: ";
        if(
s2 == num)
        {
                
cout<<num<<" = "<<s2<<" - алгоритм работает привильно"<<endl;
        }
        else
        {
                
cout<<num<<" != "<<s2<<" - алгоритм работает не привильно"<<endl;
        }
 
        
cout<<endl<<"=============================="<<endl;
 
        
system("pause");
        return 
0;

evklid вне форума Ответить с цитированием
Старый 10.01.2014, 23:13   #2
evklid
Пользователь
 
Регистрация: 29.09.2010
Сообщений: 57
По умолчанию

вот в этой функции ошибка
PHP код:
unsigned long s2 unsigned long(pow(long double(s1),int(d))) % n
s1=26
d=7
n=33
по функции записал правильно 26^7 mod 33 но ответ получается не верный,
должно быть 5, а выдает 1
evklid вне форума Ответить с цитированием
Старый 10.01.2014, 23:39   #3
Базиля
Участник клуба
 
Аватар для Базиля
 
Регистрация: 03.12.2009
Сообщений: 1,013
По умолчанию

Переполнение у Вас.
Число то большое, 4 байт не хватает. Отсюда результат вычислений неверный получается. И ответ соответствующий.
Используйте long long (8 байт).

Последний раз редактировалось Базиля; 10.01.2014 в 23:46.
Базиля вне форума Ответить с цитированием
Старый 10.01.2014, 23:42   #4
evklid
Пользователь
 
Регистрация: 29.09.2010
Сообщений: 57
По умолчанию

Цитата:
Сообщение от Базиля Посмотреть сообщение
Переполнение у Вас.
Число то большое, 4 байт не хватает ( зависит от компилятора!!! ). Отюда результат вычислений неверный получается. И ответ соответствующий.
Используйте long long (8 байт).
Точно, Спасибо
evklid вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка pow(x,y); cas2010 Помощь студентам 26 12.05.2012 19:51
Функция pow |Dima| Общие вопросы C/C++ 16 19.07.2011 13:07
функция pow(double x, double y) Не могу понять в чем ошибка Vlashel Помощь студентам 3 07.10.2010 16:28
не работает ф-я pow Denni$ Общие вопросы C/C++ 2 09.06.2009 02:44
delphi pow? Happyman Помощь студентам 2 13.05.2008 19:40