RSA加密法

成電  楊皓宇(請各位叫我堇姬)

堇姬Naup(網管/美宣)

成電二年級/幽夜工作室繪師

CKCSC36

DC : naup_sumire_hime

IG : ckcsc36th_naup

涉獵C++、C、python、遊戲(tkinter、pygame)、資安(Web、Crypto)、AI、flask、html/css/js、 PHP、DC bot。

喜歡看輕小說、動畫、Vtuber、打音遊,也喜歡看百合,就是一個長年混跡ACG的宅女。

偷油一下(推死神和星街)

甚麼是RSA?

@ 它需要兩個金鑰,一個是公開密鑰,另一個是私有密鑰

@ 公鑰用作加密,私鑰則用作解密

加密解密流程

1. 找兩個質數p , q

2. N=p*q

3. φ(N)=(p-1)*(q-1)

4.找公鑰e,1 < e < φ(N) 且 e和φ(N)互值

5.找私鑰d,e*d除以φ(N)餘1

 

加密公式

(m^e)%N=c

m-->明文

e-->公鑰

c-->密文

解密公式

(c^d)%N=m

d-->私鑰

 

RSA加密安全性

你的n越大基本上就越安全

(大概1024bits就很安全,但最近1024受到質疑而建議使用2048bits)

實作

*有兩題一樣的,是70points的

N: 1615765684321463054078226051959887884233678317734892901740763321135213636796075462401950274602405095138589898087428337758445013281488966866073355710771864671726991918706558071231266976427184673800225254531695928541272546385146495736420261815693810544589811104967829354461491178200126099661909654163542661541699404839644035177445092988952614918424317082380174383819025585076206641993479326576180793544321194357018916215113009742654408597083724508169216182008449693917227497813165444372201517541788989925461711067825681947947471001390843774746442699739386923285801022685451221261010798837646928092277556198145662924691803032880040492762442561497760689933601781401617086600593482127465655390841361154025890679757514060456103104199255917164678161972735858939464790960448345988941481499050248673128656508055285037090026439683847266536283160142071643015434813473463469733112182328678706702116054036618277506997666534567846763938692335069955755244438415377933440029498378955355877502743215305768814857864433151287

e: 3

c: 1220012318588871886132524757898884422174534558055593713309088304910273991073554732659977133980685370899257850121970812405700793710546674062154237544840177616746805668666317481140872605653768484867292138139949076102907399831998827567645230986345455915692863094364797526497302082734955903755050638155202890599808147130204332030239454609548193370732857240300019596815816006860639254992255194738107991811397196500685989396810773222940007523267032630601449381770324467476670441511297695830038371195786166055669921467988355155696963689199852044947912413082022187178952733134865103084455914904057821890898745653261258346107276390058792338949223415878232277034434046142510780902482500716765933896331360282637705554071922268580430157241598567522324772752885039646885713317810775113741411461898837845999905524246804112266440620557624165618470709586812253893125417659761396612984740891016230905299327084673080946823376058367658665796414168107502482827882764000030048859751949099453053128663379477059252309685864790106

根據(m^e)/N=k...c,推導出m=(k*N+c)^(1/e)

因為e=3很小,故可以直接窮舉k。

import gmpy2

N=0
c=0
e=0
for k in range(10000000000):
    
    [r,exact]=gmpy2.iroot(c+N*k,e)
    if exact:
    	
        print(bytes.fromhex(hex(r)[2:]))
        break
Decrypt my super sick RSA:
c: 421345306292040663864066688931456845278496274597031632020995583473619804626233684
n: 631371953793368771804570727896887140714495090919073481680274581226742748040342637
e: 65537
  • 根據(e*d)%φ(N)=1想要求出d(私鑰),需先求得φ(N)
  • 先將n分解出p,q,求出φ(N),推導出d。
  • (c^d)%N=m,將上述的帶入推出m
import libnum

p=0
q=0
N=p*q
e=0
c=0
phi=(p-1)*(q-1)

#libnum.modular.invmod(a,b) --> (a*x)%b=1
#(e*d)%phi=1

d=libnum.modular.invmod(e,phi)

#libnum.n2s() --> 十進制轉字符串
#(c^d)/N=o...m

m=libnum.n2s(c**d%N)
print(m)

RSA加密

By naup96321