看到加密脚本,基本上是看不懂的,大概率是进行了替换加密,利用在线网站进行词频分析:quipqiup - cryptoquip and cryptogram solver

大部分是能看懂了,但还是有一些错误,手动改完得到:

from gmpy2 import is_prime
from os import urandom
import base64def bytes_to_num(b):return int(b.encode('zeh'), 16)def num_to_bytes(n):b = hex(n)[2:-1]b = '0' + b if len(b)%2 == 1 else breturn b.decode('hex')def get_a_prime(l):random_seed = urandom(l)num = bytes_to_num(random_seed)while True:if is_prime(num):breaknum+=1return numdef encrypt(s, e, n):p = bytes_to_num(s)p = pow(p, e, n)return num_to_bytes(p).encode('hex')def separate(n):p = n % 4t = (p*p) % 4return t == 1
f = open('flag.txt', 'r')
flag = f.read()
msg1 = ""
msg2 = ""
for i in range(len(flag)):if separate(i):msg2 += flag[i]else:msg1 += flag[i]
p1 = get_a_prime(128)
p2 = get_a_prime(128)
p3 = get_a_prime(128)
n1 = p1*p2
n2 = p1*p3
e = 0x1001
c1 = encrypt(msg1, e, n1)
c2 = encrypt(msg2, e, n2)
print(c1)
print(c2)
e1 = 0x1001
e2 = 0x101
p4 = get_a_prime(128)
p5 = get_a_prime(128)
n3 = p4*p5
c1 = num_to_bytes(pow(n1, e1, n3)).encode('hex')
c2 = num_to_bytes(pow(n1, e2, n3)).encode('hex')
print(c1)
print(c2)
print(base64.b64encode(num_to_bytes(n2)))
print(base64.b64encode(num_to_bytes(n3)))

再结合其它文件,可以得到以下条件:

e = 0x1001
e1 = 0x1001
e2 = 0x101
c1 = 0x1240198b148089290e375b999569f0d53c32d356b2e95f5acee070f016b3bef243d0b5e46d9ad7aa7dfe2f21bda920d0ac7ce7b1e48f22b2de410c6f391ce7c4347c65ffc9704ecb3068005e9f35cbbb7b27e0f7a18f4f42ae572d77aaa3ee189418d6a07bab7d93beaa365c98349d8599eb68d21313795f380f05f5b3dfdc6272635ede1f83d308c0fdb2baf444b9ee138132d0d532c3c7e60efb25b9bf9cb62dba9833aa3706344229bd6045f0877661a073b6deef2763452d0ad7ab3404ba494b93fd6dfdf4c28e4fe83a72884a99ddf15ca030ace978f2da87b79b4f504f1d15b5b96c654f6cd5179b72ed5f84d3a16a8f0d5bf6774e7fd98d27bf3c9839
c2 = 0x129d5d4ab3f9e8017d4e6761702467bbeb1b884b6c4f8ff397d078a8c41186a3d52977fa2307d5b6a0ad01fedfc3ba7b70f776ba3790a43444fb954e5afd64b1a3abeb6507cf70a5eb44678a886adf81cb4848a35afb4db7cd7818f566c7e6e2911f5ababdbdd2d4ff9825827e58d48d5466e021a64599b3e867840c07e29582961f81643df07f678a61a9f9027ebd34094e272dfbdc4619fa0ac60f0189af785df77e7ec784e086cf692a7bf7113a7fb8446a65efa8b431c6f72c14bcfa49c9b491fb1d87f2570059e0f13166a85bb555b40549f45f04bc5dbd09d8b858a5382be6497d88197ffb86381085756365bd757ec3cdfa8a77ba1728ec2de596c5ab
c1_1 = 0x2639c28e3609a4a8c953cca9c326e8e062756305ae8aee6efcd346458aade3ee8c2106ab9dfe5f470804f366af738aa493fd2dc26cb249a922e121287f3eddec0ed8dea89747dc57aed7cd2089d75c23a69bf601f490a64f73f6a583081ae3a7ed52238c13a95d3322065adba9053ee5b12f1de1873dbad9fbf4a50a2f58088df0fddfe2ed8ca1118c81268c8c0fd5572494276f4e48b5eb424f116e6f5e9d66da1b6b3a8f102539b690c1636e82906a46f3c5434d5b04ed7938861f8d453908970eccef07bf13f723d6fdd26a61be8b9462d0ddfbedc91886df194ea022e56c1780aa6c76b9f1c7d5ea743dc75cec3c805324e90ea577fa396a1effdafa3090
c2_2 = 0x42ff1157363d9cd10da64eb4382b6457ebb740dbef40ade9b24a174d0145adaa0115d86aa2fc2a41257f2b62486eaebb655925dac78dd8d13ab405aef5b8b8f9830094c712193500db49fb801e1368c73f88f6d8533c99c8e7259f8b9d1c926c47215ed327114f235ba8c873af7a0052aa2d32c52880db55c5615e5a1793b690c37efdd5e503f717bb8de716303e4d6c4116f62d81be852c5d36ef282a958d8c82cf3b458dcc8191dcc7b490f227d1562b1d57fbcf7bf4b78a5d90cd385fd79c8ca4688e7d62b3204aeaf9692ba4d4e44875eaa63642775846434f9ce51d138ca702d907849823b1e86896e4ea6223f93fae68b026cfe5fa5a665569a9e3948a
n2 = 'PVNHb2BfGAnmxLrbKhgsYXRwWIL9eOj6K0s3I0slKHCTXTAUtZh3T0r+RoSlhpO3+77AY8P7WETYz2Jzuv5FV/mMODoFrM5fMyQsNt90VynR6J3Jv+fnPJPsm2hJ1Fqt7EKaVRwCbt6a4BdcRoHJsYN/+eh7k/X+FL5XM7viyvQxyFawQrhSV79FIoX6xfjtGW+uAeVF7DScRcl49dlwODhFD7SeLqzoYDJPIQS+VSb3YtvrDgdV+EhuS1bfWvkkXRijlJEpLrgWYmMdfsYX8u/+Ylf5xcBGn3hv1YhQrBCg77AHuUF2w/gJ/ADHFiMcH3ux3nqOsuwnbGSr7jA6Cw=='
n3 = 'TmNVbWUhCXR1od3gBpM+HGMKK/4ErfIKITxomQ/QmNCZlzmmsNyPXQBiMEeUB8udO7lWjQTYGjD6k21xjThHTNDG4z6C2cNNPz73VIaNTGz0hrh6CmqDowFbyrk+rv53QSkVKPa8EZnFKwGz9B3zXimm1D+01cov7V/ZDfrHrEjsDkgK4ZlrQxPpZAPl+yqGlRK8soBKhY/PF3/GjbquRYeYKbagpUmWOhLnF4/+DP33ve/EpaSAPirZXzf8hyatL4/5tAZ0uNq9W6T4GoMG+N7aS2GeyUA2sLJMHymW4cFK5l5kUvjslRdXOHTmz5eHxqIV6TmSBQRgovUijlNamQ=='

