写在前面:这个帖也同样是开来做坑的((
域
有限域
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');
}