[QCTF2018]Xman-RSA

題目分析

這道題上來(lái)先把加密腳本用單表替換密碼加密了眶掌,解開(kāi)后又分為共模攻擊和p為n1,n2公因數(shù)的兩種類型RSA脓斩,解出密文后有一個(gè)對(duì)明文順序的加密。

解題

頻率分析

分析出來(lái)的腳本有個(gè)別地方不準(zhǔn)確,手動(dòng)更改一下

from gmpy2 import is_prime 
from os import urandom 
import base64 
def bytes_to_num(b): 
    return int(b.encode('hex'), 16) 
def num_to_bytes(n): 
    b = hex(n)[2:-1] 
    b = '0' + b 
    if len(b)%2 == 1 
        else b 
    return b.decode('hex') 
def get_a_prime(l): 
    random_seed = urandom(l) 
    num = bytes_to_num(random_seed) 
    while True: 
        if is_prime(num): 
            break 
        num+=1 
    return num 
def encrypt(s, e, n): 
    p = bytes_to_num(s) 
    p = pow(p, e, n) 
    return num_to_bytes(p).encode('hex') 
def separate(n): 
    p = n % 4 
    t = (p*p) % 4 
    return t == 1 
f = open('flag.txt', 'r') 
flag = f.read() 
msg1 = "" 
msg2 = "" 
for i in range(len(flag)): 
    if separate(i): 
        msg2 += flag[i] 
    else: msg1 += flag[i] 
p1 = get_a_prime(128) 
p2 = get_a_prime(128) 
p3 = get_a_prime(128) 
n1 = p1*p2 
n2 = p1*p3 
e = 0x1001 
c1 = encrypt(msg1, e, n1) 
c2 = encrypt(msg2, e, n2) 
print(c1) 
print(c2) 
e1 = 0x1001 
e2 = 0x101 
p4 = get_a_prime(128) 
p5 = get_a_prime(128) 
n3 = p4*p5 
c1 = num_to_bytes(pow(n1, e1, n3)).encode('hex') 
c2 = num_to_bytes(pow(n1, e2, n3)).encode('hex') 
print(c1) 
print(c2) 
print(base64.b64encode(num_to_bytes(n2))) 
print(base64.b64encode(num_to_bytes(n3)))

解題

①?gòu)念}中可以看出,n1和n2的公因數(shù)為p1变擒,我們只要知道p1,p2,p3這三個(gè)數(shù),就可以求解得到msg1和msg2,寝志,題中所給的文件里并沒(méi)有給出n1,解出n1成為了解題的關(guān)鍵娇斑。

p1=gcd(n1,n2)
p2=n1//p1
p3=n2//p1
e = 0x1001
d1=invert(e,(p1-1)*(p2-1))
d2=invert(e,(p1-1)*(p3-1))
msg1=pow(c3,d1,n1)
msg2=pow(c4,d2,n2)

②向后看可以發(fā)現(xiàn),后邊關(guān)于n1的加密是共模攻擊材部,按照共模攻擊的套路解出n1

e1 = 0x1001 
e2 = 0x101 
s1,s2=exgcdmoni.exgcd(e1,e2)
n1=powmod(c1,s1,n3)*powmod(c2,s2,n3)%n3

③解出msg1和msg2,把加密函數(shù)逆回去毫缆,這里需要m1和m2兩個(gè)計(jì)數(shù)器,分別控制msg1和msg2

msg1=(long_to_bytes(msg1)).decode()
msg2=(long_to_bytes(msg2)).decode()
def separate(n): 
    p = n % 4 
    t = (p*p) % 4 
    return t == 1
flag=''
m1=0
m2=0
for i in range(0,len(msg1)+len(msg2)):
    if separate(i):
        flag+=msg2[m1]
        m1+=1
    else:
        flag+=msg1[m2]
        m2+=1
print(flag)

完整代碼

