[CTF]學習筆記

寫在前面:這個帖也同樣是開來做坑的((

有限域

有限域的引入

RSA

n=p*q,p與q爲血長的質數。

encryption:
持有公鑰(n,e)
將plaintext按照n的長度分段,
將每段plaintext求e次冪,並模n,得到密文。

decryption:
持有私鑰d=inv(e mod (p-1)(q-1))
plaintext就是密文求d次冪,並模n。

這樣能夠decryption的原理:
課本4.6
課本4.6
其實這裏雖然說是follows by Chinese remainder theorem,但這裏可以藉助最小公倍數的性質推導:
由最小公倍數的性質,我們知道
aim(1ik)[a1,a2,...,ak]ma_{i}|m (1\leq i\leq k)\Leftrightarrow [a_1,a_2,...,a_k]|m
因此,如果
abmod  mi1mka\equiv b\mod m_i(1\leq m\leq k)

ab0mod  mi(1mk)a-b\equiv 0\mod m_i(1\leq m\leq k)

miab(1mk)m_i|a-b(1\leq m\leq k)
同時成立的條件爲
[m1,m2,...mk]ab[m_1,m_2,...m_k]|a-b

ab0mod  [m1,m2,...,mk]a-b\equiv 0 \mod [m_1,m_2,...,m_k]
也就是abmod  [m1,m2,...,mk]a\equiv b\mod [m_1,m_2,...,m_k]
此處,(q,p)=1(q,p)=1
因此[q,p]=q×p[q,p]=q\times p
所以CdMmod  pqC^d\equiv M\mod pq

解碼例子:
我不知道爲什麼原本用線性求逆元會出現0.所以用了擴歐求逆元。(此處再挖坑,有空搞清楚)
題目:dmath 4.6 26
題目大意:解RSA。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll mod=52*60,n=53*61;
void ex_gcd(ll a,ll b,ll &x,ll &y){
	if(b==0){
		x=1,y=0;
		return ;
	}
	ex_gcd(b,a%b,y,x);
	y-=a/b*x;
}
ll mod_inverse(ll a,ll m){
	ll x,y;
	ex_gcd(a,m,x,y);
	return (m+x%m)%m;//最小正整數解
}
ll quickp(ll a,ll k){
	a%=n;
	ll ans=1;
	while(k){
		if(k&1) ans=(ans*a)%n;
		a=(a*a)%n;
		k>>=1;
	}
	return ans;
}
int main(){
	ll n=53*61,e=17;
	ll m1=3185,m2=2038,m3=2460,m4=2550;
	ll d=mod_inverse(e,mod);
	ll r1=quickp(m1,d)%n,r2=quickp(m2,d)%n;
	ll r3=quickp(m3,d)%n,r4=quickp(m4,d)%n;
	printf("%c%c%c%c",r1/100+'a',r1%100+'a',r2/100+'a',r2%100+'a');
	printf("%c%c%c%c",r3/100+'a',r3%100+'a',r4/100+'a',r4%100+'a');
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章