CTFSHOW-Crypto系列WP(持续更新)

crypto14

题目描述:

00110011 00110011 00100000 00110100 00110101 00100000 00110101 00110000 00100000 00110010 01100110 00100000 00110011 00110011 00100000 00110101 00110110 00100000 00110100 01100101 00100000 00110100 00110110 00100000 00110100 00110110 00100000 00110110 01100100 00100000 00110100 01100101 00100000 00110100 00110101 00100000 00110100 00110001 00100000 00110110 01100101 00100000 00110110 01100011 00100000 00110100 00111000 00100000 00110100 00110100 00100000 00110011 00110101 00100000 00110110 00110100 00100000 00110100 00110011 00100000 00110100 01100100 00100000 00110110 01100100 00100000 00110101 00110110 00100000 00110100 00111000 00100000 00110100 00110100 00100000 00110011 00110101 00100000 00110110 00110001 00100000 00110110 00110100 00100000 00110011 00111001 00100000 00110111 00110101 00100000 00110100 00110111 00100000 00110000 01100001

题解:

二进制转字符,得到字符串:
“33 45 50 2f 33 56 4e 46 46 6d 4e 45 41 6e 6c 48 44 35 64 43 4d 6d 56 48 44 35 61 64 39 75 47 0a”
再16进制转字符:
“3EP/3VNFFmNEAnlHD5dCMmVHD5ad9uG”
得到的字符像Base64编码,与"flag"编码后的结果"ZmxhZw==",根据下表进行对比
在这里插入图片描述
3->55与Z->25在位置上相差30,E->4与m->38位置上相差30,可以用如下公式表示位置关系:
(x-g)%64 其中x是Cipher中的一个字符的位置,g是表格中一个字符的位置。因此写出题解代码

import base64
import libnum
import string
cipher = '3EP/3VNFFmNEAnlHD5dCMmVHD5ad9uG'
messsage = ''
str = string.ascii_uppercase+string.ascii_lowercase+string.digits+'+'+'/'
for i in cipher:
    messsage+=str[(str.index(i)-30)%64]
if len(messsage)%4!=0:
    messsage=messsage+'='*(4-(len(messsage)%4))
    #print(messsage)
    print(base64.b64decode(messsage).decode('UTF-8'))
#flag{看我长不长?}

萌新_密码5

题目描述:

Cipher= “由田中 由田井 羊夫 由田人 由中人 羊羊 由由王 由田中 由由大 由田工 由由由 由由羊 由中大”

题解:

Cipher是当铺密码

一种将中文和数字进行转化的密码,算法相当简单:当前汉字有多少笔画出头,就是转化成数字几。

例如:

王:该字外面有 6 个出头的位置,所以该汉字对应的数字就是 6;
口:该字外面没有出头的位置,那就是0;
人:该字外面有 3 个出头的位置,所以该汉字对应的数字就是 3;

由此观察Cipher由 “田由中人工大王夫井羊” 十个汉字构成,其中汉字出头数依次对应"0123456789",再观察Cipher前三个字 “由田中",正好是"102",ASCII码对应的是"f",由此写题解代码。

s = "田由中人工大王夫井羊"
cipher = "由田中 由田井 羊夫 由田人 由中人 羊羊 由由王 由田中 由由大 由田工 由由由 由由羊 由中大"
cipher=cipher.split(" ")
message=""
for i in cipher:
    assci=""
    for j in i:
        assci+=str(s.index(j))
    message+=chr(int(assci))
print(message)
#flag{ctfshow}

贝斯多少呢

题目描述:

Cipher= “8nCDq36gzGn8hf4M2HJUsn4aYcYRBSJwj4aE0hbgpzHb4aHcH1zzC9C3IL”

题解:

Cipher 是通过Base62分段编码得到的,因此可通过遍历分组的方式爆破得到,由此可写题解代码。

import string
import base62
from Crypto.Util.number import *

BASE62 = string.digits + string.ascii_uppercase + string.ascii_lowercase

def groupby(cipher, k):
    group_cipher = [cipher[i:i + k] for i in range(0, len(cipher), k)] //分组
    return group_cipher

if __name__ == '__main__':
    cipher = "8nCDq36gzGn8hf4M2HJUsn4aYcYRBSJwj4aE0hbgpzHb4aHcH1zzC9C3IL"
    for i in range(4, 21):
        try:
            cipherg = groupby(cipher, i)
            flag = ""
            for j in cipherg:
                flag += long_to_bytes(base62.decode(j, alphabet=BASE62)).decode()
            print(flag)
        except Exception as e:
            continue
