RSA算法及C++实现

RSA算法实现

  • 说明
  • 算法的数学基础
  • C++实现
    • 数论函数以及结构体定义
    • 获取公钥及私钥
    • 加密
    • 解密

说明

质数p,q要自己去选取

算法的数学基础

首先,选取两个质数p,q,令 N = p q N = pq N=pq L = Φ ( N ) = ( p − 1 ) ( q − 1 ) L = \Phi \left ( N \right ) = (p-1)(q-1) L=Φ(N)=(p1)(q1)
选取E(0 g c d ( E , L ) = 1 gcd(E,L) = 1 gcd(E,L)=1,公钥即为{E,N};
求解 D ≡ E − 1 ( m o d L ) D\equiv E^{-1} (mod L) DE1(modL),即 E D ≡ 1 ( m o d L ) ED\equiv 1(mod L) ED1(modL),私钥即为{D,N};
最后计算如下公式
明 文 E ≡ 密 文 ( m o d N ) 明文^{E} \equiv 密文 \left (mod N \right ) E(modN)
密 文 D ≡ 明 文 ( m o d N ) 密文^{D} \equiv 明文 \left (mod N \right ) D(modN)

C++实现

数论函数以及结构体定义

template<typename _T>
_T gcd(_T a,_T b)
{
	if(b > a) swap(a,b);
	while(a != 0)
	{
		_T temp;
		temp = a%b;
		a = b;
		b = temp;
	}
	return a;
}
template<typename _T>
void Exgcd(_T a,_T b,_T &d,_T &x,_T &y)
{
	if(b > a) swap(a,b);
	if(b == 0)
	{
		d = a;
		x = 1;
		y = 0;
	}
	else
	{
		_T temp;
		Exgcd(b,a%b,d,x,y);
		temp = x;
		x = y;
		y = temp-(a/b)*y;
	}
}
template<typename _T>
_T qpow(_T a,_T b,_T c)
{
	_T ret = 1;
	a = a%c;
	while(b != 0)
	{
		if(b%2 == 1) ret = (ret*a)%c;
		a = (a*a)%c;
		b = b/2;
	}
	return ret;
}
template<typename _T>
struct RSA_PUBLIC_KEY
{
	_T E;
	_T N;
};
template<typename _T>
struct RSA_PRIVATE_KEY
{
	_T D;
	_T N;
};

获取公钥及私钥

template<typename _T>
void RSA_GetKeys(_T p,_T q,RSA_PUBLIC_KEY<_T> &ekey,RSA_PRIVATE_KEY<_T> &dkey)
{
	ekey.N = dkey.N = p*q;;
	_T L = (p-1)*(q-1);
	srand(time(NULL));
	_T E;
	while(true)
	{
		E = rand()%L + 1;
		if(gcd(E,L) == 1) break;
	}
	ekey.E = E;
	_T temp1,temp2;
	Exgcd(E,L,temp1,dkey.D,temp2);
}

加密

template<typename _T>
void RSA_Encode(RSA_PUBLIC_KEY<_T> ekey,_T v)
{
	return qpow(v,ekey.E,ekey.N);
}

解密

template<typename _T>
void RSA_Decode(RSA_PRIVATE_KEY<_T> dkey,_T v)
{
	return qpow(v,dkey.D,dkey.N);
}

你可能感兴趣的:(算法及数据结构)