블루 브릿지 컵 2019 RSA 암호화 (빠른 전원 타고 오일러의 정리의 빠른 역수)

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));	
	
} 


 

게시 57 개 원래 기사 · 원의 찬양 (58) · 전망 (606)

추천

출처blog.csdn.net/weixin_43568895/article/details/103980462