RSA 含兩道oj 上ctf題目


  藍橋杯一個填空題是rsa,python也沒跑出來,回來又學了學rsa

這個講的很清楚,證明啥的都很清晰,(證明中,m與n不互質時,ed兩次帶入,似乎沒必要。)

鏈接:https://blog.csdn.net/u014044812/article/details/80866759

 

其中附加的輾轉相除法,手算ax+by=1這種式子也會了。

舉個百度的例子:

已知不定方程為
   
,利用輾轉相除法求出一組整數解
 
解:求
   
的算式為:
所以
所以
 
所以
   
是不定方程
   
的一組解。
 
藍橋杯中的題意是已知n,d,c求m,e是未知。
 
加密:
m^ec(modn)
解密:
c^d≡m(modn)
 
好像用公式一套就出來了??!
 
 
反正oj上第一個flag是得到了
import rsa,sys
from rsa import common
#(pub_key,pri_key) = rsa.newkeys(256)
#m = b'hello'
#crpto = rsa.encrypt(m,pub_key)
#print(len(crpto),common.byte_size(pub_key.n))
#print(pri_key)
#print(sys.argv[0])
pri_k = open('rsa_private_key.pem','r').read()
#print(pri_k,'1')
#print("--------------------------------------------------")
pri_key = rsa.PrivateKey.load_pkcs1(pri_k)
#print(pri_key)
c = open('flag.encrypt','rb').read()
m = rsa.decrypt(c,pri_key)
print(m)

 第二個:

找到了一個知乎的解法,然后n,e,d,p,q都一樣,解密失敗。。。

我就是解密失敗。。無語

然后找到了一個博客上面是自己實現解密方法,然后調用。

我又試了試,自己寫了個。

因為rsa解密在得到了私鑰后,其實就是帶mod的快速冪

然后解成功了,但是解碼顯示沒出來,python3  str沒有decode方法。

於是想到了之前bytes2int()會不會有反向的,因為bytes有decode

然后發現真有,就很愉悅了。

轉為bytes后decode就出來了。

至於如何得到的n,e,p,q,d參考我之前寫的隨筆:https://www.cnblogs.com/zhibin123/p/10590743.html

# -*- coding:utf-8 -*-
import gmpy2
import rsa
from rsa import transform,core

def fastMod(c,d,n):
    t = c
    res = 1
    while d:
        if d & 1:
            res = (res * t)%n
        t = ( t * t ) % n
        d>>=1
    return res

def decrytption(c,d,n):
    return fastMod(c,d,n)

q = 319576316814478949870590164193048041239
p = 275127860351348928173285174381581152299
n = 87924348264132406875276140514499937145050893665602592992418171647042491658461
e = 65537
d = int(gmpy2.invert(e,(p-1) * (q-1)))
pri_key = rsa.PrivateKey(n,e,d,p,q)

c = open('flag.encrypt','rb').read()
print(c)

c = transform.bytes2int(c)
print(c)
m = decrytption(c,d,n)
print(m,type(m))
flag = transform.int2bytes(m).decode()
print(flag)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM