[CISCN 2018]sm

2024-05-05 15:12
文章标签 2018 ciscn sm

本文主要是介绍[CISCN 2018]sm,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

1.题目

3.解题

4.参考


1.题目

题目链接

from Crypto.Util.number import getPrime,long_to_bytes,bytes_to_long
from Crypto.Cipher import AES
import hashlib
from random import randint
def gen512num():order=[]while len(order)!=512:tmp=randint(1,512)if tmp not in order:order.append(tmp)ps=[]for i in range(512):p=getPrime(512-order[i]+10)pre=bin(p)[2:][0:(512-order[i])]+"1"ps.append(int(pre+"0"*(512-len(pre)),2))return psdef run():choose=getPrime(512)ps=gen512num()print "gen over"bchoose=bin(choose)[2:]r=0bchoose = "0"*(512-len(bchoose))+bchoosefor i in range(512):if bchoose[i]=='1':r=r^ps[i]flag=open("flag","r").read()key=long_to_bytes(int(hashlib.md5(long_to_bytes(choose)).hexdigest(),16))aes_obj = AES.new(key, AES.MODE_ECB)ef=aes_obj.encrypt(flag).encode("base64")open("r", "w").write(str(r))open("ef","w").write(ef)gg=""for p in ps:gg+=str(p)+"\n"open("ps","w").write(gg)run()

附件:ef、ps、r

2.分析

from Crypto.Util.number import getPrime,long_to_bytes,bytes_to_long
from Crypto.Cipher import AES
import hashlib
from random import randint
def gen512num():order=[]while len(order)!=512:tmp=randint(1,512)if tmp not in order:order.append(tmp)#产生1~512的序列ps=[]for i in range(512):p=getPrime(512-order[i]+10)#根据order获得一个对应的素数pre=bin(p)[2:][0:(512-order[i])]+"1"#取素数的前512-order[i]位,加1之后就能够明确保证每一位的最后一个1的位置ps.append(int(pre+"0"*(512-len(pre)),2))#剩余位置(512-)补0#加到集合中去return psdef run():choose=getPrime(512)#获取一个512位的随机素数来作为chooseps=gen512num()#得到对应的序列了print "gen over"#完成准备bchoose=bin(choose)[2:]#获取2进制版本数r=0bchoose = "0"*(512-len(bchoose))+bchoose#bchoose前面完全补充0,共512位for i in range(512):if bchoose[i]=='1':r=r^ps[i]#根据choose来确定r是否与ps[i]异或flag=open("flag","r").read()#读取flag信息key=long_to_bytes(int(hashlib.md5(long_to_bytes(choose)).hexdigest(),16))#choose,哪个随机素数被转化为bytes后又被转化为MD5,又被按照16进制转化为了整数,然后又转化为了bytesaes_obj = AES.new(key, AES.MODE_ECB)#获取aes加密对象ef=aes_obj.encrypt(flag).encode("base64")#ef里储存flagopen("r", "w").write(str(r))open("ef","w").write(ef)#输出efgg=""for p in ps:gg+=str(p)+"\n"open("ps","w").write(gg)#ps是被完全输出
run()

题目把ps全部给了,r是最终异或的结果,那么我们的问题就是根据r和ps把choose求出,然后利用内置的AES加密方式进行解密即可,解密方法有两种,一种是根据代码寻找突破口进行解密,一种是使用sage进行矩阵解密

3.解题

第一种:

我们注意gen512num函数:

order=[]while len(order)!=512:tmp=randint(1,512)if tmp not in order:order.append(tmp)#产生1~512的序列ps=[]for i in range(512):p=getPrime(512-order[i]+10)#根据order获得一个对应的素数pre=bin(p)[2:][0:(512-order[i])]+"1"#取素数的前512-order[i]位,加1之后就能够明确保证每一位的最后一个1的位置ps.append(int(pre+"0"*(512-len(pre)),2))#剩余位置(512-)补0#加到集合中去return ps

