霍雅
追求源于热爱,极致源于梦想!
RSA加密算法,是一种非对称加密,加密只需要公钥,解密需要私钥
RSA的参数所对应的关系:
p=一个随机的素数,求N用
q=一个随机的素数,求N用
pq是RSA加密的核心,以下所有值都基于pq,pq泄露了也就被解密了
e=公钥,公开的,一个和PQ都不互素的数,题目都会给,用于加密
N=p*q pq的乘积 用于加密以及求出D
phi_n=(p-1)*(q-1)
d=私钥
c=密文
m=明文
编码通常为ascii
RSA的特点,加密只需要使用公钥,解密需要用到私钥
以下为一个RSA最基础的脚本
import gmpy2
import libnum
q=libnum.generate_prime(1024) #随机一个长度为1024位的素数
p=libnum.generate_prime(1024) #随机一个长度为1024位的素数
n=q*p #求出P与Q的乘积
e=65537 #公钥
phi_n=(q-1)*(p-1) #用欧拉函数求出phi_n
d=gmpy2.invert(e,phi_n) #逆元算法求出D
flag="flag{hknfghf-hdyfghdfhfs}" #定义flag值(实战中会删除字段)
m=libnum.s2n(flag) #将flag转成十进制数字
c=pow(m,e,n) #m的e次方对n取模,加密算法
print("q=",q) #输出q
print("p=",p) #输出p
print("e=",e) #输出公钥e
print("c=",c) #输出密文c
#假设以下为输出内容,实战中通常也是这种方式
'''
p=148900842610020078152783395788458580191065197283484151623402442469499202353752353318711450773090348434049815017540436592810052451160391130076794347801795090589676057092345394228013618088580047109472124832491149992427466204648618037456992924669057605690699620897846518293427690261189822383478728900436688272541
p=93222935297214673247573486624427819399552579195049207698554278176594858403653091642502047933980818560368805813264848709102490586090871280804545354576142290393335421214079143671779414665157357358486224457099749359424181019814255284595931455836755157071014616062180167901046715795344094522088336557398922304199
e=65537
c=9906030989119766979230521815136706683885573707223987255442879161632993908374854612255899298706850494244465540284930804781350958093523890417213909818511937255895284771726220413943839404394516468159025826754983914501648627785578014171408233374552739554670311524652847992030508578921556388122256942964256741699150449782529836230514885371975192427211883128337749954164950925255782672515690095455894748763061939912372425855444167836812550069148007780933965367811245421694589276449812012946219325601914644123899636938487639499046186274323501373647472544903913594830255948014560435412897465361275190209071210991479058967356
'''
写脚本进行解码exp.py
import gmpy2
import libnum
q=148900842610020078152783395788458580191065197283484151623402442469499202353752353318711450773090348434049815017540436592810052451160391130076794347801795090589676057092345394228013618088580047109472124832491149992427466204648618037456992924669057605690699620897846518293427690261189822383478728900436688272541
p=93222935297214673247573486624427819399552579195049207698554278176594858403653091642502047933980818560368805813264848709102490586090871280804545354576142290393335421214079143671779414665157357358486224457099749359424181019814255284595931455836755157071014616062180167901046715795344094522088336557398922304199
e=65537
c=9906030989119766979230521815136706683885573707223987255442879161632993908374854612255899298706850494244465540284930804781350958093523890417213909818511937255895284771726220413943839404394516468159025826754983914501648627785578014171408233374552739554670311524652847992030508578921556388122256942964256741699150449782529836230514885371975192427211883128337749954164950925255782672515690095455894748763061939912372425855444167836812550069148007780933965367811245421694589276449812012946219325601914644123899636938487639499046186274323501373647472544903913594830255948014560435412897465361275190209071210991479058967356
n=q*p #求出pq的乘积
phi_n=(q-1)*(p-1) #用欧拉函数求出phi_n
d=gmpy2.invert(e,phi_n) #求出d
m=pow(c,d,n) #c的d次方对n取模 解密算法
print(libnum.n2s(int(m))) #将结果转成字符形式
'''
b'flag{hknfghf-hdyfghdfhfs}'
'''