from gmpy2 import *
from Crypto.Util.number import *
import base64,exgcdmoni
c1=0x2639c28e3609a4a8c953cca9c326e8e062756305ae8aee6efcd346458aade3ee8c2106ab9dfe5f470804f366af738aa493fd2dc26cb249a922e121287f3eddec0ed8dea89747dc57aed7cd2089d75c23a69bf601f490a64f73f6a583081ae3a7ed52238c13a95d3322065adba9053ee5b12f1de1873dbad9fbf4a50a2f58088df0fddfe2ed8ca1118c81268c8c0fd5572494276f4e48b5eb424f116e6f5e9d66da1b6b3a8f102539b690c1636e82906a46f3c5434d5b04ed7938861f8d453908970eccef07bf13f723d6fdd26a61be8b9462d0ddfbedc91886df194ea022e56c1780aa6c76b9f1c7d5ea743dc75cec3c805324e90ea577fa396a1effdafa3090
c2=0x42ff1157363d9cd10da64eb4382b6457ebb740dbef40ade9b24a174d0145adaa0115d86aa2fc2a41257f2b62486eaebb655925dac78dd8d13ab405aef5b8b8f9830094c712193500db49fb801e1368c73f88f6d8533c99c8e7259f8b9d1c926c47215ed327114f235ba8c873af7a0052aa2d32c52880db55c5615e5a1793b690c37efdd5e503f717bb8de716303e4d6c4116f62d81be852c5d36ef282a958d8c82cf3b458dcc8191dcc7b490f227d1562b1d57fbcf7bf4b78a5d90cd385fd79c8ca4688e7d62b3204aeaf9692ba4d4e44875eaa63642775846434f9ce51d138ca702d907849823b1e86896e4ea6223f93fae68b026cfe5fa5a665569a9e3948a
c3=0x1240198b148089290e375b999569f0d53c32d356b2e95f5acee070f016b3bef243d0b5e46d9ad7aa7dfe2f21bda920d0ac7ce7b1e48f22b2de410c6f391ce7c4347c65ffc9704ecb3068005e9f35cbbb7b27e0f7a18f4f42ae572d77aaa3ee189418d6a07bab7d93beaa365c98349d8599eb68d21313795f380f05f5b3dfdc6272635ede1f83d308c0fdb2baf444b9ee138132d0d532c3c7e60efb25b9bf9cb62dba9833aa3706344229bd6045f0877661a073b6deef2763452d0ad7ab3404ba494b93fd6dfdf4c28e4fe83a72884a99ddf15ca030ace978f2da87b79b4f504f1d15b5b96c654f6cd5179b72ed5f84d3a16a8f0d5bf6774e7fd98d27bf3c9839
c4=0x129d5d4ab3f9e8017d4e6761702467bbeb1b884b6c4f8ff397d078a8c41186a3d52977fa2307d5b6a0ad01fedfc3ba7b70f776ba3790a43444fb954e5afd64b1a3abeb6507cf70a5eb44678a886adf81cb4848a35afb4db7cd7818f566c7e6e2911f5ababdbdd2d4ff9825827e58d48d5466e021a64599b3e867840c07e29582961f81643df07f678a61a9f9027ebd34094e272dfbdc4619fa0ac60f0189af785df77e7ec784e086cf692a7bf7113a7fb8446a65efa8b431c6f72c14bcfa49c9b491fb1d87f2570059e0f13166a85bb555b40549f45f04bc5dbd09d8b858a5382be6497d88197ffb86381085756365bd757ec3cdfa8a77ba1728ec2de596c5ab
n2='PVNHb2BfGAnmxLrbKhgsYXRwWIL9eOj6K0s3I0slKHCTXTAUtZh3T0r+RoSlhpO3+77AY8P7WETYz2Jzuv5FV/mMODoFrM5fMyQsNt90VynR6J3Jv+fnPJPsm2hJ1Fqt7EKaVRwCbt6a4BdcRoHJsYN/+eh7k/X+FL5XM7viyvQxyFawQrhSV79FIoX6xfjtGW+uAeVF7DScRcl49dlwODhFD7SeLqzoYDJPIQS+VSb3YtvrDgdV+EhuS1bfWvkkXRijlJEpLrgWYmMdfsYX8u/+Ylf5xcBGn3hv1YhQrBCg77AHuUF2w/gJ/ADHFiMcH3ux3nqOsuwnbGSr7jA6Cw=='
n3='TmNVbWUhCXR1od3gBpM+HGMKK/4ErfIKITxomQ/QmNCZlzmmsNyPXQBiMEeUB8udO7lWjQTYGjD6k21xjThHTNDG4z6C2cNNPz73VIaNTGz0hrh6CmqDowFbyrk+rv53QSkVKPa8EZnFKwGz9B3zXimm1D+01cov7V/ZDfrHrEjsDkgK4ZlrQxPpZAPl+yqGlRK8soBKhY/PF3/GjbquRYeYKbagpUmWOhLnF4/+DP33ve/EpaSAPirZXzf8hyatL4/5tAZ0uNq9W6T4GoMG+N7aS2GeyUA2sLJMHymW4cFK5l5kUvjslRdXOHTmz5eHxqIV6TmSBQRgovUijlNamQ=='
n2=bytes_to_long(base64.b64decode(n2))
n3=bytes_to_long(base64.b64decode(n3))
e1 = 0x1001 
e2 = 0x101 
s1,s2=exgcdmoni.exgcd(e1,e2)
n1=powmod(c1,s1,n3)*powmod(c2,s2,n3)%n3
p1=gcd(n1,n2)
p2=n1//p1
p3=n2//p1
e = 0x1001
d1=invert(e,(p1-1)*(p2-1))
d2=invert(e,(p1-1)*(p3-1))
msg1=pow(c3,d1,n1)
msg2=pow(c4,d2,n2)
msg1=(long_to_bytes(msg1)).decode()
msg2=(long_to_bytes(msg2)).decode()
def separate(n): 
    p = n % 4 
    t = (p*p) % 4 
    return t == 1