所以得到的ps必然是一个末尾0的个数分别是0~511的数组,说明ps中每一个数的最后一个1的位置都不一样

还原choose:

上面这个特性可以帮助顺利我们反推choose,举例来说,假如最后一个值1为1,则它必定是来自最后一个1的位置相同的那个数,我们将目前的数异或上对应的ps数,就能够消除这个数对前面的数的影响了,然后就能够让对choose的求解推进一位

求解代码如下:

f = open("...", 'r')
ps = f.readlines()
psn = []
pos = []
for i in ps:psn.append(int(i))t1 = int(i)t2 = 0while(t1 % 2 == 0):t1 >>= 1t2 += 1pos.append(512 - t2)
r = 6753785483255906709117615805253027649453460653974415214642466102672301763943358839905575042938258141827000621474498066533397472809407687579125519939754658
m = list('0' * 512)
for i in range(511, -1, -1):if ((r >> (511 - i)) % 2 == 1):r ^= psn[pos.index(i + 1)]#找到对应的那个进行异或的位置m[pos.index(i + 1)] = '1'#置为1
choose = int(''.join(m), 2)

然后进行AES求解:

from Crypto.Util.number import getPrime,long_to_bytes,bytes_to_long
from Crypto.Cipher import AES
import hashlib
from random import randint
import base64key=long_to_bytes(int(hashlib.md5(long_to_bytes(choose)).hexdigest(),16))f2 = open("...", 'r')
c = f2.read()
c = base64.b64decode(c)
aes = AES.new(key, AES.MODE_ECB)
flag = aes.decrypt(c)
print(flag)#b'flag{shemir_alotof_in_wctf_fun!}'

第二种,使用sage进行求解:

原问题可以看作:

A\cdot B = C

A代表choose,B代表ps中的512个数,C是代表最终给出的r,即异或结果

sage中模2意义的加能够满足异或运算的要求,自己动动笔应该能发现

故我们可以使用以下的方程来求解:

A=C\cdot B^{-1}

这个问题在sage中是十分易求的

代码如下:

#please run in sagemathfrom Crypto.Util.number import *
from Crypto.Cipher import AES
import hashlib
import base64ps = open("...",'r').readlines()
c = []
for i in ps:c.append(int(i.strip()))
A=[]
for i in c:A.append([int(x) for x in bin(i)[2:].zfill(512)])
r = 6753785483255906709117615805253027649453460653974415214642466102672301763943358839905575042938258141827000621474498066533397472809407687579125519939754658
B = [int(x) for x in bin(r)[2:].zfill(512)]
A = matrix(GF(2),A)
B = matrix(GF(2),B)
key = B*A.inverse()
li = []
for i in key[0]:li.append(bin(i)[2:])
choose = int(''.join(li), 2)
k=long_to_bytes(int(hashlib.md5(long_to_bytes(choose)).hexdigest(),16))
aes=AES.new(k,AES.MODE_ECB)
flag_enc='5eFo3ANg2fu9LRrFktWCJmVvx6RgBFzd0R8GXQ8JD78='flag_enc=base64.b64decode(flag_enc)
flag=aes.decrypt(flag_enc)
print(flag)

4.参考

文章1

文章2

这篇关于[CISCN 2018]sm的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/962002

相关文章

BUUCTF靶场[web][极客大挑战 2019]Http、[HCTF 2018]admin

目录   [web][极客大挑战 2019]Http 考点:Referer协议、UA协议、X-Forwarded-For协议 [web][HCTF 2018]admin 考点:弱密码字典爆破 四种方法:   [web][极客大挑战 2019]Http 考点:Referer协议、UA协议、X-Forwarded-For协议 访问环境 老规矩,我们先查看源代码

2018秋招C/C++面试题总结

