随波逐流工作室—-探索前沿科技,分享最新软件。点击标题下蓝字“长弓三皮”关注,我们将为您提供有深度、有价值、有意思的阅读。
朋友们,现在只对常读和星标的公众号才展示大图推送,建议大家把长弓三皮“设为星标”,否则可能就看不到了啦!
作者:随波逐流
生活如梦,我愿随风起,随波流,享受每一刻的自在与轻盈。
2024年第四届 “网鼎杯” 网络安全大赛青龙组初赛有一道密码题目:Crypto-2,是一道AES加密题,本人数学不行,对于这种数学题目,我一向看到就头痛,一般是见了就跳过的,不过,现在有了AI,解题就不那么难了。偷偷用AI解决一下。
还是先让AI给这篇文章取个标题吧
再让AI画个封面
惊不惊喜,意不意外
言归正传
# coding: utf-8
#!/usr/bin/env python2
import gmpy2
import random
import binascii
from hashlib import sha256
from sympy import nextprime
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad
from Crypto.Util.number import long_to_bytes
from 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_char
else:
ciphertext += char
return ciphertext
victory_key = "WANGDINGCUP"
victory_encrypted_flag = victory_encrypt(flag, victory_key)
p = 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f
a = 0
b = 7
xG = 0x79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798
yG = 0x483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8
G = (xG, yG)
n = 0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141
h = 1
zero = (0,0)
dA = nextprime(random.randint(0, n))
if dA > n:
print("warning!!")
def addition(t1, t2):
if t1 == zero:
return t2
if t2 == zero:
return t2
n1) = t1
n2) = t2
if m1 == m2:
if n1 == 0 or n1 != n2:
return zero
else:
k = (3 * m1 * m1 + a) % p * gmpy2.invert(2 * n1 , p) % p
else:
k = (n2 - n1 + p) % p * gmpy2.invert((m2 - m1 + p) % p, p) % p
m3 = (k * k % p - m1 - m2 + p * 2) % p
n3 = (k * (m1 - m3) % p - n1 + p) % p
return (int(m3),int(n3))
def multiplication(x, k):
ans = zero
t = 1
<= k):
if (k &t )>0:
ans = addition(ans, x)
x = addition(x, x)
t <<= 1
return ans
def getrs(z, k):
yp) = P
r = xp
s = (z + r * dA % n) % n * gmpy2.invert(k, n) % n
return r,s
z1 = 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.iv
encrypted_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 gmpy2
from sympy import nextprime
from Crypto.Cipher import AES
from Crypto.Util.Padding import unpad
from Crypto.Util.number import long_to_bytes
from hashlib import sha256
import binascii
# 题目中给出的椭圆曲线参数和已知值
p = 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f
a = 0
b = 7
xG = 0x79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798
yG = 0x483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8
G = (xG, yG)
n = 0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141
h = 1
zero = (0, 0)
# 题目给出的签名和相关随机值
r1 = 80932673752923845218731053671144903633094494351596082125742241568755353762809
r2 = 80932673752923845218731053671144903633094494351596082125742241568755353762809
s1 = 11239004842544045364097722042148768449026688243093666008376082303522447245154
s2 = 97301123368608673469588981075767011435222146576812290449372049839046298462487
z1 = 84483328065344511722319723339101492661376118616972408250436525496870397932079
z2 = 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) % n
right_side = (s2_inv * r2 - s1_inv * r1) % n
dA = (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,需要逆向该函数处理得到原始flag
victory_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_char
else:
plaintext += char
return plaintext
# 逆向victory_encrypt函数得到原始flag
flag = 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/
你若喜欢,为“长弓三皮”点个在看哦
推荐站内搜索:最好用的开发软件、免费开源系统、渗透测试工具云盘下载、最新渗透测试资料、最新黑客工具下载……
还没有评论,来说两句吧...