随波逐流工作室—-探索前沿科技,分享最新软件。点击标题下蓝字“长弓三皮”关注,我们将为您提供有深度、有价值、有意思的阅读。
朋友们,现在只对常读和星标的公众号才展示大图推送,建议大家把长弓三皮“设为星标”,否则可能就看不到了啦!
作者:随波逐流
生活如梦,我愿随风起,随波流,享受每一刻的自在与轻盈。
2024年第四届 “网鼎杯” 网络安全大赛青龙组初赛有一道密码题目:Crypto-2,是一道AES加密题,本人数学不行,对于这种数学题目,我一向看到就头痛,一般是见了就跳过的,不过,现在有了AI,解题就不那么难了。偷偷用AI解决一下。
还是先让AI给这篇文章取个标题吧
再让AI画个封面
惊不惊喜,意不意外
言归正传
# coding: utf-8#!/usr/bin/env python2import gmpy2import randomimport binasciifrom hashlib import sha256from sympy import nextprimefrom Crypto.Cipher import AESfrom Crypto.Util.Padding import padfrom Crypto.Util.number import long_to_bytesfrom FLAG import flag#flag = 'wdflag{123}'def victory_encrypt(plaintext, key):key = key.upper()key_length = len(key)plaintext = plaintext.upper()ciphertext = ''for i, char in enumerate(plaintext):if char.isalpha():shift = ord(key[i % key_length]) - ord('A')encrypted_char = chr((ord(char) - ord('A') + shift) % 26 + ord('A'))ciphertext += encrypted_charelse:ciphertext += charreturn ciphertextvictory_key = "WANGDINGCUP"victory_encrypted_flag = victory_encrypt(flag, victory_key)p = 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2fa = 0b = 7xG = 0x79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798yG = 0x483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8G = (xG, yG)n = 0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141h = 1zero = (0,0)dA = nextprime(random.randint(0, n))if dA > n:print("warning!!")def addition(t1, t2):if t1 == zero:return t2if t2 == zero:return t2n1) = t1n2) = t2if m1 == m2:if n1 == 0 or n1 != n2:return zeroelse:k = (3 * m1 * m1 + a) % p * gmpy2.invert(2 * n1 , p) % pelse:k = (n2 - n1 + p) % p * gmpy2.invert((m2 - m1 + p) % p, p) % pm3 = (k * k % p - m1 - m2 + p * 2) % pn3 = (k * (m1 - m3) % p - n1 + p) % preturn (int(m3),int(n3))def multiplication(x, k):ans = zerot = 1<= k):if (k &t )>0:ans = addition(ans, x)x = addition(x, x)t <<= 1return ansdef getrs(z, k):yp) = Pr = xps = (z + r * dA % n) % n * gmpy2.invert(k, n) % nreturn r,sz1 = random.randint(0, p)z2 = random.randint(0, p)k = random.randint(0, n)P = multiplication(G, k)hA = multiplication(G, dA)s1 = getrs(z1, k)s2 = getrs(z2, k)= {}".format(r1))= {}".format(r2))= {}".format(s1))= {}".format(s2))= {}".format(z1))= {}".format(z2))key = sha256(long_to_bytes(dA)).digest()cipher = AES.new(key, AES.MODE_CBC)iv = cipher.ivencrypted_flag = cipher.encrypt(pad(victory_encrypted_flag.encode(), AES.block_size))encrypted_flag_hex = binascii.hexlify(iv + encrypted_flag).decode('utf-8')flag (AES in CBC mode, hex):", encrypted_flag_hex)# output# r1 = 80932673752923845218731053671144903633094494351596082125742241568755353762809# r2 = 80932673752923845218731053671144903633094494351596082125742241568755353762809# s1 = 11239004842544045364097722042148768449026688243093666008376082303522447245154# s2 = 97301123368608673469588981075767011435222146576812290449372049839046298462487# z1 = 84483328065344511722319723339101492661376118616972408250436525496870397932079# z2 = 114907157406602520059145833917511615616817014350278499032611638874752053304591# ('Encrypted flag (AES in CBC mode, hex):', u'd8851c55edec1114a6d7a4d6d5efbba4611a39216ec146d2e675194dd0d5f768bee1b09799a133ffda1d283c4f6db475834cbe52c38c88736c94795c137490be')
让AI解题,需要写一段提问语,如下:
(题目给出的代码内容,此处省略)
上面是一道CTF比赛题目,求取flag的值,需要分几步?请提供每一步需要的python代码。回答问题和代码注释均使用中文。
chatgpt(免费版)的回答如下:
加上已知参数,运行给出的代码结果
答案出来了,哇塞,简直绝绝子!
完整代码可见:
《》
宝子们,是不是又解锁了一种作弊新技能,希望出题老师不要打我
-------------------------------------------------------------------
再来测试一下国内的AI
一、豆包
颜色看着就比较舒服,运行一下
只出了一部分flag,估计是没有考虑到填充,提示给它,给我回了一个完整代码
import gmpy2from sympy import nextprimefrom Crypto.Cipher import AESfrom Crypto.Util.Padding import unpadfrom Crypto.Util.number import long_to_bytesfrom hashlib import sha256import binascii# 题目中给出的椭圆曲线参数和已知值p = 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2fa = 0b = 7xG = 0x79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798yG = 0x483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8G = (xG, yG)n = 0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141h = 1zero = (0, 0)# 题目给出的签名和相关随机值r1 = 80932673752923845218731053671144903633094494351596082125742241568755353762809r2 = 80932673752923845218731053671144903633094494351596082125742241568755353762809s1 = 11239004842544045364097722042148768449026688243093666008376082303522447245154s2 = 97301123368608673469588981075767011435222146576812290449372049839046298462487z1 = 84483328065344511722319723339101492661376118616972408250436525496870397932079z2 = 114907157406602520059145833917511615616817014350278499032611638874752053304591# 计算s1的逆元s1_inv = gmpy2.invert(s1, n)# 计算s2的逆元s2_inv = gmpy2.invert(s2, n)# 根据ECDSA签名原理构建关于dA的方程并求解# 由s1_inv * (z1 + r1 * dA) % n = k 和 s2_inv * (z2 + r2 * dA) % n = k# 可得:s1_inv * (z1 + r1 * dA) % n = s2_inv * (z2 + r2 * dA) % n# 进一步推导得到关于dA的方程left_side = (s1_inv * z1 - s2_inv * z2) % nright_side = (s2_inv * r2 - s1_inv * r1) % ndA = (left_side * gmpy2.invert(right_side, n)) % n# 题目中给出的加密后的flag(十六进制形式)encrypted_flag_hex = 'd8851c55edec1114a6d7a4d6d5efbba4611a39216ec146d2e675194dd0d5f768bee1b09799a133ffda1d283c4f6db475834cbe52c38c88736c94795c137490be'encrypted_flag = binascii.unhexlify(encrypted_flag_hex)# 利用恢复的私钥dA生成AES加密密钥key = sha256(long_to_bytes(dA)).digest()# 创建AES解密对象,注意这里需要从加密数据中提取出初始向量(iv)iv = encrypted_flag[:16]cipher = AES.new(key, AES.MODE_CBC, iv=iv)# 解密得到经过victory_encrypt函数处理后的flag,并进行去填充操作decrypted_victory_encrypted_flag = unpad(cipher.decrypt(encrypted_flag[16:]), AES.block_size)# 此时得到的是经过victory_encrypt函数处理后的flag,需要逆向该函数处理得到原始flagvictory_key = "WANGDINGCUP"def victory_decrypt(ciphertext, key):key = key.upper()key_length = len(key)ciphertext = ciphertext.upper()plaintext = ''for i, char in enumerate(ciphertext):if char.isalpha():shift = ord(key[i % key_length]) - ord('A')decrypted_char = chr((ord(char) - ord('A') - shift + 26) % 26 + ord('A'))plaintext += decrypted_charelse:plaintext += charreturn plaintext# 逆向victory_encrypt函数得到原始flagflag = victory_decrypt(decrypted_victory_encrypted_flag.decode('utf-8'), victory_key)print("原始flag:", flag)
超级给力啊,此处应有掌声
二、百度文心一言3.5
(文心一言没有分步,一次给出全部代码 ,代码太长,只截取一部分)
说了一堆原理,给出的代码一看就不正确,看蓝色部分,它还假设了一个不存在的hypothetical_aes_key,很明显抄网上现成的代码。初略看了下,基本无法用,将代码放到PyCharm中,运行一下,果然报了一堆错误,放弃。
三、Kimi
省略。。。。
不知道为什么给出的是python2代码,看着还可以,运行一下报错,继续提交报错信息修改,修改了3次能正常运行了,但仍然无法得出正确答案,放弃
四、智谱清言GLM-4
运行后报错,提交错误信息3次,仍然无法运行,放弃
五、360智脑
360宣传说是集合多家AI,上面好像查询了6个,但给出的代码看着就好像不对,先运行一下再说吧。居然没有复制按钮,差评。
运行代码都没有导入库,晕死大部分库都没有导入,手动加入,运行报错,提交报错信息给360
提交了3次,居然出现这个,我也是醉了
六、讯飞星火
讯飞分步给了代码 ,最后还给出完整代码(太长就不截图了),这点很赞
但运行报错,提交错误信息修改3次后仍然报错,放弃
还要发吐槽一点,提交错误信息后,回复信息居然是英文
七、通义千问2.5
不得不说,通义的代码看着是最舒服的,所有库导入正确,颜色分类显示,代码十分规范。可惜提交报错信息几次后,仍然不能得出正确答案,放弃。
公众号内回复 writeup 或 flag 下载公众号文章
分享一个免费的智能编程助手,用AI助力编码
https://www.marscode.cn/events/s/iSJa9t3J/
你若喜欢,为“长弓三皮”点个在看哦
推荐站内搜索:最好用的开发软件、免费开源系统、渗透测试工具云盘下载、最新渗透测试资料、最新黑客工具下载……




还没有评论,来说两句吧...