Форум: Форум C++Разное
Новые темы: 00
Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум C++

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Алгоритм шифрования RSA
 
 автор: Sofya_111   (12.10.2011 в 21:13)   письмо автору
 
 

Здравствуйте!
Очень прошу помощи в реализации алгоритма шифрования.
Собственно алгоритм:
1. Выбрать простые числа p и q
2. Вычислить n = p * q
3. Вычислить f = (p - 1) * (q - 1)
4. Выбрать число e взаимно простое с f
5. Выбрать число d так, чтобы e * d = 1 (mod f)
#include <iostream>
#include <cmath>

using namespace std;

const int p = 3557;
const int q = 2579;

int main()
{
    long n = p * q;
    long f = ( q - 1 ) * ( p - 1 );
    long e = 3;
    long d = ( 1 + 2 * f ) / e;
    long m = 11;

    long a = fmodpow( m, e ), n );
    long b = fmodpow( a, d ), n );

    cout << "Source text: " << m << "; ciphertext: " << a << "; unciphertext: " << b;

    char ch;
    cin >> ch;

    return 0;
}


Шифрование: a = m^e(mod n)
Дешифровка: b = a^d (mod n)

Проблема в том, что текст шифрует правильно, а дешифрует не правильно. Помогите, плиз!!!!

  Ответить  
 
 автор: cheops   (13.10.2011 в 15:46)   письмо автору
 
   для: Sofya_111   (12.10.2011 в 21:13)
 

У вас a^d слишком большое получается и выходит за границы числа... а вы где описание алгоритма нашли? Оно точно такое? Кроме того, смущает 4 пункт
>4. Выбрать число e взаимно простое с f
Почему для e выбрано число 3?

  Ответить  
 
 автор: morgan18   (13.01.2012 в 22:42)   письмо автору
1.8 Кб
 
   для: Sofya_111   (12.10.2011 в 21:13)
 

посмотри как я лепил это шифрование
посмотри эту функцию

int modpow(int a, unsigned long long n, int m)
{
    if (n == 1)
        return a % m;
    unsigned long long z;
    z = modpow(a, n / 2, m);
    z = (z * z) % m;
    if (n % 2 == 1)
z = (z * a) % m;
    return (int)z;
}

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования