BUU-Crypto-第二章

2022-03-22 11:14:35 浏览数 (1)

好耶,排名涨到12000 了,就做了十道题就涨了近4000名,瞬间信心就上来了,同时也说明一个问题,绝大多数萌新就在一开始就放弃了,但是如果能静下心来,慢慢钻研,就能有所突破。

9.Rabbit

代码语言:javascript复制
题目:U2FsdGVkX1/ ydnDPowGbjjJXhZxm2MP2AgI

Rabbit密码在比赛非常常见,我参加的两场线下赛都遇到了,第一次是刚上大二那会,由于没遇到过这种加密方式还是没能解出来(其实就是我太菜了)

代码语言:javascript复制
这种加密的特征是:有U2Fsd开头

关于Rabbit加密我在网站上暂时没有找到相关信息,查阅书籍也是一无所获,如果后期有相关的解析,我会更新脚本。 这里就用工具解一次吧

代码语言:javascript复制
在线解密:
https://www.sojson.com/encrypt_rabbit.html
输出结果:Cute_Rabbit
flag{Cute_Rabbit}

今天中秋节放假,我也去休息了,明天继续续更。

10.篱笆墙的影子

题目描述:

代码语言:javascript复制
星星还是那颗星星哟 月亮还是那个月亮 山也还是那座山哟 
梁也还是那道梁 碾子是碾子 缸是缸哟 爹是爹来娘是娘 
麻油灯呵还吱吱响 点的还是那么丁点亮 哦哦 
注意:得到的 flag 请包上 flag{} 提交
题目:felhaagv{ewtehtehfilnakgw}

分析一波,这个密文格式看样子是已经有两个大括号了,那么解密就是要把这些字母已一种特定的方式排序。 如果有一定基础的可以看出这是个栅栏密码,那现在就给萌新科普一下:

所谓栅栏密码,就是把要加密的明文分成N个一组,然后把每组的第1个字连起来,形成一段无规律的话。 不过栅栏密码本身有一个潜规则,就是组成栅栏的字母一般不会太多。(一般情况不超过30个)

这里再来个简单的例子:

代码语言:javascript复制
比如明文:THEREISACIPHER
两个一组 得到:TH ER EI SA CI PH ER
先取出第一个字母:TEESCPE
再取出第二个字母:HRIAIHR
连在一起得到密文:TEESCPEHRIAIHR
而解密的时候,我们先把密文从中间分开,变为两行:
T E E S C P E
H R I A I H R
再按上下上下的顺序组合起来:
得到明文:THEREISACIPHER

这里大概就懂原理了吧,那么-上脚本!

代码语言:javascript复制
def zhalan(e):
    elen = len(e)
    field = []
    for i in range(2, elen):
        if (elen % i == 0):
            field.append(i)

    for f in field:
        b = elen // f
        result = {x: '' for x in range(b)}
        for i in range(elen):
            a = i % b;
            result.update({a: result[a]   e[i]})
        d = ''
        for i in range(b):
            d = d   result[i]
        print(d)
        d.lower()
if __name__ == '__main__':
    e = 'felhaagv{ewtehtehfilnakgw}' 这里是题目给的密文
    zhalan(e)

通常结果会将所有情况输出,我们只要找出带有flag的明文或有特殊意义的字符串就是flag了。

11.RSA

题目:

代码语言:javascript复制
注意:得到的 flag 请将noxCTF替换为flag格式为flag{}提交。
在一次RSA密钥对生成中,假设p=473398607161,q=4511491,e=17
求解出d作为flga提交

RSA加密算法的知识点:

根据上述的信息,我们简单用Python来写个脚本:

代码语言:javascript复制
import gmpy2
p=473398607161
q=4511491
e=17
d=gmpy2.invert(e,(q-1)*(p-1))
解释:d = gmpy2.invert(e,n) # 求逆元,de = 1 mod n
print (d)

12.丢失的MD5

