2021-06-14
[HDCTF2019]basic rsa
題目
import gmpy2 from Crypto.Util.number import * from binascii import a2b_hex,b2a_hexflag = "*****************"p = 262248800182277040650192055439906580479 q = 262854994239322828547925595487519915551e = 65533 n = p*qc = pow(int(b2a_hex(flag),16),e,n)print c# 27565231154623519221597938803435789010285480123476977081867877272451638645710解題
先嘗試將下面的數復制給flag,運行,顯示:
TypeError: a bytes-like object is required, not ‘str’
解決:str 通過 encode() 函數編碼為 bytes
運行得到:7733094235673990295993988034122557233478423989064087878609357727899688710412
有點長,還是嘗試一下
結果意料之中的不對
已經有n、p、q、e了,那按之前的方法解題:
import gmpy2 from Crypto.Util.number import long_to_bytes p = 262248800182277040650192055439906580479 q = 262854994239322828547925595487519915551 e = 65533 c = 27565231154623519221597938803435789010285480123476977081867877272451638645710 n = q*p phi = (q-1) * (p-1) d = gmpy2.invert(e,phi) m = gmpy2.powmod(c,d,n)print(long_to_bytes(m))答案
flag{B4by_Rs4}
[GUET-CTF2019]BabyRSA
題目
給后綴名打開
解題
已知p+q、(p+1)(q+1)、e、d、c
可以通過數學計算得到p、q
然后就可以進行常規rsa解密了
n = q*p phi = (p-1) * (q-1)d = gmpy2.invert(e,phi) m = gmpy2.powmod(c,d,n) print(long_to_bytes(m))答案
flag{cc7490e-78ab-11e9-b422-8ba97e5da1fd}
rsa2
題目
N = 101991809777553253470276751399264740131157682329252673501792154507006158434432009141995367241962525705950046253400188884658262496534706438791515071885860897552736656899566915731297225817250639873643376310103992170646906557242832893914902053581087502512787303322747780420210884852166586717636559058152544979471 e = 46731919563265721307105180410302518676676135509737992912625092976849075262192092549323082367518264378630543338219025744820916471913696072050291990620486581719410354385121760761374229374847695148230596005409978383369740305816082770283909611956355972181848077519920922059268376958811713365106925235218265173085import hashlib flag = "flag{" + hashlib.md5(hex(d)).hexdigest() + "}"解題
需求未知數d
則,還需將n分解得到p、q
分解得:
運行,出現錯誤
TypeError: Unicode-objects must be encoded before hashing
改正:將hex(d)后加.encode()
輸出flag
flag{8159e6c4abdd3b94ce461ed9a1a24017}
提交,顯示錯誤
檢查一下,d是對的
encode() 方法為字符串類型(str)提供的方法,用于將 str 類型轉換成 bytes 類型,這個過程也稱為“編碼”。
hex() 函數用于將10進制整數轉換成16進制,以字符串形式表示。
MD5簽名是一個哈希函數,把任意長度的數據轉換為一個長度固定的數據串(通常用16進制的字符串表示)。
求出d之后用在線工具解
答案
flag{47bf28da384590448e0b0d23909a25a4}
總結
以上是生活随笔為你收集整理的2021-06-14的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一段代码的改错历程
- 下一篇: 2021-06-29