# flag{6a5eb2_i5_u5ua11y_u5ed_f0r_5h0rt_ur1}

find the table

题目描述:
审查元素
题解:
F12找到审查元素位置得到Cipher=“9 57 64 8 39 8 92 3 19 99 102 74”,各个数字对应元素周期表。

babyrsa

题目描述:

e = 65537
p = 104046835712664064779194734974271185635538927889880611929931939711001301561682270177931622974642789920918902563361293345434055764293612446888383912807143394009019803471816448923969637980671221111117965227402429634935481868701166522350570364727873283332371986860194245739423508566783663380619142431820861051179
q = 140171048074107988605773731671018901813928130582422889797732071529733091703843710859282267763783461738242958098610949120354497987945911021170842457552182880133642711307227072133812253341129830416158450499258216967879857581565380890788395068130033931180395926482431150295880926480086317733457392573931410220501
c = 4772758911204771028049020670778336799568778930072841084057809867608022732611295305096052430641881550781141776498904005589873830973301898523644744951545345404578466176725030290421649344936952480254902939417215148205735730754808467351639943474816280980230447097444682489223054499524197909719857300597157406075069204315022703894466226179507627070835428226086509767746759353822302809385047763292891543697277097068406512924796409393289982738071019047393972959228919115821862868057003145401072581115989680686073663259771587445250687060240991265143919857962047718344017741878925867800431556311785625469001771370852474292194

题解:
普通的RSA题目,c,p,q,e都知道,直接上代码。

import gmpy2
from Crypto.Util.number import *

def RSA_Decry(C,P,Q,E):
    N = P*Q
    Phi = (P-1)*(Q-1)
    D = gmpy2.invert(E,Phi)
    M = pow(C,D,N)
    return long_to_bytes(M).decode()
if __name__ == '__main__':
    e = 65537
    p = 104046835712664064779194734974271185635538927889880611929931939711001301561682270177931622974642789920918902563361293345434055764293612446888383912807143394009019803471816448923969637980671221111117965227402429634935481868701166522350570364727873283332371986860194245739423508566783663380619142431820861051179
    q = 140171048074107988605773731671018901813928130582422889797732071529733091703843710859282267763783461738242958098610949120354497987945911021170842457552182880133642711307227072133812253341129830416158450499258216967879857581565380890788395068130033931180395926482431150295880926480086317733457392573931410220501
    c = 4772758911204771028049020670778336799568778930072841084057809867608022732611295305096052430641881550781141776498904005589873830973301898523644744951545345404578466176725030290421649344936952480254902939417215148205735730754808467351639943474816280980230447097444682489223054499524197909719857300597157406075069204315022703894466226179507627070835428226086509767746759353822302809385047763292891543697277097068406512924796409393289982738071019047393972959228919115821862868057003145401072581115989680686073663259771587445250687060240991265143919857962047718344017741878925867800431556311785625469001771370852474292194
    flag = RSA_Decry(c,p,q,e)
    print(flag)
    #flag{b4by_R5A}

easyrsa1

题目描述

e = 65537
n = 1455925529734358105461406532259911790807347616464991065301847
c = 69380371057914246192606760686152233225659503366319332065009

题解:
n比较小通过分解网站factordb将n分解,得到p,q,由此写代码。
在这里插入图片描述

import gmpy2
from Crypto.Util.number import *

def RSA_Decry(C,P,Q,E):
    N = P*Q
    Phi = (P-1)*(Q-1)
    D = gmpy2.invert(E,Phi)
    M = pow(C,D,N)
    return long_to_bytes(M).decode()
if __name__ == '__main__':
    e = 65537
    n = 1455925529734358105461406532259911790807347616464991065301847
    p = 1201147059438530786835365194567
    q = 1212112637077862917192191913841
    c = 69380371057914246192606760686152233225659503366319332065009
    flag = RSA_Decry(c,p,q,e)
    print(flag)
#flag{fact0r_sma11_N}

easyrsa2

题目描述:

