仿射密码--TWCTF 2016_super_express

一、简介

参考 :  https://ctf-wiki.org/crypto/classical/monoalphabetic/#_15

核心就是 

加密:
y ≡ (ax+b) (mod m)
解密:
x ≡ (a^-1) (y-b) (mod m)
推导过程:
y ≡ (ax+b) (mod m)  => y-b ≡ (ax) (mod m)   =>   (y-b)*(a^-1) ≡ x
 
 

二、解法

1、当 a 等于 1时,就是凯撒加密
2、假如我们已知其中一参数(a 或 b)
直接暴力枚举即可求得b,从而进行解密
3、假设我们已经知道采用的字母集 m,密文中的两个字符以及其对应的明文字符
就像这样:

 

做差:

 

 这样,我们就可以直接求出 a ,再由y ≡ (ax+b) (mod m)  推得  b = (y-ax) (mod m) 得到 b即可 

三、实战题目

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)) % 251 encrypted += '%02x' % c print (encrypted) # "805eed80cbbccb94c36413275780ec94a857dfec8da8ca94a8c313a8ccf9"

四、wp

 

 

import gmpy2 flag = 'TWCTF{*******CENSORED********}' key = '****CENSORED****************' cip = "805eed80cbbccb94c36413275780ec94a857dfec8da8ca94a8c313a8ccf9" cip_block_data = [int(cip[i:i+2],16) for i in range(0,len(cip),2)] plaintxt = ord(flag[1]) - ord(flag[0]) # x1 - x2 ciptxt = cip_block_data[1] - cip_block_data[0] # y1 - y2 a = gmpy2.invert(plaintxt,251) * ciptxt % 251 # 根据 y1 - y2 = a(x1 - x2) 求出a b = (cip_block_data[0] - a* ord(flag[0])) % 251 # y ≡ (ax+b) (mod m) => b = (y-ax) (mod m) a_inv = gmpy2.invert(a,251) flag = "" for c in cip_block_data: flag += chr((c-b) * a_inv % 251) print(flag) ''' TWCTF{Faster_Than_Shinkansen!} '''

 

五、感悟

得亏学过近世代数和网络空间安全数学基础

 


__EOF__

本文作者_TLSN
本文链接https://www.cnblogs.com/lordtianqiyi/articles/17063035.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   TLSN  阅读(299)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示