buu [HDCTF2019]basic rsa

鹹魚壹號發表於2020-11-30

下載得到一個py
在這裡插入圖片描述
型別:n+e+c+p+q= m
註釋中就是該指令碼生成的c
使用指令碼RSA各題型指令碼\n+e+c+p+q= m
直接套用指令碼

import random
from binascii import a2b_hex,b2a_hex
p = 262248800182277040650192055439906580479
q = 262854994239322828547925595487519915551
n = p * q
def multiplicative_inversr(a,b):
    x = 0
    y = 1
    lx = 1
    ly = 0
    oa = a
    ob = b
    while b != 0:
        q = a // b
        (a, b) = (b, a % b)
        (x, lx) = ((lx - (q * x)), x)
        (y, ly) = ((ly - (q * y)), y)
    if lx < 0:
        lx += ob
    if ly < 0:
        ly += oa
    return lx
def gcd(a,b):
    while b != 0:
        a, b = b, a % b
    return a
def generate_keypair(p,q):
    n = p * q
    phi = (p - 1) * (q -1)
    e = 65533
    g = gcd(e, phi)
    while g != 1:
        e = random.randrange(1, phi)
        g = gcd(e, phi)
    d = multiplicative_inversr(e, phi)
    return ((e,n),(d,n))
def encrypt(pk, plaintext):
    key, n = pk[0]
    print(b2a_hex(plaintext.encode()))
    cipher = pow(int(b2a_hex(plaintext.encode()),16), key , n)
    return cipher
def decrypt(pk, cipher):
    key, n = pk[1]
    cipher = pow(cipher, key ,n)
    cipher = a2b_hex(hex(cipher).split('0x')[1])
    return cipher
pk = generate_keypair(p,q)
cipher = 27565231154623519221597938803435789010285480123476977081867877272451638645710
plaintext = decrypt(pk, cipher)
print(plaintext)

執行得到flag 提交即可
在這裡插入圖片描述

解題思路
首先這道題題目是達芬奇密碼,百度之後發現這是一部電影,當時也沒想的去看一下電影的簡介什麼的,後面加buuctf關鍵字,也沒有找到相應的wp。果斷google,找到大佬的wp,發現在電影簡介中會提到——斐波那契數列。

1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 10946 17711 28657 46368 75025 121393 196418 317811 514229 832040 1346269 2178309
1
對比蒙娜麗莎中的數字列,發現數值一樣,但是進行了位移。

之後對比,題目中給到的兩個數列的長度都是32,並且flag也是32位,可以推測,神祕數列是通過flag位移後得出的,而位移的規則是斐波那契數列的位移。

1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 10946 17711 28657 46368 75025 121393 196418 317811 514229 832040 1346269 2178309

1 233 3 2584 1346269 144 5 196418 21 1597 610 377 10946 89 514229 987 8 55 6765 2178309 121393 317811 46368 4181 1 832040 2 28657 75025 34 13 17711

36968853882116725547342176952286
1
2
3
4
5
6
7
規則如下:

第零位1還是1,沒有位移。

第一位233是斐波那契數列的第十二位(以0開始算),因此下面神祕數字串的第一位的6是原本flag的第十二位。

第二位3是斐波那契數列的第三位,因此下面神祕數字串的第二位的9是原本flag的第三位。

以此類推…,寫出如下指令碼。