Bugku-rsa

题目描述在这里插入图片描述

典型的rsa…

原理

密钥的产生:

  • 选择两个满足需要的大素数 p p p q q q,计算 n n n= p p p x q q q, φ \varphi φ(n) = (p - 1) x (q - 1),其中 φ \varphi φ(n)是n的欧拉函数值。
  • 选一个整数 e e e,满足1 < < < e < < < φ \varphi φ,且gcd( φ \varphi φ(n), e) = = = 1。通过 d d d x e e e ≡ \equiv 1 mod φ \varphi φ(n),计算得出d。
  • { \lbrace { e e e, n n n } \rbrace }为公开密钥, { \lbrace { d d d, n n n } \rbrace }为私钥。

加解密都为模幂运算

加密:

c c c = m e m^e me mod n n n,即得到密文 c c c

解密:

m m m = c d c^d cd mod n n n,即得到明文 m m m

分析

题中给了 n n n即由两个打素数 p p p x q q q得到的, e e e, 以及密文 e n c enc enc,也就是给了 { \lbrace { e e e, n n n } \rbrace }公开密钥以及密文,我们需要的目标是要获得明文。

通过解密算法我们知道,对于 m m m = c d c^d cd mod n n n m m m是我们想要获取的, c c c为密文, n n n也是已知的,然而 d d d是不知道的,目标就是要获取 d d d,该题因为n和e是同数量级的,证明d会很小。

解决方案

这里推荐一个工具https://github.com/Ganapati/RsaCtfTool

下面可直接利用这个工具获得 p p p, q q q d d d

python RsaCtfTool.py --createpub -n 460657813884289609896372056585544172485318117026246263899744329237492701820627219556007788200590119136173895989001382151536006853823326382892363143604314518686388786002989248800814861248595075326277099645338694977097459168530898776007293695728101976069423971696524237755227187061418202849911479124793990722597 -e 354611102441307572056572181827925899198345350228753730931089393275463916544456626894245415096107834465778409532373187125318554614722599301791528916212839368121066035541008808261534500586023652767712271625785204280964688004680328300124849680477105302519377370092578107827116821391826210972320377614967547827619 > test.pem
python RsaCtfTool.py --publickey test.pem --private > test.key
python RsaCtfTool.py --key test.key --dumpkey

Bugku-rsa_第1张图片
下面直接进行解密运算就可以了

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# author: moddemod
# datetime: 2019/12/25 下午4:21 
# ide: PyCharm

import gmpy2
from libnum import n2s
n = '460657813884289609896372056585544172485318117026246263899744329237492701820627219556007788200590119136173895989001382151536006853823326382892363143604314518686388786002989248800814861248595075326277099645338694977097459168530898776007293695728101976069423971696524237755227187061418202849911479124793990722597'
e = '354611102441307572056572181827925899198345350228753730931089393275463916544456626894245415096107834465778409532373187125318554614722599301791528916212839368121066035541008808261534500586023652767712271625785204280964688004680328300124849680477105302519377370092578107827116821391826210972320377614967547827619'
enc = '38230991316229399651823567590692301060044620412191737764632384680546256228451518238842965221394711848337832459443844446889468362154188214840736744657885858943810177675871991111466653158257191139605699916347308294995664530280816850482740530602254559123759121106338359220242637775919026933563326069449424391192'

p = '15991846970993213322072626901560749932686325766403404864023341810735319249066370916090640926219079368845510444031400322229147771682961132420481897362843199'
q = '28805791771260259486856902729020438686670354441296247148207862836064657849735343618207098163901787287368569768472521344635567334299356760080507454640207003'
d = '8264667972294275017293339772371783322168822149471976834221082393409363691895'

n1 = gmpy2.mpz(n)
enc1 = gmpy2.mpz(enc)
d1 = gmpy2.mpz(d)

r = gmpy2.powmod(enc1, d1, n1)
# print(r)
s = n2s(r)
print(s)

结果为:

flag{Wien3r_4tt@ck_1s_3AsY}

你可能感兴趣的:(bugku,密码学,rsa,bugku,密码学)