RSA는 고전적인 암호화 알고리즘이다. 다음과 같은 기본적인 암호화 과정이다.
먼저 발생 개의 소수의 P, Q = N p⋅q하도록 배치 및 D (p-1) * (Q -1) 이 (p-1) ⋅ (Q 제외한 주요 찾을 수있는 전자 d⋅e -1 ) (1)의 잔여
N-, D는, E는 공개 키로 이루어지는 D를 개인 키를 만들어, N.
정수의 X를 암호화하는 공개 키를 사용하는 경우 (이하, N 이하), N, C는 다음 암호화 된 암호문 C = X ^ D 개조를 계산.
암호문 C를 수신 한 경우는 X = C ^ E 개조 N으로 계산 해제 개인 키를 사용할 수있다.
예를 들면, p = 5, Q = 11, D = 시간 (3), N = 55, E = 27.
암호화 부호 24 ^ 3mod55 = 19 24을 수득하는 경우.
도 19는 디지털 19 ^ 27 = (24)를 개조 (55)을 수득 복호화한다.
이제 당신은 당신이 20,190,324명 물어 전송 = C 암호문 차단 동시에 공개 키 N = 1001733993063167141, D = 212353.를 알고, 원래 얼마입니까?
해결 방법 :
E는만큼 원래 얻어 같이 계산 될 수있다.
먼저 계산 d를, 좋은 수요.
K = (p-1) * (Q-1)을 보자.
질문은 릴리스이다 : d * E = 1 (MOD K).
역원 d 개의 k는 E이다이를 역 소자 D를 찾는 표기로 변환된다.
오일러 정리에 의해 알려진, D는 역변환 소자 ^ D이다 (φ (K) -1).
그런 식 X = C ^ E (modn)에 따라 얻어진다.
#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));
}