题目:

代码语言:javascript复制
import hashlib   
for i in range(32,127):
    for j in range(32,127):
        for k in range(32,127):
            m=hashlib.md5()
            m.update('TASC' chr(i) 'O3RJMV' chr(j) 'WDJKX' chr(k) 'ZM')
            des=m.hexdigest()
            if 'e9032' in des and 'da' in des and '911513' in des:
                print (des)

直接给了一段代码,题目说的是MD5,那么我们从MD5的角度来分析一波。 MD5特征:一般为16或32位(字母 数字) 现在我们就来审计这段代码,尝试改一改,让它能运行起来。 更改脚本:

代码语言:javascript复制
import hashlib   
for i in range(32,127):
    for j in range(32,127):
        for k in range(32,127):
            m=hashlib.md5()
            m.update('TASC' chr(i) 'O3RJMV' chr(j) 'WDJKX' chr(k) 'ZM')
            #这里改一下,因为MD5哈希运算之前,要对数据进行编码
            m.update('TASC'.encode('utf-8') chr(i).encode('utf-8') 'O3RJMV'.encode('utf-8') chr(j).encode('utf-8') 
            'WDJKX'.encode('utf-8') chr(k).encode('utf-8') 'ZM'.encode('utf-8'))
            des=m.hexdigest()
            if 'e9032' in des and 'da' in des and '911513' in des:
                print (des)

运行截图:

13.Alice与Bob

题目:

代码语言:javascript复制
密码学历史中,有两位知名的杰出人物,Alice和Bob。他们的爱情经过置换和轮加密也难以混淆,即使是没有
身份认证也可以知根知底。就像在数学王国中的素数一样,孤傲又热情。
下面是一个大整数:98554799767,请分解为两个素数,分解后,小的放前面,大的放后面,合成一个新的数字,
进行md5的32位小写哈希,提交答案。 注意:得到的 flag 请包上 flag{} 提交

这基本上就是一道密码学计算题了,我们计算出值提交即可。 第一步:将大整数分解为两个素数 整数分解(RSA算法),这个数太大了,脚本分解不了,还是上网站解。

代码语言:javascript复制
网址:http://www.factordb.com/index.php
代码语言:javascript复制
98554799767<11> = 101999 · 966233

第二步: 小数在前,大数在后,合起来新的数字:101999966233 第三步: 进行md5的32位小写哈希:

14.rsarsa

题目:

代码语言:javascript复制
Math is cool! Use the RSA algorithm to decode the secret message,
c, p, q, and e are parameters for the RSA algorithm.
p=
964842302901051567659055174001042653494573763923573980064
39893520398525072984913995610350091634270503701075707336333
50911691280297777160200625281665378483

q =  
11874843837980297032092405848653656852760910154543380907
650040190704283358909208578251063047732443992230647903
887510065547947313543299303261986053486569407

e =  65537

c =       
83208298995174604174773590298203639360540024871256126892889
661345742403314929861939100492666605647316646576486526217
457006376842280869728581726746401583705899941768214138
7422596893348407356335530538876418476511737762518202930
872128856701803674068074067659236389731613758173
92737747832762751690104423869019034

RSA前面有讲,现在我们来直接解题。 脚本:

代码语言:javascript复制
e = 65537
p = 9648423029010515676590551740010426534945737639235739800643989352039852507298491399561035009163427050370107570733633350911691280297777160200625281665378483
q = 11874843837980297032092405848653656852760910154543380907650040190704283358909208578251063047732443992230647903887510065547947313543299303261986053486569407
n = p*q
#密文
C = 83208298995174604174773590298203639360540024871256126892889661345742403314929861939100492666605647316646576486526217457006376842280869728581726746401583705899941768214138742259689334840735633553053887641847651173776251820293087212885670180367406807406765923638973161375817392737747832762751690104423869019034