flag=''
m1=0
m2=0
for i in range(0,len(msg1)+len(msg2)):
    if separate(i):
        flag+=msg2[m1]
        m1+=1
    else:
        flag+=msg1[m2]
        m2+=1
print(flag)

遇到的問(wèn)題

這里發(fā)現(xiàn)字節(jié)類型的直接對(duì)其索引乐导,會(huì)返回Int型數(shù)值

b=b'adkfh'
print(b[0])
>>97

所以最后一步解密時(shí)記得轉(zhuǎn)成字符串

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末苦丁,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子物臂,更是在濱河造成了極大的恐慌旺拉,老刑警劉巖产上,帶你破解...
    沈念sama閱讀 218,386評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異蛾狗,居然都是意外死亡蒂秘,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門淘太,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)姻僧,“玉大人,你說(shuō)我怎么就攤上這事蒲牧∑埠兀” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 164,704評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵冰抢,是天一觀的道長(zhǎng)松嘶。 經(jīng)常有香客問(wèn)我,道長(zhǎng)挎扰,這世上最難降的妖魔是什么翠订? 我笑而不...
    開(kāi)封第一講書人閱讀 58,702評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮遵倦,結(jié)果婚禮上尽超,老公的妹妹穿的比我還像新娘。我一直安慰自己梧躺,他們只是感情好似谁,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,716評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著掠哥,像睡著了一般巩踏。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上续搀,一...
    開(kāi)封第一講書人閱讀 51,573評(píng)論 1 305
  • 那天塞琼,我揣著相機(jī)與錄音,去河邊找鬼禁舷。 笑死彪杉,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的榛了。 我是一名探鬼主播在讶,決...
    沈念sama閱讀 40,314評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼煞抬,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼霜大!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起革答,我...
    開(kāi)封第一講書人閱讀 39,230評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤战坤,失蹤者是張志新(化名)和其女友劉穎曙强,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體途茫,經(jīng)...
    沈念sama閱讀 45,680評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡碟嘴,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,873評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了囊卜。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片娜扇。...
    茶點(diǎn)故事閱讀 39,991評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖栅组,靈堂內(nèi)的尸體忽然破棺而出雀瓢,到底是詐尸還是另有隱情,我是刑警寧澤玉掸,帶...
    沈念sama閱讀 35,706評(píng)論 5 346
  • 正文 年R本政府宣布刃麸,位于F島的核電站,受9級(jí)特大地震影響司浪,放射性物質(zhì)發(fā)生泄漏泊业。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,329評(píng)論 3 330
  • 文/蒙蒙 一啊易、第九天 我趴在偏房一處隱蔽的房頂上張望吁伺。 院中可真熱鬧,春花似錦租谈、人聲如沸箱蝠。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,910評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)宦搬。三九已至,卻和暖如春劫拗,著一層夾襖步出監(jiān)牢的瞬間间校,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,038評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工页慷, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留憔足,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,158評(píng)論 3 370
  • 正文 我出身青樓酒繁,卻偏偏與公主長(zhǎng)得像滓彰,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子州袒,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,941評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 近期因?yàn)橐恍┍荣愐约捌渌蚪野螅偨Y(jié)了一些RSA方面的東西,于是在這里與大家分享,希望大家能有所收獲他匪,如有不當(dāng)之處敬...
    readilen閱讀 17,318評(píng)論 1 11
  • 一菇存、概述二、對(duì)稱加密三邦蜜、RSA加密四依鸥、OpenSSL使用 一、概述 RSA是一種非對(duì)稱加密算法悼沈,1977年由羅納德...
    yahibo閱讀 603評(píng)論 0 8
  • RSA介紹 RSA 加密算法是一種非對(duì)稱加密算法贱迟。在公開(kāi)密鑰加密和電子商業(yè)中 RSA 被廣泛使用。RSA 算法的可...
    懶貓餅閱讀 3,906評(píng)論 0 0
  • 一絮供、RSA的歷史 1976 年以前关筒,所有的加密方法都是同一種模式: (1)甲方選擇某一種加密規(guī)則,對(duì)信息進(jìn)行加密杯缺;...
    開(kāi)著保時(shí)捷堵你家門口閱讀 2,340評(píng)論 0 1
  • Hi 這兒顧知寒 也是阿漓 ^02中秋/坐標(biāo)江西九江/17年高一 ^目標(biāo):中山大學(xué) ?八月長(zhǎng)安是我的光 更是人類之...
    是知寒呀呀呀閱讀 426評(píng)論 0 0