博主从8月中旬开始大大小小面试了十几家公司,至今也许是告一段落吧,希望后面会有好结果,因此总结记录一些C/C++方向常见的问题。和大家一起学习! 参考了互联网的各种资源,自己尝试归类整理,谢谢~ 一、C和C++的区别是什么? C是面向过程的语言,C++是在C语言的基础上开发的一种面向对象编程语言,应用广泛。 C中函数不能进行重载,C++函数可以重载 C++在C的基础上增添类,C是一个结构

大厂算法例题解之网易2018秋招笔试真题 (未完)

1、字符串碎片 【题目描述】一个由小写字母组成的字符串可以看成一些同一字母的最大碎片组成的。例如,“aaabbaaac” 是由下面碎片组成的:‘aaa’,‘bb’,‘c’。牛牛现在给定一个字符串,请你帮助计算这个字符串的所有碎片的 平均长度是多少。 输入描述: 输入包括一个字符串 s,字符串 s 的长度 length(1 ≤ length ≤ 50),s 只含小写字母(‘a’-‘z’) 输出描述

vulhub GhostScript 沙箱绕过(CVE-2018-16509)

1.执行以下命令启动靶场环境并在浏览器访问 cd vulhub/ghostscript/CVE-2018-16509 #进入漏洞环境所在目录   docker-compose up -d #启动靶场   docker ps #查看容器信息 2.访问网页 3.下载包含payload的png文件 vulhub/ghostscript/CVE-2018-16509/poc.png at

Python JAVA接口UTC 时间 '2018-08-06T10:00:00.000Z' 格式转化为本地时间

Python JAVA接口UTC 时间 '2018-08-06T10:00:00.000Z' 格式转化为本地时间 方法1 import datetimeorigin_date_str= "2019-07-26T08:20:54Z"utc_date = datetime.datetime.strptime(origin_date_str, "%Y-%m-%dT%H:%M:%SZ")loca

【js逆向专题】9.SM国密系列

本教程仅供学习交流使用,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,请各位自觉遵守相关法律法规。 目录 一.算法简介1.1 算法分类1.1.1 `SM2` 椭圆曲线公钥加密算法1.1.2` SM4 `分组加密算法 二.算法实现1. JavaScript实现1. `SM2`2. `sm3`3. `sm4` 2`python`实现1. `sm2`2.`sm3`3. `s

2018年年终体会~

说下最近的一件事情:2018年12月08日华为云培训云原生课程,我坚持了两周,中间休假了,回来就忘记了。错过了一天的打开。这次21天的云原生课程彻底失败。反思后,不是我不想学习,也不是我没有毅力,而是人总是容器在平凡中失去自己,失去自己的目标,就像《千与千寻》中一样,慢慢的生活磨砺自己,慢慢的平淡消耗你自己,你自己都忘记了,自己是为了什么,每年都会给自己立flag,可是很难坚持下去,就

【SM系列】简单说说SM2,SM3,SM4加密算法

希望文章能给到你启发和灵感~ 如果觉得文章对你有帮助的话,点赞 + 关注+ 收藏 支持一下博主吧~ 阅读指南 开篇说明一、基础环境说明1.1 硬件环境1.2 软件环境 二、什么是SM2加密?2.1 应用场景2.2 与RSA算法的区别 三、什么是SM3加密?3.1 应用场景 四、什么是SM4加密?4.1 应用场景 五、最后 开篇说明 之前我们说过了几种常见加密算法,今天我

2018Java高级工程师面试总结

2018Java高级工程师面试总结 java高级 2018-10-11 15:11:42 面试的岗位是Java后台开发,面的公司不多,主要有美团点评-网易-网易有道-携程-华为-中兴-科大讯飞-烽火通信这些公司。从前到后简单记录了自己面试时候遇到的问题,以及对面试给了一点点小的建议,给明年甚至以后的师弟师妹们一些参考。欢迎各位朋友一起交流。 关注我:私信回复“架构资料”获取往期Java高级架

NLP-预训练模型-2018:Bert字典

参考资料: 我的BERT!改改字典,让BERT安全提速不掉分(已开源)