|
|
|
| Здравствуйте!
Очень прошу помощи в реализации алгоритма шифрования.
Собственно алгоритм:
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 = fmod( pow( m, e ), n );
long b = fmod( pow( 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)
Проблема в том, что текст шифрует правильно, а дешифрует не правильно. Помогите, плиз!!!! | |
|
|
|
|
|
|
|
для: Sofya_111
(12.10.2011 в 21:13)
| | У вас a^d слишком большое получается и выходит за границы числа... а вы где описание алгоритма нашли? Оно точно такое? Кроме того, смущает 4 пункт
>4. Выбрать число e взаимно простое с f
Почему для e выбрано число 3? | |
|
|
|
|
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;
}
|
| |
|
|
|