质数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)=(p−1)(q−1);
选取E(0
求解 D ≡ E − 1 ( m o d L ) D\equiv E^{-1} (mod L) D≡E−1(modL),即 E D ≡ 1 ( m o d L ) ED\equiv 1(mod L) ED≡1(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)
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);
}