题目:RSA大礼包 |
摘要: 实验要求: 使用截获的加密数据,根据RSA算法的非合规使用,参数选取不当等,破译出相关明文和参数,其中参数主要为p、q以及私钥d。 实验目的: 通过对已截获密文的破译,学习对RSA常见的攻击方式,如共模攻击、低加密密指数攻击、低解密指数攻击、因数碰撞攻击、随机数发生器攻击等。在破译过程中,更深刻的理解RSA各个参数的作用及使用要求限制。并在今后的使用过程中,避免对参数的不合规使用,从而造成加解密系统的不安全。 |
题目描述 已知为截获的21条加密帧,对应的明文为一个通关密语,问是否能仅从加密数据恢复通关密语及RSA体质参数。若可以恢复,则需给出原文和参数,若不能恢复则需给出已恢复部分并说明剩余部分不能恢复的理由。 需要注意的是模数N=pq规模问1024比特,其中p、q为素数,每次对文本加密,最多只能加密八个明文字符,若超过八个字符,则需对明文进行分片,每个分片不超过八个字符。帧数据的数据格式如下,其中数据都是 16 进制表示,结构如下1024bit模数N | 1024bit加密指数e | 1024bit密文m^e mod N。分片加密后发送一个加密帧数据,帧数据文件名称为 FrameXX,其中 XX 表示接收序号,该序号不一定等于通信序号。
|
过程 背景: RSA 的安全性是基于大整数素因子分解的困难性,而大整数因子分解问题是数学上的著名难题。数域筛法是目前 RSA 攻击的首选算法。在 1999 年,一台 Cray 超级电脑用了 5 个月时间分解了 512 比特长的密钥。在 512 比特 RSA 算法破解 10 年之后,即 2009 年 12 月 9 日,768比特 RSA 算法即 232 数位数字的 RSA-768 被分解。分解一个 768 比特RSA 密钥所需时间是 512 位的数千倍,而 1024 比特所需时间则是 768比特的一千多倍,因此在短时间内 1024 比特仍然是安全的。除此之外,目前对于 RSA 算法的攻击主要有以下方式:选择密文攻击、公共模数攻击、低加密密指数攻击、低解密指数攻击、定时攻击等等。 原理: 1)RSA 体制参数选取 Step1. 每个使用者,任意选择两个大素数ᵅd和ᵅe,并求出其乘积ᵄ1 = ᵅdᵅe。 Step2. 令ᵱ1(ᵄ1) = (ᵅd − 1)(ᵅe − 1),选择整数ᵅ2,使得GCD(ᵅ2,ᵱ1(ᵄ1)) = 1,并求出ᵅ2模ᵱ1(ᵄ1)的逆元ᵅ1,即ᵅ2ᵅ1 ≡ 1 mod ᵱ1(ᵄ1). Step3. 将数对(ᵅ2, ᵄ1)公布为公钥,ᵅ1保存为私钥。 2)加解密过程 Bob 欲传递明文ᵅa给 Alice,则 Bob 首先由公开途径找出 Alice 的公 钥(ᵅ2, ᵄ1),Bob 计算加密的信息ᵅ0为:ᵅ0 ≡ ᵅaᵅ2 mod ᵄ1。 Bob 将密文ᵅ0传送给 Alice。随后 Alice 利用自己的私钥ᵅ1解密: ᵅ0^ᵅ2 ≡ (ᵅa^ᵅ2)^ᵅ1 ≡ ᵅa^ᵅ2ᵅ1 ≡ ᵅa mod ᵄ1. 步骤: 1、提取加密帧中RSA参数 def getOptions(filepath: str): with open(filepath, "r", encoding='GBK') as f: msg = f.read() n = int('0x' + msg[:1024 // 4], 16) e = int('0x' + msg[1024 // 4:2048 // 4], 16) c = int('0x' + msg[2048 // 4:], 16) return n, e, c 2、共模攻击 若明文m相同,用两个公钥e1,e2加密得到两个私钥d1,d2 和两个密文c1,c2。共模攻击,即当m不变的情况下,知道n,e1,e2,c1,c2, 可以在不知道d1,d2的情况下,解出m利用条件为=> gcd(e1,e2)=1。加密帧中第0帧和第4帧可用共模攻击破解。 def com_module_attack(e1, e2, n, c1, c2): # a*e1 + b*e2 = 1 a, b, d = extended_gcd(e1, e2) print('============frame0, frame4===================') print('p=') print('q=') print('frame0_e=' + str(e1)) print('frame4_e=' + str(e2)) print('msg=', end='') print(libnum.n2s(int((pow(c1, a, n) * pow(c2, b, n)) % n))[-8:]) 解得结果如下: ============frame0, frame4=================== frame0_e=46786465362686334917265996843779843233606992585424976481745055335468678697948774988450305612127967926533923268260412557000125153569622340353246096040604284883505587337829322949633637609180797447754513992039018904786537115087888005528547900640339270052628915440787357271345416818313808448127098885767015748889 frame4_e=152206992575706893484835984472544529509325440944131662631741403414037956695665533186650071476146389737020554215956181827422540843366433981607643940546405002217220286072880967331118344806315756304650248634546597784597963886656422706197757265316981889118026978865295597135470735576032282694348773714479076093197 msg=b'My secre' 3、因数碰撞攻击 多条报文选取选取到了相同的p,q,那么会出现n_1=pq_1,n_2=pq_2,则由欧几里得算法gcd(n1,n2)=p,再计算n/p即可得到参数q,计算出fai(n)=N-p-q+1,计算出私钥d,加密帧中第1帧和第18帧可用因数碰撞攻击破解。 def bad_choose_pq_com(e1, c1, n1, e2, c2, n2): p = math.gcd(n1, n2) q1 = n1 // p q2 = n2 // p print('================frame1======================') print('p=' + str(p)) print('q=' + str(q1)) print('e=' + str(e1)) print('msg=', end='') decryptRSA(p, q1, e1, c1) print('================frame18======================') print('p=' + str(p)) print('q=' + str(q2)) print('e=' + str(e2)) print('msg=', end='') decryptRSA(p, q2, e2, c2) 解得结果如下: ================frame1====================== p=7273268163465293471933643674908027120929096536045429682300347130226398442391418956862476173798834057392247872274441320512158525416407044516675402521694747 q=12775796067504534889308793837705093856447186276434607181291462366302734214583227473619414509043813033676998357747882057607288385639737162184366176530607467 e=65537 msg=b'. Imagin' ================frame18====================== p=7273268163465293471933643674908027120929096536045429682300347130226398442391418956862476173798834057392247872274441320512158525416407044516675402521694747 q=12840807874760119497562989864651565491645077946976950748211992253853323703532620362223764981952516328133916264333884385029280730688894521589959051436522977 e=65537 msg=b'm A to B' 4、低加密指数广播攻击 若加密指数e非常小,一份明文使用不同的模数n,相同的加密指数e进行多次加密,则可以拿到每一份加密后的密文和对应的模数n、加密指数e。破解思路为不同的模数n中可能存在相同的p或者说q,求出不同n之间的最大公约数 gcd(),得到p或q 可得d,有私钥d就能得到明文。 def broadcast_attack(params: list): x, n = chinese_remainder_theorem(params) print('==========frame3, 8, 12, 16, 20==============') print('p=') print('q=') print('e=5') print('msg=', end='') print(libnum.n2s(int(gmpy2.iroot(x, 5)[0]))[-8:]) 解得结果如下: ==========frame3, 8, 12, 16, 20============== e=5 msg=b't is a f' 5、Pollard p-1分解攻击 若所选取的素数p或素数q不为强素数,即p-1或q-1没有大素数因子时,可能存在pollard p-1 分解法实现对n的因子分解,计算出p,q,从而算出私钥d,破解明文。加密帧中第2帧、第6帧和第19帧可用Pollard p-1攻击破解。 def factor_n_p_1_attack(frames: list): i = 0 for c, n, e in frames: if i == 0: print('================frame2======================') elif i == 1: print('================frame6======================') else: print('================frame19======================') p = factor_n_p_1(n) q = n // p print('p=' + str(p)) print('q=' + str(q)) print('e=' + str(e)) print('msg=', end='') decryptRSA(p, q, e, c) i = i + 1 解得结果如下: ================frame2====================== p=1719620105458406433483340568317543019584575635895742560438771105058321655238562613083979651479555788009994557822024565226932906295208262756822275663694111 q=52484065122572767557293534477361686456679280880304125291106733197354892893647364164212186415880889674435558369420400890814461263958618375991691022752189839 e=65537 msg=b' That is' ================frame6====================== p=920724637201 q=159482692259010816139523195494724350795654007589889398757383554027183924116413427533184220914037106543253535103452324841452565420868944985464229649420240708554088156331324206733727690785373464575525698274552058386560106163093965065830071277465943834308083708065429495092746028681968670036721164931 e=65537 msg=b' "Logic ' ================frame19====================== p=1085663496559 q=86725761611859895386396141031497189948984447138542215420462553101081991008304507461163078354877970282649251051457532902955009856009405853917396630017011320500357081664483071782135584899953560478866041032397335990722689211113937797406269980402604895207480485168493674422769645640726941944110986793 e=65537 msg=b'instein.' 6、Fermat分解攻击 若模数N的因子p与q非常接近,则可通过尝试 ,从而分解出p+q。加密帧中第10帧和第14帧可用Pollard p-1攻击破解。 def factor_n_fermat_attack(frames: list): i = 0 for c, n, e in frames: if i == 0: print('================frame10======================') else: print('================frame14======================') p, q = fermat(n) print('p=' + str(p)) print('q=' + str(q)) print('e=' + str(e)) print('msg=', end='') decryptRSA(p, q, e, c) i = i + 1 解得结果如下: ================frame10====================== p=9686924917554805418937638872796017160525664579857640590160320300805115443578184985934338583303180178582009591634321755204008394655858254980766008932978699 q=9686924917554805418937638872796017160525664579857640590160320300805115443578184985934338583303180178582009591634321755204008394655858254980766008932978633 e=65537 msg=b'will get' ================frame14====================== p=10954856299233465126359914171500305822846165431085183673999109759449706417636519711881707731622506407722143163847672064459333431572992021257881551867597529 q=10954856299233465126359914171500305822846165431085183673999109759449706415739193445885099004577509868426540084786683485568001351280541116090063034118634519 e=65537 msg=b' you fro' 至此,根据已有部分的明文,已经可以大致推测出明文逻辑,根据搜索,得到明文如下: My secret is a famous saying of Albert Einstein. That is "Logic will get you from A to B. Imagination will take you everywhere.”
|
总结 通过本次实验,我对RSA体质各个参数的作用以及常见误用方式有了更深的了解,通过对RSA常见的攻击方式的实现,如共模攻击、因数碰撞攻击、低加密指数广播攻击、Pollard p-1分解攻击、Fermat分解攻击,不仅锻炼了自己的编程能力,还在一次次尝试与debug中对RSA加密体制有了更清楚的认识。了解到一个安全的加密体制,不仅仅需要其在理论证明上的安全性,只有使用者使用时按照要求,明确各个参数的作用,才能避免被轻易破解的问题。 在实验过程中,遇到最大的问题是刚拿到题目时,试图逐个帧依次破解,但是少量的知识储备使我一度无从下手、毫无思绪。之后,通过搜索,从许多优秀的博客中了解到了每个帧大致的攻击方式和破解思路,由此才一步一步先去了解相关攻击方式、再去实现、再尝试破解最终得到明文,在此十分感谢那些优秀博客的创作者。
|
参考文献 [1]《现代密码学》(红书) [2]https://www.cnblogs.com/coming1890/p/13506057.html [3]https://blog.csdn.net/Mitchell_Donovan/article/details/120771960 [4]https://blog.csdn.net/weixin_45859850/article/details/110479914 [5]https://blog.csdn.net/qq_45564150/article/details/124656223 [6]https://www.jianshu.com/p/76a05f18e969
|