e = 65537
n = 23686563925537577753047229040754282953352221724154495390687358877775380147605152455537988563490716943872517593212858326146811511103311865753018329109314623702207073882884251372553225986112006827111351501044972239272200616871716325265416115038890805114829315111950319183189591283821793237999044427887934536835813526748759612963103377803089900662509399569819785571492828112437312659229879806168758843603248823629821851053775458651933952183988482163950039248487270453888288427540305542824179951734412044985364866532124803746008139763081886781361488304666575456680411806505094963425401175510416864929601220556158569443747
c = 1627484142237897613944607828268981193911417408064824540711945192035649088104133038147400224070588410335190662682231189997580084680424209495303078061205122848904648319219646588720994019249279863462981015329483724747823991513714172478886306703290044871781158393304147301058706003793357846922086994952763485999282741595204008663847963539422096343391464527068599046946279309037212859931303335507455146001390326550668531665493245293839009832468668390820282664984066399051403227990068032226382222173478078505888238749583237980643698405005689247922901342204142833875409505180847943212126302482358445768662608278731750064815

e = 65537
n = 22257605320525584078180889073523223973924192984353847137164605186956629675938929585386392327672065524338176402496414014083816446508860530887742583338880317478862512306633061601510404960095143941320847160562050524072860211772522478494742213643890027443992183362678970426046765630946644339093149139143388752794932806956589884503569175226850419271095336798456238899009883100793515744579945854481430194879360765346236418019384644095257242811629393164402498261066077339304875212250897918420427814000142751282805980632089867108525335488018940091698609890995252413007073725850396076272027183422297684667565712022199054289711
c = 2742600695441836559469553702831098375948641915409106976157840377978123912007398753623461112659796209918866985480471911393362797753624479537646802510420415039461832118018849030580675249817576926858363541683135777239322002741820145944286109172066259843766755795255913189902403644721138554935991439893850589677849639263080528599197595705927535430942463184891689410078059090474682694886420022230657661157993875931600932763824618773420077273617106297660195179922018875399174346863404710420166497017196424586116535915712965147141775026549870636328195690774259990189286665844641289108474834973710730426105047318959307995062

题解:
N不互素,用的同一个公钥e加密,所以两个n直接存在共享素数,即p,因此写题解代码。

import gmpy2
from Crypto.Util.number import *

def RSA_Decry(C,P,Q,E):
    N = P*Q
    Phi = (P-1)*(Q-1)
    D = gmpy2.invert(E,Phi)
    M = pow(C,D,N)
    return long_to_bytes(M).decode()
if __name__ == '__main__':
    e = 65537
    n1 = 23686563925537577753047229040754282953352221724154495390687358877775380147605152455537988563490716943872517593212858326146811511103311865753018329109314623702207073882884251372553225986112006827111351501044972239272200616871716325265416115038890805114829315111950319183189591283821793237999044427887934536835813526748759612963103377803089900662509399569819785571492828112437312659229879806168758843603248823629821851053775458651933952183988482163950039248487270453888288427540305542824179951734412044985364866532124803746008139763081886781361488304666575456680411806505094963425401175510416864929601220556158569443747
    c1 = 1627484142237897613944607828268981193911417408064824540711945192035649088104133038147400224070588410335190662682231189997580084680424209495303078061205122848904648319219646588720994019249279863462981015329483724747823991513714172478886306703290044871781158393304147301058706003793357846922086994952763485999282741595204008663847963539422096343391464527068599046946279309037212859931303335507455146001390326550668531665493245293839009832468668390820282664984066399051403227990068032226382222173478078505888238749583237980643698405005689247922901342204142833875409505180847943212126302482358445768662608278731750064815

    e = 65537
    n2 = 22257605320525584078180889073523223973924192984353847137164605186956629675938929585386392327672065524338176402496414014083816446508860530887742583338880317478862512306633061601510404960095143941320847160562050524072860211772522478494742213643890027443992183362678970426046765630946644339093149139143388752794932806956589884503569175226850419271095336798456238899009883100793515744579945854481430194879360765346236418019384644095257242811629393164402498261066077339304875212250897918420427814000142751282805980632089867108525335488018940091698609890995252413007073725850396076272027183422297684667565712022199054289711
    c2 = 2742600695441836559469553702831098375948641915409106976157840377978123912007398753623461112659796209918866985480471911393362797753624479537646802510420415039461832118018849030580675249817576926858363541683135777239322002741820145944286109172066259843766755795255913189902403644721138554935991439893850589677849639263080528599197595705927535430942463184891689410078059090474682694886420022230657661157993875931600932763824618773420077273617106297660195179922018875399174346863404710420166497017196424586116535915712965147141775026549870636328195690774259990189286665844641289108474834973710730426105047318959307995062
    p = gmpy2.gcd(n1,n2)
    q = n1//p
    flag=RSA_Decry(c1,p,q,e)
    print(flag)
    #flag{m0_bv_hv_sv}

easyrsa3

题目描述:

    e1 = 797
    n = 159444754310880
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值