RSA is a classic encryption algorithms. Its basic encryption process is as follows.
First generating two prime numbers p, q n = p⋅q so disposed and d (p-1) * (q -1) prime can be found e d⋅e except that (p-1) ⋅ (q -1 ) a remainder of 1.
n-, D, E make up the private key, n, d composed of the public key.
When using a public key to encrypt a integer X (less than n), calculated C = X ^ d mod n, then C is encrypted ciphertext.
Upon receipt of the ciphertext C, you can use the private key to unlock, calculated as X = C ^ e mod n.
For example, when p = 5, q = 11, d = the time 3, n = 55, e = 27.
If the encryption numeral 24, to give 24 ^ 3mod55 = 19.
19 decrypts the digital to give 19 ^ 27 mod 55 = 24.
Now that you know the public key n = 1001733993063167141, d = 212353. At the same time you intercepted ciphertext C = 20,190,324 people sent to ask, how much is original?
answer:
E can be calculated as long as the original is obtained.
First calculate d, the good demand.
Let k = (p-1) * (q-1).
Release of the questions is then: d * e = 1 (mod k).
About inverse element d k is e, it is converted to the title find the inverse element d.
Known by the Euler's theorem, d is the inverse element d ^ (φ (k) -1).
Then according to the formula X = C ^ e (modn) is obtained.
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll fast_mul(ll p,ll q,ll mod){ //计算p*q
ll ret=0;
p%=mod; q%=mod;
while(q>0){
if(q&1)
ret=(ret+p)%mod;
q>>=1;
p=(p+p)%mod;
}
return ret;
}
ll pow_mod(ll a,ll p,ll mod){ //计算a^p
ll ret=1;
a%=mod;
while(p>0){
if(p&1)
ret=fast_mul(ret,a,mod);
p>>=1;
a=fast_mul(a,a,mod);
}
return ret;
}
ll euler_phi(ll n){
ll m=sqrt(n+0.5);
ll ans=n;
for(int i=2;i<=m;i++)
if(n%i==0){
ans=ans/i*(i-1);
while(n%i==0) n/=i;
}
if(n>1) ans=ans/n*(n-1);
return ans;
}
ll get_zhishu(ll x){
for(int i=2;i<=x;i++){
if(x%i==0)
return i;
}
}
int main(){
ll n=1001733993063167141;
ll d=212353;
ll C=20190324;
ll p=get_zhishu(n);
printf("p的值为%lld\n",p);
ll q=n/p;
printf("q的值为%lld\n",q);
ll k=(p-1)*(q-1);
printf("k的值为%lld\n",k);
ll ans=euler_phi(k);
printf("phi(k)的值为%lld\n",ans);
ll e=pow_mod(d,ans-1,k);
printf("e的值为%lld\n",e);
printf("C^e的值为%lld",pow_mod(C,e,n));
}