d = 56632047571190660567520341028861194862411428416862507034762587229995138605649836960220619903456392752115943299335385163216233744624623848874235303309636393446736347238627793022725260986466957974753004129210680401432377444984195145009801967391196615524488853620232925992387563270746297909112117451398527453977

#求明文
M = pow(C,d,n)    #快速求幂取模运算
print(M)
#解出flag{5577446633554466577768879988}

运行截图:

代码语言:javascript复制
flag:flag{5577446633554466577768879988}

15.大帝的密码武器

题目:

这道题就立马就不一样了,是个不可执行文件,有可能需要我们给它一个属性,试试zip.txt

那么zip.zip呢,再来试试。

不错,来看看题目:

题目说的很明白了已经,应该就是凯撒加密,我们先把题目给的密文解密,得出的密钥再加密给的明文,被加密的密文就是flag了。 开始搞:直接上脚本

代码语言:javascript复制
str1 = 'FRPHEVGL'
str2 = str1.lower()                                 #转换为小写方便识别
num = 1                                             #偏移量
for i in range(26):
    print("{:<2d}".format(num),end = ' ')
    for temp in str2:
        if(ord(temp) num > ord('z')):               #如果超出'z',需要重新映射会a~z这26个字母上
            print(chr(ord(temp) num-26),end = '')
        else:
            print(chr(ord(temp) num),end = '')
    num  = 1
    print('')
    str = 'ComeChina'
    for temp in str:
        if (ord(temp)   13 > ord('z')):
            print(chr(ord(temp)   13 - 26), end='')
        else:
            print(chr(ord(temp)   13), end='')
    print('')

运行结果:

可以看出位移量是13的时候,我们得到明文:security 好,现在用我们得到key去加密题目给的密文。 继续上脚本:

代码语言:javascript复制
import string
def kaisa(s, k): #定义函数 接受一个字符串s 和 一个偏移量k
    lower = string.ascii_lowercase #小写字母
    upper = string.ascii_uppercase #大写字母
    before = string.ascii_letters #无偏移的字母顺序 小写 大写
    after = lower[k:]   lower[:k]   upper[k:]   upper[:k]#偏移后的字母顺序 还是小写 大写
    #分别把小写字母和大写字母偏移后再加到一起 
    table = ''.maketrans(before, after)  #创建映射表
    return s.translate(table) #对s进行偏移 即加密 
s = input('请输入一个字符串:')
k = int(input('请输入一个整数密钥:')) 
print(kaisa(s, k))

运行结果:PbzrPuvan

16.Windows系统密码

题目:

代码语言:javascript复制
Administrator:500:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
ctf:1002:06af9108f2e1fecf144e2e8adef09efd:a7fcb22a88038f35a8f39d503e7f0062:::
Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
SUPPORT_388945a0:1001:aad3b435b51404eeaad3b435b51404ee:bef14eee40dffbc345eeb3f58e290d56:::

尝试用md5解密,无果。 于是对自组字符串都进行了md5,得到了明文,在第二句ctf中。

flag{good-luck} 这道题目没什么好说的,就是考察对被加密的密文特征有一定的判断性,这里补充一下md5加密的特征:
代码语言:javascript复制
一般MD5值是32位由数字“0-9”和字母“a-f”所组成的字符串。
如果出现这个范围以外的字符说明这可能是个错误的md5值,就没必要再拿去解密了。
1.确定性:一个原始数据的MD5值是唯一的,同一个原始数据不可能会计算出多个不同的MD5值。
2.碰撞性:原始数据与其MD5值并不是一一对应的,有可能多个原始数据计算出来的MD5值是一样的,这就是碰撞。
3.不可逆:也就是说如果告诉你一个MD5值,你是无法通过它还原出它的原始数据的,这是由它的算法所决定的。
  一个给定的MD5值是可能对应多个原始数据的,并且理论上讲是可以对应无限多个原始数据。
  所有无法确定到底是由哪个原始数据产生的。

0 人点赞