观察解密脚本可以大致知道思路:

按照某种规律,flag被分成了两部分msg1+msg2,所以想得到flag,必须先得到msg1和msg2。

往下接着看c1、c2是怎么算出来的,发现就是基础rsa加密过程,只不过不知道n1,要是能算出n1,加上n2与n1有公因数p1,p1也就知道了,进一步p2、p3也就都出来了,所以这里又转到求n1上了。

继续往下,看到这两行:

c1 = num_to_bytes(pow(n1, e1, n3)).encode('hex')
c2 = num_to_bytes(pow(n1, e2, n3)).encode('hex')

两组e、c,大概率就是共模攻击了,c1、c2、e1、e2、n3都有了,就n1不知道,所里这里利用脚本就能解出n1来。

注意这里的c1、c2又是另外一回事了,文件里也给了,放在了文件名为n1的文件里,一开始利用共模攻击脚本解的时候搞混了,用的之前的c1、c2,导致求逆元的时候出不来。

综上,此题分三步走:

第一步

共模攻击求n1,注意要将n3转换成整数形式,顺便也把n2转了

n2 = bytes_to_long(base64.b64decode(n2.encode('utf8')))
n3 = bytes_to_long(base64.b64decode(n3.encode('utf8')))
s = gcdext(e1, e2)  #扩展欧几里得算法,得到x,y,即ax+by=gcd(a,b)
m1 = pow(c1_1, s[1], n3)
m2 = pow(c2_2, s[2], n3)n1 = (m1 * m2) % n3
print(n1)
#n1 = 2499586809914462821807624371088011200618603528498132509598946284572455726453497171635086810524607288333625665025664872216634366700044105279185519761587818169021167370991396691510275499486673922916370294043072503635630922980240462022218565365191228535222150496387990987123639567257124081274667568443678527637259644488779394704508217357758791670308548246801142468699716221789070607334747835552167450340441488756779323653879402176647890584656379628685893686585469918686253137796663587854943386347039389769790329948165162483370187914412810153613198247569427480466488647563900948387020677830797976534568626241686906738179

