
- 1.CRYPTO IS
- CTF含义上指的是密码破解,与密码研发割裂较大
- 2.CRYPTO INCLUDE
- 以下列举一些常见的CRYPTO题型:古典密码,密码分组的破解(ECB for instance),RSA的破解,ECC的破解,格密码的分析等
- 3。CRYPTO MEAN
- 就是解数学题,工具是电脑和经验
CRYPTO去魅:
CTF CRYPTO内容:python/sage题干,根据柯克霍夫原则,会给出完整的加密过程,出了密钥以外全公开,求解密钥等(这里不讨论黑盒),要求密码,数论分析能力,python写程序,读程序能力(sage)
for instance:
from hashlib import *
from secrets import randbelow
from ecdsa import SigningKey, SECP160r1, util
leak = 3
total = 61
mask = (1 << leak) - 1
def main():
sk = SigningKey.generate(curve=SECP160r1)
vk = sk.verifying_key
q = SECP160r1.order
print(hex(vk.pubkey.point.x()))
print(hex(vk.pubkey.point.y()))
d = sk.privkey.secret_multiplier
flag = "DesCTF{" + md5(str(d).encode()).hexdigest() + "}"
for i in range(total):
msg = f"msg-{i}".encode()
digest = sha1(msg).digest()
h = int.from_bytes(digest, "big") % q
k = randbelow(q - 1) + 1
sig = sk.sign_digest(digest, sigencode=util.sigencode_string, k=k)
r, s = util.sigdecode_string(sig, q)
print(f"({hex(h)}, {hex(int(r))}, {hex(int(s))}, {hex(k & mask)}),")
if __name__ == "__main__":
main()
#数据暂时省略
以上是一个简单的MT19937预测,原理是逆向随机数产生的MT19937随机数生成器的temper部分得到内部状态流从而预测接下来的输出,基本上可以快速地通过特征识别出题型,解题脚本如下:
#签到题,正常的近似忽略处理,左右爆破
#核心漏洞出现在phi的量级处理上,泄露了n量级接近
#还直接给出了d
#主要的讲解在于offset的区域讨论,量级估计
from hashlib import md5
e = 20285928988408708385825788658664300305494782819689883492429762785687493161646901961627732482030570554944571523044008931416609595056746847083499405860944240804200816473153171825246196297214879750749954991916614158499347588230595409852985660426387332691700171974951765953937059128044510635005259571262430221092123685629379451869171518153057333553882827808279895371867053070597655168641441209936240962391624079704514097507822408340977683148014817264999772615710237278286803551400605422497036878844692741788304043681532328471441465596285604159664321904195632202009921776619257725630740166796422445907541165144233376010917
N = 162318864198120848289602513685294100213662002310524040016141267082602211702801751627271587107738223466644399363879018058536864307889254050305605097781721847474240769410050480646447538698253600786017599233831714710010395996308361674973789283465587010960323042209564459904257042660293061844258544118566558516881
d = Integer(Integer(N)**RR(0.47))
K = e * d - 1
#这里的K是t*phi,可以易得phi得量级接近N**2,仔细计算下来是N**2*(1+2**(-513))
#可以近似处理,直接K//N**2来估算t,根据上面可以得到t在1附近,左右offset10差不多了
k_est = K // (N**2)
k = None
for offset in range(-10, 11):
if K % (k_est + offset) == 0:
k = k_est + offset
break
phi_N = K // k
#接下来是一个S^2 + (N+1)S + (N^2 - N + 1 - phi_N) = 0 得方程,一元二次公式解决
A = 1
B = N + 1
C = N**2 - N + 1 - phi_N
Discriminant = B**2 - 4*A*C
if Discriminant.is_square():
S = (-B + Discriminant.sqrt()) // (2*A)
flag_str = 'flag{' + md5(str(S).encode()).hexdigest() + '}'
print(f"[+] {flag_str}")
else:
print("[-] 求解失败:判别式不是完全平方数。")
出了可以快速识别题型地类别,还有像RSA之类需要积累处理经验特异化地题型,还有misc向的唯密文加密,这类算是押宝了,很难在没有提前认知时做出来
🧅🎗️🪖🙃🦄🍊🍧🪵🎉💩🩱🏪🥡🦺⛳🏦🍙🏟️🎁🦓🎃😇😂🍨🐻🦐🥼🥮🍇🪵🎓🧀😀🏬🎣🏟️🦞🤣🍕🍃👓🤿🧱🌵🦍🏟️🥍🏓🍞🏥🏓😆🥎🏭🐄🍎🥟🥢✨🏸⛲🐏🐶🦀🙂🌿🍄🗽🍄🥥🎋🎳😛🍞😗😃🧉🏟️🧀🍞🌴🍵🕍🩳🥟🎽🐨🍉🏞️🥎🍙🍤😁🏨🔇🙂🥍😛🎣🦝🦐🍵🪴🌿🏢🎿👺🫖🐮👛😛🏭🥎🏘️😘🥭🍟🎳🦁🥮🕶️🍍🐼🏦🥦🎑🐧🎗️🐴⛸️🫑🐵☕🎈🍂🎟️🎩🍉🥭🔇🩲🍔🎆🕋🎑🧨🥦🐮🥝🌰🍵🐨🐴🍞🥠🏛️🎳💄👑🎊🧱🦝🧨🐸👝🦀🐷🎍💄🦪🤡🎟️🔇💎🏭🏑😅📣🐻🩱👾🦊😍🥭🥕🌿🏸⛩️🐶🪨🦐🥒💩🐪👚🍅🧅🍘🏪🐨🐑😇✨🍭🥭👑😗🙂🍡🌲🦍🎈🎿👾🐢👘👹🍥🍊🍵🎿🩲🛕🏩😃🏦🩲🍯🦓🌾🐶😀💄🥭🏅🥲👛🥟😅🧉🪹🐩🐗🍂🏞️😉🎟️😙🧅🦺🥲😘🏯😇🏑🏛️🏰🥕🥑🏗️🏭📣🐊🍟😄😅🏛️🎈🏀🏩🤡🎊😁🍈🏗️🙃😗🎽🐐🩲😗🏪🧀😉👾🎑💎🥝🏒😘🥮🍭🎈🍦🐮🐑🫖😘🍞🐷🥑🏩🐗🗼😉🏪🦬🍞🍞🥰🌳🍞🎟️🐏🦺🐨🪴📣🧉😃🌾⛑️🧉⛸️🐻😅🍊🍼🏘️😗💄🤿🥝🎳🌳🍵⛲🍟😉🍌🦀💒🐸🏅🏀🐊🪹😈😇🦍🌿🎃📯🙃🐄🍑🦐🎟️🎃🤠🙃🙃😛🌿😈🐴🐧🏰🎉🍉💒😄⛳🫘🎏🙃🥟🍨🍎🍞🍍🎏🐑🍕🍀🥮🎗️⚽🎩🐸🍋🐏👺🌁🍧🐽🧅🥑🕌⛲🐢🐻🎃🫒🤣🍌🗼💒🐂⛪🍞👻😘🥏🐏🦍🍑😋🥽🤠🍕🦑🍄🥤🧅🥭🥏🎗️🥡🥊😙🎑😍👺🍵🍉🐻😘🍃🐲🙃🦞🐼🤩🐽🥬🔇🗼🏘️⛸️🐑🎋🍈🐗😋🍌🏭😇🍀🍯🍧🎐🍧🐑🎣
#只截取了一部分作为参考
以上是一道EMOJI-AES的唯密文破译,有信息0x4A,后者大概率是密钥用来破解密文,但是在没有基础时,很难联想到EMOJI-AES,并且这道题要求破解3次,启发我们要敢于尝试(在像格的题型,RSA的题型,爆破的范围在数学支持下鼓励反复调教)
CRYPTO个人学习路径
我上手时0代码基础,电脑认知勉强>=steam游戏管家,现在对密码有了最浅的了解,分享我的来的坑坑洼洼,以便后面的学子参考

- 下列步骤具有先后性
- 1.建立基础的认知:自学python语法到一般水平,后面见一个学一个,学习适量的信息安全数学基础,以便RSA理解,ECC理解
- 2.从古典密码,base编码等入手,学会基础的hash爆破(建立爆破思维)
- 3.了解最基础的RSA,掌握其经典处理
- 4.在做题中逐步接触到简单的ECB,ECC,随机数,格,建立自己的理解体系
- 5.CTF的比赛是无穷的,走得多块只取决于脚步
- #基础,多复现,代码落实到手,别养成AI依赖,对于模板不熟悉的题,让AI只负责写脚本,但思路一定要是自己给的