jarvisoj-Crypto-superexpress
题目给了一个密文以及一段加密代码
密文:
805eed80cbbccb94c36413275780ec94a857dfec8da8ca94a8c313a8ccf9
加密代码
import sys
key = '****CENSORED***************'
flag = 'TWCTF{*******CENSORED********}'if len(key) % 2 == 1:print("Key Length Error")sys.exit(1)n = len(key) / 2
encrypted = ''
for c in flag:c = ord(c)for a, b in zip(key[0:n], key[n:2*n]):c = (ord(a) * c + ord(b)) % 251encrypted += '%02x' % cprint(encrypted)
按照加密代码所示:
对于给定flag里面的任意一个字符:
for c in flag:for i in range(0, n):c = (a[i] * c + b[i]) % 251
那么将其展开其实就是:
cn=(an(an−1(...(a1c1+b1)...)+bn−1)+bn)%251c_{n} = (a_{n}(a_{n-1}(...(a_1c_1 + b_1)...)+b_{n-1})+b_{n})\%251cn=(an(an−1(...(a1c1+b1)...)+bn−1)+bn)%251
而我们需要的仅仅是c1c_1c1到cnc_ncn的转化,所以该式最终可以转化为:
cn=(ac1+b)%251c_n = (ac_1+b)\%251cn=(ac1+b)%251
那么我们只要求出a和b就可以进行解码了
给定的flag中有一些确定的字符:“TWCTF{”
那么我们可以根据这些字符以及对应的编码后的数字来求a,b
{128=(a∗84+b)%25194=(a∗87+b)%251237=(a∗67+b)%251203=(a∗70+b)%251188=(a∗123+b)%251\left\{ \begin{aligned} 128 = (a*84 + b) \% 251\\ 94 = (a*87 + b)\%251\\ 237=(a*67+b)\%251\\ 203=(a*70+b)\%251\\ 188=(a*123+b)\%251 \end{aligned} \right.⎩⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎧128=(a∗84+b)%25194=(a∗87+b)%251237=(a∗67+b)%251203=(a∗70+b)%251188=(a∗123+b)%251
拿几个式子相减就可以去掉b:
{3a=k1∗251−3420a=52∗251−143\left\{ \begin{aligned} 3a=k_1*251-34\\ 20a=5_2*251-143 \end{aligned} \right. {3a=k1∗251−3420a=52∗251−143
根据这两个式子可以解出来 a=156a=156a=156
进而尝试求出 b=76b=76b=76
如此,便可以进行解码了
对flag中的每一个字符,在ascii可见字符中进行尝试,知道编码后结果与给定结果相同为止
# 将给定的十六进制数,变为字节码放入hexarray中
def convert_hexarray(s):hexarray = []while s:hexarray.append(s & 0xff)s >>= 8hexarray.reverse()return hexarraydef solve(hexarray, a, b):flag = ""for data in hexarray:# 枚举ascii码所有可见字符,并用 (a * c + b) % 251 编码,判断是否与给定编码相等for c in range(0x20, 0x7f):if (a * c + b) % 251 == data:flag += chr(c)breakreturn flagif __name__ == "__main__":output_hex = 0x805eed80cbbccb94c36413275780ec94a857dfec8da8ca94a8c313a8ccf9a = 156b = 76print(solve(convert_hexarray(output_hex), a, b))
flag: TWCTF{Faster_Than_Shinkansen!}
jarvisoj-Crypto-superexpress相关推荐
- c4d+ps打造抽象NFT加密艺术 Create Abstract NFT Crypto Art with Cinema 4D + Photoshop
c4d+ps打造抽象NFT加密艺术 Create Abstract NFT Crypto Art with C4D + PS c4d+ps打造抽象NFT加密艺术 Create Abstract NFT ...
- Python3模块Crypto改为pycryptodome
安装: # 安装方式1: pip3 install pycryptodome# 安装方式2: pip3 install -i https://pypi.douban.com/simple pycryp ...
- go标准库的学习-crypto/aes
参考:https://studygolang.com/pkgdoc 导入方式: import "crypto/aes" aes包实现了AES加密算法,参见U.S. Federal ...
- centos/Debian/Ubuntu上安装PyCryptodome/Crypto
注意:PyCryptodome是Crypto的升级版,不要安装旧的Crypto了. 如果能联网,直接装: pip3 install PyCryptodome GitHub仓库地址:Legrandin/ ...
- 使用Crypto++的AES GCM对称加密
这里记录使用Crypto++的AES GCM对称加密的代码片段,可直接执行 运行环境:Windows, Visual Studio 2017 需安装Crypto++库,可使用cvpkg工具直接集成该库 ...
- 使用Crypto++ ecdsa 进行签名和认证
这里记录使用Crypto++ ecdsa 进行签名和认证的代码片段,可直接运行. 运行环境:Windows, Visual Studio 2017 需安装Crypto++库,可使用cvpkg工具直接集 ...
- go标准库的学习-crypto/sha1
参考:https://studygolang.com/pkgdoc 导入方式: import "crypto/sha1" sha1包实现了SHA1哈希算法,参见RFC 3174. ...
- com.sun.crypto.provider.SunJCE
为什么80%的码农都做不了架构师?>>> Could not instantiate bean class [com.lz.monitor.alert.service.Serv ...
- javax.crypto.BadPaddingException: Data must sta...
为什么80%的码农都做不了架构师?>>> 错误:javax.crypto.BadPaddingException: Data must start with zero RSA是 ...
- 使用crypto模块实现md5加密功能(解决中文加密前后端不一致的问题)
使用crypto模块实现md5加密功能(解决中文加密前后端不一致的问题) 参考文章: (1)使用crypto模块实现md5加密功能(解决中文加密前后端不一致的问题) (2)https://www.cn ...
最新文章
- pytorch maxpool和卷积尺寸问题
- Java程序员从笨鸟到菜鸟全部博客目录
- 最短网络 Agri-Net
- 初学者指南:如何为Red Hat Process Automation Manager配置电子邮件服务任务
- C语言指针变量--图示易懂
- Vmware之锁定文件失败
- 如何建设一个开源图形引擎的文档网站
- Java工程师的职业规划(最全版本)
- H5接入微信SDK 实现微信支付
- 2019秋招|从春招到秋招,Java岗经验总结(收获AT)
- C语言实现王者荣耀护甲减免机制
- 对经典恒流源做电子负载 分析
- QQ音乐推荐歌单API报错 invalid referer
- DNF之架设搭建游戏流程讲解
- 一文带你看懂小程序朋友圈广告是什么
- Unity Shader - BRP - Soft Particle - 软粒子
- 【无标题】残余应力 conception
- Kodi 电影海报墙显示电影名称(通过修改默认皮肤样式)
- 怎么用微信在蘑菇街结算
- 2021年教师资格证面试试讲稿:小学英语 Welcome to Africa