第二步

基础rsa加密求msg1、msg2

p1 = gcd(n1,n2)
p2 = n1 // p1
p3 = n2 // p1
phi_n1 = (p1-1)*(p2-1)
phi_n2 = (p1-1)*(p3-1)
d1 = invert(e,phi_n1)
d2 = invert(e,phi_n2)
m1 = long_to_bytes(pow(c1,d1,n1))
m2 = long_to_bytes(pow(c2,d2,n2))
msg1 = bytes.decode(m1.strip())
msg2 = bytes.decode(m2.strip())

第三步

之前说到flag按照某种规律被分成了两部分msg1+msg2,这个规律就是for循环里用的,稍微分析以下可以知道,它是用下标来做事:当下标为0,2,4、、、的时候,将字符放到msg1里;当下标为1、3、5的时候,把字符放到msg2里。所以再次利用这个规律就而可以得到flag:

flag = ''
count1 = count2 = 0
for i in range(0,len(msg1)+len(msg2)):if i%4 == 0 or i%4 == 2:flag += msg1[count1]count1 += 1if i%4 == 1 or i%4 == 3:flag += msg2[count2]count2 += 1
print(flag)

整体代码如下:

import base64
from gmpy2 import *
from Crypto.Util.number import *e = 0x1001
e1 = 0x1001
e2 = 0x101
c1 = 0x1240198b148089290e375b999569f0d53c32d356b2e95f5acee070f016b3bef243d0b5e46d9ad7aa7dfe2f21bda920d0ac7ce7b1e48f22b2de410c6f391ce7c4347c65ffc9704ecb3068005e9f35cbbb7b27e0f7a18f4f42ae572d77aaa3ee189418d6a07bab7d93beaa365c98349d8599eb68d21313795f380f05f5b3dfdc6272635ede1f83d308c0fdb2baf444b9ee138132d0d532c3c7e60efb25b9bf9cb62dba9833aa3706344229bd6045f0877661a073b6deef2763452d0ad7ab3404ba494b93fd6dfdf4c28e4fe83a72884a99ddf15ca030ace978f2da87b79b4f504f1d15b5b96c654f6cd5179b72ed5f84d3a16a8f0d5bf6774e7fd98d27bf3c9839
c2 = 0x129d5d4ab3f9e8017d4e6761702467bbeb1b884b6c4f8ff397d078a8c41186a3d52977fa2307d5b6a0ad01fedfc3ba7b70f776ba3790a43444fb954e5afd64b1a3abeb6507cf70a5eb44678a886adf81cb4848a35afb4db7cd7818f566c7e6e2911f5ababdbdd2d4ff9825827e58d48d5466e021a64599b3e867840c07e29582961f81643df07f678a61a9f9027ebd34094e272dfbdc4619fa0ac60f0189af785df77e7ec784e086cf692a7bf7113a7fb8446a65efa8b431c6f72c14bcfa49c9b491fb1d87f2570059e0f13166a85bb555b40549f45f04bc5dbd09d8b858a5382be6497d88197ffb86381085756365bd757ec3cdfa8a77ba1728ec2de596c5ab
c1_1 = 0x2639c28e3609a4a8c953cca9c326e8e062756305ae8aee6efcd346458aade3ee8c2106ab9dfe5f470804f366af738aa493fd2dc26cb249a922e121287f3eddec0ed8dea89747dc57aed7cd2089d75c23a69bf601f490a64f73f6a583081ae3a7ed52238c13a95d3322065adba9053ee5b12f1de1873dbad9fbf4a50a2f58088df0fddfe2ed8ca1118c81268c8c0fd5572494276f4e48b5eb424f116e6f5e9d66da1b6b3a8f102539b690c1636e82906a46f3c5434d5b04ed7938861f8d453908970eccef07bf13f723d6fdd26a61be8b9462d0ddfbedc91886df194ea022e56c1780aa6c76b9f1c7d5ea743dc75cec3c805324e90ea577fa396a1effdafa3090
c2_2 = 0x42ff1157363d9cd10da64eb4382b6457ebb740dbef40ade9b24a174d0145adaa0115d86aa2fc2a41257f2b62486eaebb655925dac78dd8d13ab405aef5b8b8f9830094c712193500db49fb801e1368c73f88f6d8533c99c8e7259f8b9d1c926c47215ed327114f235ba8c873af7a0052aa2d32c52880db55c5615e5a1793b690c37efdd5e503f717bb8de716303e4d6c4116f62d81be852c5d36ef282a958d8c82cf3b458dcc8191dcc7b490f227d1562b1d57fbcf7bf4b78a5d90cd385fd79c8ca4688e7d62b3204aeaf9692ba4d4e44875eaa63642775846434f9ce51d138ca702d907849823b1e86896e4ea6223f93fae68b026cfe5fa5a665569a9e3948a
n2 = 'PVNHb2BfGAnmxLrbKhgsYXRwWIL9eOj6K0s3I0slKHCTXTAUtZh3T0r+RoSlhpO3+77AY8P7WETYz2Jzuv5FV/mMODoFrM5fMyQsNt90VynR6J3Jv+fnPJPsm2hJ1Fqt7EKaVRwCbt6a4BdcRoHJsYN/+eh7k/X+FL5XM7viyvQxyFawQrhSV79FIoX6xfjtGW+uAeVF7DScRcl49dlwODhFD7SeLqzoYDJPIQS+VSb3YtvrDgdV+EhuS1bfWvkkXRijlJEpLrgWYmMdfsYX8u/+Ylf5xcBGn3hv1YhQrBCg77AHuUF2w/gJ/ADHFiMcH3ux3nqOsuwnbGSr7jA6Cw=='
n3 = 'TmNVbWUhCXR1od3gBpM+HGMKK/4ErfIKITxomQ/QmNCZlzmmsNyPXQBiMEeUB8udO7lWjQTYGjD6k21xjThHTNDG4z6C2cNNPz73VIaNTGz0hrh6CmqDowFbyrk+rv53QSkVKPa8EZnFKwGz9B3zXimm1D+01cov7V/ZDfrHrEjsDkgK4ZlrQxPpZAPl+yqGlRK8soBKhY/PF3/GjbquRYeYKbagpUmWOhLnF4/+DP33ve/EpaSAPirZXzf8hyatL4/5tAZ0uNq9W6T4GoMG+N7aS2GeyUA2sLJMHymW4cFK5l5kUvjslRdXOHTmz5eHxqIV6TmSBQRgovUijlNamQ=='n2 = bytes_to_long(base64.b64decode(n2.encode('utf8')))
n3 = bytes_to_long(base64.b64decode(n3.encode('utf8')))
s = gcdext(e1, e2)  #扩展欧几里得算法,得到x,y,即ax+by=gcd(a,b)
m1 = pow(c1_1, s[1], n3)
m2 = pow(c2_2, s[2], n3)n1 = (m1 * m2) % n3
#print(n1)
#n1 = 2499586809914462821807624371088011200618603528498132509598946284572455726453497171635086810524607288333625665025664872216634366700044105279185519761587818169021167370991396691510275499486673922916370294043072503635630922980240462022218565365191228535222150496387990987123639567257124081274667568443678527637259644488779394704508217357758791670308548246801142468699716221789070607334747835552167450340441488756779323653879402176647890584656379628685893686585469918686253137796663587854943386347039389769790329948165162483370187914412810153613198247569427480466488647563900948387020677830797976534568626241686906738179p1 = gcd(n1,n2)
p2 = n1 // p1
p3 = n2 // p1
phi_n1 = (p1-1)*(p2-1)
phi_n2 = (p1-1)*(p3-1)
d1 = invert(e,phi_n1)
d2 = invert(e,phi_n2)
m1 = long_to_bytes(pow(c1,d1,n1))
m2 = long_to_bytes(pow(c2,d2,n2))
msg1 = bytes.decode(m1.strip())
msg2 = bytes.decode(m2.strip())flag = ''
count1 = count2 = 0
for i in range(0,len(msg1)+len(msg2)):if i%4 == 0 or i%4 == 2:flag += msg1[count1]count1 += 1if i%4 == 1 or i%4 == 3:flag += msg2[count2]count2 += 1
print(flag)

