目录
技能展示
文章
日记
时间线
项目展示
分类
标签
Android Bash Burp C++ CS CTF DLL劫持 Docker Fastjson Fastjson2 FNV-1a FreeCMS FRP GetShell GitHub IPv6 Java JNDI John JS加密 JS逆向 K8s Kafka Kali lama-cleaner Linux mitmproxy MSF MySQL Nim Nmap NPS Office OID Payload Phar PHP phpMyAdmin POP链 PWN Pyinstaller Python RCE RSA Shellcode SNMP SQL注入 SSH SSRF Ubuntu USB Web Webshell Web安全 Windows XSS YAML Zookeeper 主机探测 代码审计 伪协议 免杀 内网 内网穿透 加密 加解密 参数 反序列化 反弹shell 命令 哈希碰撞 图像处理 域渗透 字符串逃逸 容器 密码学 密码破解 提权 数据库 文件上传 日志分析 未授权访问 权限维持 汇总 流量分析 消息队列 溯源 漏洞 漏洞分析 漏洞利用 端口扫描 编译 网络管理 资产探测 跨平台 运维 进程隐藏 逆向
目录
目录
849 字
4 分钟
RSA共模攻击
RSA共模攻击
1共模攻击又称为同模攻击2利用前提就是,RSA 体系在生成密钥的过程中使用了相同的模数 n。3在 CTF 题目中,就是同一明文,同一 n,不同 e,进行加密。4m,n 相同;e,c不同,且 e1 和 e2 互质出题脚本
1import libnum2import gmpy23#生成素数4p=libnum.generate_prime(1024)5q=libnum.generate_prime(1024)6e1=23337e2=233338m="flag{6ed4c74e022cb18c8039e96de93aa9ce}"9m=libnum.s2n(m)10n=p*q11c1=pow(m,e1,n)12c2=pow(m,e2,n)13print("n1=",n)14print("e1=",e1)15print("c1=",c1)16print("n2=",n)17print("e2=",e2)18print("c2=",c2)1n1= 228176874535945610931708228185885569860002770111608412624031995515023934840613894910766340283953929620097933432289230928866120546849913897373457873266889721490208429145835298910829511798689562514402188193927378915807463597036126699347957463285296842473743387675336154491379227002091788728793938112727046097192116489181405869121085802056360480075785633060437196140524838808708635855757892858111372405503085611978220703835966223390596488741036461521817280622505165617322473672983362133532624614331298813825185793138530028776158696002737015707160551723597630890017374671780313433671583861452786986704287224392758459197812e1= 23333c1= 30688096938078660232507556586648454344852058284656495324856363555975414959985472922033145324289137143593085696892263268597422312534345128756389952897371056482454792629475031070617751981345287619238099713377522284337126949073892664910113231301511536599881647040122049041880509219847590963949168234875148224450947256705953896259222548604420562076653487517254747797639560461766366781799738563498983018774347463011703487180232756179266389664033823961735787150638984567490538069346693626039725085351371050875805843311728452152177888612923503875221041969693895238641428204964994757693682255022010050817646953281151257160514n2= 228176874535945610931708228185885569860002770111608412624031995515023934840613894910766340283953929620097933432289230928866120546849913897373457873266889721490208429145835298910829511798689562514402188193927378915807463597036126699347957463285296842473743387675336154491379227002091788728793938112727046097192116489181405869121085802056360480075785633060437196140524838808708635855757892858111372405503085611978220703835966223390596488741036461521817280622505165617322473672983362133532624614331298813825185793138530028776158696002737015707160551723597630890017374671780313433671583861452786986704287224392758459197815e2= 233336c2= 14321584584635710601699862022940447451458443319804064303028371997206157560474856130068721352840265237932584758125998845200030240230088697475257804076891915461964081330330701969941369024375036108814909954911842762561181905181080581182569456796896705718244477631301075420423567981003074132957174019040041623975800201106522574541756690453732269869578461267131690321760712385293576843426568170997558455004390668769058534236566151168725808220917155776537019046559669930314898872064974853472108134659947349093033210643312110173688854873249213787719807659050762967536386015370877644748346382736830713914593995648231348173041解题脚本
1import gmpy22import libnum3
4n = 253339660580033775127074813387957147137376526599446018341826858735297029139886419838557004599961047004706214115591539449889522100840146346755835663385688824407085289978087986509621167569698222115865315224302450400135705710433852386018461046150500894578367214377907152253679711060858395235007354807151554244989411504680930838168302156327162443906794172188731797342766574119072164867908150371051083060557944730023155417874619047283751647372254865010098572997177493462793712512453187299519058325787396969269315022258997072262645705576235277018068298275669042245728973786391917568780493422035463095204586724641708595774335e1 = 23336c1 = 113559818977814789078533569117525616591255750273367199972908356610899011540311716986605862031705283682288508951593616371889907820302559836337905807000320926295876311085971441965514384108680347399819606561108876507473253116139000080012348358978356137596921464190801131769637478355926561854357415041761166721745390180891395477954471094584692253308090645392167731236718148595100690895326777044820261691785430625786867943460267748530851012781257634602128019293604568888693501052945959049407995225221447404640436053423482690863247477292883992750798742715192081550393640925777555185327993456511724332277454834226209007761367e2 = 233338c2 = 13264995389028411164116745540699455813901300484323513532601542618633094713128108111603024586448163909448336339234356349612510925318935030399147932172479845953319209093676273160874049344023123586423156754864389685850849648457638810788357878721603740255474001412986507945519702911199753445786676899611348146765531901781398425076758992620245723703139391070800728750682183362554521614078599073086560943315579121877882763348337238938563104345233375570110320814672624574271679785282803394940777858134612808537352664631527094437316387142193917731443497526335553102993182905762580869713737771184826427020205999280718551330419
10# 共模攻击函数11def rsa_gm_attack(e1, e2, c1, c2, n):12 # e1, e2, c1, c2, n = int(e1), int(e2), int(c1), int(c2), int(n)13 s = gmpy2.gcdext(e1, e2) # 欧几里得公式扩展,满足 e1 * s1 + e2 * s2 = 114 # print(s)15 s1 = s[1]16 s2 = s[2]17 # print(s1)18 # print(s2)19 if s1 < 0:20 s1 = - s121 c1 = gmpy2.invert(c1, n)22 elif s2 < 0:23 s2 = - s224 c2 = gmpy2.invert(c2, n)25 m = (pow(c1, s1, n) * pow(c2, s2, n)) % n26 return int(m)27
28m = rsa_gm_attack(e1, e2, c1, c2, n)29# print(m)30print(libnum.n2s(int(m)))1b'flag{6ed4c74e022cb18c8039e96de93aa9ce}'共模攻击原理
两个及以上的公钥(n,e)来加密同一条信息m
1c1 = pow(m, e1, n)2c2 = pow(m, e2, n)e1,e2互质,则有
1gcd(e1,e2)=1根据扩展欧几里德算法 对于不完全为 0 的整数 a,b,gcd(a,b)表示 a,b 的最大公约数。那么一定存在整数 x,y 使得 gcd(a,b)=ax+by
1e1*s1+e2*s2 = 1s1、s2皆为整数,但是一正一负,假设s1为正数,s2为负数
因为
1c1 = m^e1%n2c2 = m^e2%n可得:
1(c1 ^ s1 * c2 ^ s2) % n = ((m ^ e1 % n) ^ s1 (m ^ e2 % n) ^ s2) % n根据模运算性质: 幂运算是一种关于幂的数学运算。同底数幂相乘,底数不变,指数相加。同底数幂相除,底数不变,指数相减。幂的乘方,底数不变,指数相乘。
1(a * b) % p = (a % p * b % p) % p2a ^ b % p = ((a % p) ^ b) % p简化公式为:
1(c1 ^ s1 * c2 ^ s2) % n = ((m ^ e1 % n) ^ s1 * (m ^ e2 % n) ^ s2) % n2
3=> (c1 ^ s1 * c2 ^ s2) % n = ((m ^ e1 % n) ^ s1 % n * (m ^ e2 % n) ^ s2 % n) % n # (a * b) % p = (a % p * b % p) % p4
5=> (c1 ^ s1 * c2 ^ s2) % n = ((m ^ e1) ^ s1 % n * (m ^ e2) ^ s2 % n) % n # ((a % p) ^ b) % p =a ^ b % p6
7=> (c1 ^ s1 * c2 ^ s2) % n = ((m ^ e1) ^ s1 * (m ^ e2) ^ s2) % n # (a % p * b % p) % p=(a * b) % p8
9=> (c1 ^ s1 * c2 ^ s2) % n = ((m ^ (e1 * s1) * (m ^ (e2 * s2)) % n # 幂的乘方,底数不变,指数相乘。10
11(c1 ^ s1 * c2 ^ s2) % n = (m ^ (e1 * s1 + e2 * s2)) % n # 同底数幂相乘,底数不变,指数相加。因为 e1*s1+e2*s2 = 1 得:
1(c1 ^ s1 * c2 ^ s2) % n = (m ^ 1) % n2
3(c1 ^ s1 * c2 ^ s2)% n = m # gcd(e1, e2) = 1 的时候变形
1假设 gcd(e1, e2) = x # x != 12即:3(c1 ^ s1 * c2 ^ s2) % n = (m ^ x) % n4所以真实的 m1:5m1 = (m ^ x) % n6m1 = (m ^ x) + kn7计算的时候需要减去 k 倍的 n上述就是rsa共模攻击的过程
因此,同一m,同一n,不同e,进行加密。在不需要知道d的情况下,可以进行解密。
部分信息可能已经过时
目录
技能展示
文章
日记
时间线
项目展示
分类
标签
Android Bash Burp C++ CS CTF DLL劫持 Docker Fastjson Fastjson2 FNV-1a FreeCMS FRP GetShell GitHub IPv6 Java JNDI John JS加密 JS逆向 K8s Kafka Kali lama-cleaner Linux mitmproxy MSF MySQL Nim Nmap NPS Office OID Payload Phar PHP phpMyAdmin POP链 PWN Pyinstaller Python RCE RSA Shellcode SNMP SQL注入 SSH SSRF Ubuntu USB Web Webshell Web安全 Windows XSS YAML Zookeeper 主机探测 代码审计 伪协议 免杀 内网 内网穿透 加密 加解密 参数 反序列化 反弹shell 命令 哈希碰撞 图像处理 域渗透 字符串逃逸 容器 密码学 密码破解 提权 数据库 文件上传 日志分析 未授权访问 权限维持 汇总 流量分析 消息队列 溯源 漏洞 漏洞分析 漏洞利用 端口扫描 编译 网络管理 资产探测 跨平台 运维 进程隐藏 逆向
目录