寫在前面:這個帖也同樣是開來做坑的((
域
有限域
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的原理:
其實這裏雖然說是follows by Chinese remainder theorem,但這裏可以藉助最小公倍數的性質推導:
由最小公倍數的性質,我們知道
因此,如果
即
即
同時成立的條件爲
即
也就是
此處,
因此
所以
解碼例子:
我不知道爲什麼原本用線性求逆元會出現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');
}