思路代码参考:http://t.csdn.cn/sSD0B

[QCTF2018]Xman-RSA相关推荐

  1. RSA 2022/8/17

    1. [De1CTF2019]babyrsa(综合rsa) orz- 分步做: 1. 求p n = [2012961535249176549934011294318831718054876159786 ...

  2. golang通过RSA算法生成token,go从配置文件中注入密钥文件,go从文件中读取密钥文件,go RSA算法下token生成与解析;go java token共用

    RSA算法 token生成与解析 本文演示两种方式,一种是把密钥文件放在配置文件中,一种是把密钥文件本身放入项目或者容器中. 下面两种的区别在于私钥公钥的初始化, init方法,需要哪种取哪种. 通过 ...

  3. RSA签名算法,计算调用加密报文,安全传输

    RSA签名算法 1. 获取当前的时间戳参数 2. 计算参数签名 3. 获取请求对象的MD5密文 4. 通过私钥计算某个参数的RSA签名 5. 转换字符集到utf8 6. MD5加密字符串 7. bas ...

  4. RSA、MD5等加密算法的区别和应用

    RSA算法: 是典型的非对称加密算法,主要具有数字签名和验签的功能. MD5算法: 是消息摘要算法,只能用来生成消息摘要无法进行数字签名. IDEA算法和RC4算法: 对称加密算法,只能用来进行数据加 ...

  5. java签名算法阻止 设置_java数字签名算法之RSA

    © 版权声明:本文为博主原创文章,转载请注明出处 实例 1.项目结构 2.pom.xml xsi:schemaLocation="http://maven.apache.org/POM/4. ...

  6. php+rsa生成签名sign,PHP 做 RSA 签名 生成订单(支付宝例子)

    /组合签名 $a=time(); $b=substr($a, 1); //生成随机订单号 $orderid= $b.mt_rand(10000,99999); //合作身份者id,以2088开头的16 ...

  7. rsa证书ssh登陆服务器

    好久不用,又生疏了. 今晚实操了一下,作一个记录. 使用rsa的密钥对登陆linux服务器,主要是为了安全. 这种证书级别的登陆,比最复杂的root用户名和帐号的安全性都要高一个等级. 至少服务器不会 ...

  8. 非对称加密算法RSA公钥私钥的模数和指数提取方法

    生成非对称加密算法RSA公钥.私钥的方法: 1. 通过OpenSSL库生成,可参考  https://github.com/fengbingchun/OpenSSL_Test/blob/master/ ...

  9. 非对称加密算法之RSA介绍及OpenSSL中RSA常用函数使用举例

    RSA算法,在1977年由Ron Rivest.Adi Shamirh和LenAdleman,在美国的麻省理工学院开发完成.这个算法的名字,来源于三位开发者的名字.RSA已经成为公钥数据加密标准. R ...

  10. 支付宝 php rsa算法,:PHP支付宝接口RSA验证

    这两天一直困扰的PHP RSA签名验证问题终于解决了,由于之前RSA接触的不多,再加上官方至今还未有PHP的SDK可供参考,因此走了一些弯路,写在这里和大家分享. 虽然支付宝官方还未提供相关SDK,P ...

最新文章

  1. 捍卫者usb管理控制系统_捍卫超模块化JavaScript
  2. 利用Python进行数据分析 Note 1
  3. mongodb 聚合 分组查询
  4. python zipfile_python zipfile - 刘江的python教程
  5. Spark Java API:broadcast、accumulator
  6. 第三次学JAVA再学不好就吃翔(part30)--继承
  7. 理请求时出现未知错误.服务器返回的状态码为: 500,react-native
  8. Introduction of Version Control/Git, SVN
  9. mysql大小写敏感_MySQL数据库大小写敏感的问题
  10. Java IO实战操作(一)
  11. 常见的激活函数及其优缺点分析
  12. 同侪隐修录 (2016-12-25 23:10:21)转载▼
  13. mpvue 搭配 minui
  14. 【其它】颜色的知识--亮度、色相、饱和度、对比度
  15. Django富文本编辑——Ckeditor的配置、使用和踩坑(应该全)
  16. android10 禁止下拉状态栏
  17. 思岚科技荣获CSDN 【2019优秀人工智能案例TOP 30+】
  18. php切换背景颜色,点击切换背景颜色
  19. html无法复制粘贴,无法复制粘贴
  20. VC 清除IE缓存、cookie、历史记录等

热门文章

  1. MyBatis的优点和缺点
  2. 中国人民大学赵鑫:AI 科研入坑指南
  3. 最新 2022高露洁AI面试真题题库
  4. 龙芯电脑使用Loongnix系统
  5. 清除浮动(解决高度坍塌的问题)的方法5种
  6. php获取qq头像地址,获取 QQ 头像地址,并且不暴露 QQ 号
  7. win7事件查看器事件id_使用免费工具从事件查看器中查找事件ID
  8. FastDFS使用之文件名称
  9. python 学生成绩统计
  10. 程序员的而立之年,迷茫之年