第三届“数信杯”数据安全大赛wp之数据恢复
第三届“数信杯”数据安全大赛wp之数据恢复缘起先说实话这道题比赛时没做出来RSA题目一直是我的软肋一般我都是放到最后去碰运气这道题也是我第一次遇到想借这次机会好好学习一下。这里有2个基本概念或者说工具、理论必须先有点认识SageMath 是一个强大的开源数学软件系统支持复杂的数学运算和符号处理Coppersmith攻击 RSA密码分析中一种基于格理论的强大方法此处省略一万字……不过需要记住他适用场景当p和q位数相近的时候他能恢复未知低位具体来说a、1024位RSA可恢复约256位未知低位b、2048位RSA可恢复约512位未知低位题目某公司截获到密钥文件以及脱敏后的文件发现密钥文件中的参数存在异常情况结合密钥文件提供分析发现可能采用变异RSA算法针对重要文件进行脱敏处理。请结合提供附件内容进行分析并脱敏恢复找到PhoneNumber为17962732783对应的id、IndentificationCard、BankCard并以_进行连接并提交。如id为1IndentificationCard为2345BankCard为6789最终提交1_2345_6789。题目附件我放在了网盘https://cloud.189.cn/t/feMNZbi2qiqa访问码cai0里面有2个文件思路先看看这个所谓的损坏的密钥什么样openssl pkey-inkey_pri.pem-text输出结果分析一下这个输出一眼而知的n已知1024bite已知道65537 (0x10001)然后把p和q拷贝出来删除冒号后比较一下可以看到q有512bit根据n为1024bit分析可知p应该也是512bit但是看起来少了16bit这个应该是高位p的尾巴的0是丢失的部分应该是有48位低位未知。总结为3-1. p为512bit3-2. p的高16bit未知3-3. p的中间448bit已知3-4. p的低位48bit未知根据Coppersmith攻击的条件512位只有低位48位未知是可以利用的至于高位的16bit可以循环爆破了。先上代码:#SagenInteger(0xa37afdb7661804f4719e095d4f1717f531cb380155f4929da65c8a449165edad0fc9c2db2ad7bd924251f1694100c10f9bb4fedd37bf6a6b4bf410cad1b15eb6a3b1015b0b3bbbae6d4e4ed914d9721f9cc8c8640afb3a35bc30b16194d0cc4e7107e4cea6526fe17aa06bdbc9fb1e6d47fe5902005136d9b705c784d2011db9)p_knownInteger(0x9d025160d56d4971363f3cf2ce7e3e96215c50bf50d0cc606f5645de7ec113d16d931383e649bc2c7328499d219e2982b726ae41c5370aa8)pbits512# p的位数hbits16# 未知16位高位lbits48# 未知48位低位# Coppersmith攻击PR.lpPolynomialRing(Zmod(n))forhpinrange(1hbits,1,-1):# 给点动静输出爆破的进度ifhp%10000:print(hp, of ,1hbits)test_p(Integer(hp)(512-16))(p_known48)lp# X2^50指定根的上界即 lp 的最大可能值这里设为 2^50略大于 48 位的 2^48覆盖所有可能的低位值# beta0.45格基约减的参数经验值beta 越小格约减越严格成功率越高但速度越慢通常取 0.4~0.5rootstest_p.small_roots(X2^50,beta0.45)ifroots:p(Integer(hp)(512-16))(p_known48)Integer(roots[0])qn//pprint( 成功 !!! )print(fn:{n})print(fp:{p})print(fq:{q})break先跑一下看结果再来做个简单的解释1 hbits就是1 16就是2的16次方这是处理2进制数据的习惯用位移来表示更易懂PR. PolynomialRing(Zmod(n))Zmod(n)模 n 的整数环即所有整数对 n 取模后的集合。 PolynomialRing(Zmod(n))在模 n 的整数环上构造多项式环。 PR.lp给多项式环命名为PR并指定不定元为lplow part代表 p 的未知低位。 作用为后续构造 “以 p 的未知低位为根的多项式” 做准备。这部分涉及到一些数学的知识三言两语也说不清记住Coppersmith攻击的适用条件和使用方法就够啦题目中“变异RSA算法”这里补充一点rsa的基础知识RSA 原生算法不安全必须给明文加一段随机数据这个过程叫填充。不加填充 容易被破解加填充 安全PKCS#1 和 OAEP 就是两种最主流的填充标准。俩填充的区别PKCS#1 v1.5老版本、简单、兼容性好、有安全风险OAEP新版本、复杂、更安全、现代标准推荐上关键代码# 构建私钥defbuild_rsa_key():fromCrypto.PublicKeyimportRSA phi(p-1)*(q-1)dpow(e,-1,phi)keyRSA.construct((n,e,d,p,q))returnkey# 使用oaep填充解密defdecrypt_oaep(key,ct:bytes)-Optional[Tuple[bytes,str]]:fromCrypto.CipherimportPKCS1_OAEPfromCrypto.HashimportSHA1,SHA256#先猜2个forname,Hin((SHA1,SHA1),(SHA256,SHA256)):try:cipherPKCS1_OAEP.new(key,hashAlgoH)ptcipher.decrypt(ct)returnpt,nameexceptException:continuereturnNone不用怀疑这2个方法是这么来的剩下的就是读取csv文件解密而已keybuild_rsa_key()withopen(encrypted_users.csv,r,encodingutf-8)asf:readercsv.reader(f)next(reader)forrow_num,rowinenumerate(reader,start2):pt,algdecrypt_oaep(key,base64.b64decode(row[2].strip()))#PhoneNumberifptb17962732783:#找到这个手机号再解密其他信息pt1,alg1decrypt_oaep(key,base64.b64decode(row[3].strip()))# IndentificationCardpt2,alg2decrypt_oaep(key,base64.b64decode(row[4].strip()))# BankCardprint(fid{row[0]}name{row[1]}PhoneNumber{pt},IndentificationCard:{pt1},BankCard:{pt2})break;看一下执行结果万事大吉补充知识这里还要再补充一点关于sagemath如果不想安装可以使用官方的docker镜像我使用的就是dockerrun-d-p8888:8888--namesage sagemath/sagemath:latest sage-jupyter小结RSA题目始终是自己的软肋鼓起勇气一题一题的积累等再积累一些就可以去学一下RSA的基础理论数学知识以期可以举一反三。欢迎关注第三届“数信杯”数据安全大赛wp之数据恢复
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2477394.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!