Здравствуйте пишу реализацию алгоритма на с++, открытый и закрытый ключ вычисляет правильно (проверил), простые числа находит и перемножает, но декодировать не хочет, не могу понять, где ошибка 
#include <iostream>
#include <conio.h>
#include <math.h>
#include <vector>
#include <string>
#include <time.h>
class Shifr
{
private:
	enum{N=100};
	unsigned long long p;
	unsigned long long q;
	unsigned long long n;
	unsigned long long d;
	unsigned long long e;
	//std::string str;
	long str;
	std::vector<unsigned long long > vec_snach;
	std::vector<unsigned long long> p_num;
public:
	Shifr(){p=q=n=d=e=0;}
void coding(unsigned long long m);
void encoding(unsigned long long c);
void vvod();
void vivod();
void resheto();
bool find_n();
void find_e();
unsigned long long gcd(unsigned long long x,unsigned long long y);
unsigned long long modinv(unsigned long long e,unsigned long long n);  
unsigned long long modpow(const unsigned long long & ib,const unsigned long long& ie,const unsigned long long& im);
};
void Shifr::vvod()
{
	std::cout<<"\nwwedite stroku dlya shifrowaniya ";
	//std::getline(std::cin,str);
	std::cin>>str;
	resheto();
	/*for(int i=0;i<str.size();++i)
	{
		coding(str[i]);
	}
	*/
	coding(str);
}
void Shifr::vivod()
{
	unsigned char ch=0;
	for(int i=0;i<vec_snach.size();++i)
		encoding(vec_snach[i]);
	for(int i=0;i<p_num.size();++i)
	{
		ch=p_num[i];
		std::cout<<p_num[i];
		std::cout<<ch;
	}
}
void Shifr::coding(unsigned long long m)
{
	long long num = (long long (pow(long double(m),long double(e))))%n;
	vec_snach.push_back(num);
	//vec_snach.push_back(modpow(m,d,n));
	std::cout<<vec_snach.back()<<" ";
}
void Shifr::encoding(unsigned long long c)
{
	long long num = (long long (pow(long double(c),long double(d))))%n;
	p_num.push_back(num);
	//p_num.push_back(modpow(c,e,n));
}
void Shifr::resheto()
{
	long mas[N];
	srand(time(0));
	for(int i=0;i<N;++i)
		mas[i]=i;
	mas[1]=0;
	for(int i=2;i<N;++i)
	{
		if(mas[i]!=0)
			for(int j=i*2;j<N;j+=i)
				mas[j]=0;
	}
	
	for(int i=0;i<N;++i)
		if(mas[i]!=0)
			p_num.push_back(mas[i]);
	
	while(true)
	{
		if(find_n())
			break;
	}
	int buf=5;
	while (true)
	{
	while(true)
	{
		if(gcd(buf,(p-1)*(q-1))==1)
		{
			e=buf;
			break;
		}
		buf+=2;
	}
	d=modinv(e,(p-1)*(q-1));
	if(d<LONG_MAX)
		break;
	buf+=2;
	}
	p_num.clear();
	
}
bool Shifr::find_n()
{
	int i=rand()%p_num.size();
	int j=rand()%p_num.size();
	if(i==j)
		return false;
	else
	{
		p=p_num[i];
		q=p_num[j];
		n=p*q;
		return true;
	}
}
unsigned long long Shifr::gcd(unsigned long long x, unsigned long long y)
{
	while(true)
	{
		if(y==0)
			return x;
		x=x%y;
		if(x==0)
			return y;
		y=y%x;
	}
}
unsigned long long Shifr::modinv(unsigned long long e,unsigned long long n)
{
	unsigned long long b = n;
	unsigned long long c = e;
	unsigned long long i=0;
	unsigned long long j=1;
	while(c!=0)
	{
		unsigned long long x= b/c;
		unsigned long long y= b%c;
		b=c;
		c=y;
		y=j;
		j=i-j*x;
		i=y;
	}
	if(i<0)
		i+=n;
	return i;
}
/*
unsigned long longShifr::modinv(unsigned long longe,unsigned long longn)
{
	unsigned long longa=e,b=n+1;
	
	while(true)
	{
		if((a*b)%n==1)
			return b;
		else
			b+=n;
	}
}
*/
unsigned long long Shifr::modpow(const unsigned long long & ib,const unsigned long long& ie,const unsigned long long& im )
{
	unsigned long long result=1;
	unsigned long long e =ie;
	unsigned long long b =ib;
	while(e>0)
	{
		if(e%2==0)
			result=(result*b)%im;
		e>>=1;
		b=(b*b)%im;
	}
	return result;
}