当前位置:   article > 正文

CTF Crypto简单题学习思路总结(持续更新)_简单的base(crypto)

简单的base(crypto)

系列文章目录

本系列开篇文章,就没有链接了。


前言

以前在上大学的时候,经常听老师在专业介绍上讲物联网安全,大学期间眼光短浅总对网络安全提不起兴趣,一是当时我觉得网络安全对我太抽象,二是当时我的方向不在这一块。直到今年七月份,我在准备另一场计算机比赛的时候无意间接触到了CTF竞赛,其中最开始接触的是杂项,但由于太过杂乱就暂时先不整理,但是杂项中的推理深深的吸引了我(当时刚学了逻辑,沉迷于推理),于是开始接触CTF,当然我也是野路子出身,没有系统地学习过网络安全,所以难免有很多错误,大佬们想喷就喷,我看到书上写道:“边学习基础知识,边去参加线上赛,在比赛中学习,然后在比赛后整理题目,就可以快速学习。于是我前几天参加了几个简单线上赛,虽然很多题目不会,但是边搜边学,还是学到了很多东西,于是开这个坑来记录一下这些简单题的思路和使用的工具,以备不时之需。欢迎各位大佬指导。如果有侵犯您的权利,请联系我删除这篇文章。
我主要参考的书籍是:
CTF安全竞赛入门》《CTF特训营》
(刚入门而且我没有计算机基础(准确说是忘了,现在的计算机基础只剩当年写简单操作系统内核的时候学的一点操作系统和前几天复习的python还有以前参赛经验学的单片机的一点点知识)所以还没有看更具体的书)
题目来源:
各种线上赛,bugku等。

一、编码/解码

1.1 BrainFuck密码&ook!密码

这两者都是极小化的计算机语言,比较好识别。比如BrainFuck密码是由“>”、“<”、“+”、“-”、“.”、“,”、“[”、“]”组成,而ook密码典型的是含有大量ook,但是也出现了一种短ook的密码,具体题目会有暗示或者一堆标点符号。
ook类在线解密:https://www.splitbrain.org/services/ook

1.2 URL编码&HTML实体编码

URL编码这个我很早很早以前在刚学完十六进制分析文件时候就遇到过,可惜当时没学过,,URL的编码风格是“%+十六进制数值”,在线工具解码即可
HTML编码识别特征是“&#+数值”,在线工具或Converter转换即可

1.3 Unicode编码&XXencode编码&AAencode编码&Quoted-Printable编码

(1)Unicode编码:这类题的识别特征是“\u+四位数字”,这个识别出是Unicode后用编码工具Unicode解码就解决了
(2)XXencode编码:这种题我只见过一次,并且有提示是XXencode,所以我暂时还没想到识别办法
(3)AAencode编码:AAencode编码太好识别了,这个就是颜文字~~(⊙o⊙)?~~,书上说将密文放到浏览器的控制台中回车得到明文,我也没试过嘻嘻(偷懒)
但在此mark一个题,我在一次线上赛中遇到过不是颜文字,而是表情符号emoji的编码,这个题没留下原题,而且也没解出来,若我以后再遇到这种题再回来更新
(4)Quoted-Printable编码:这个识别是密文有大量的等于号,并且每个等于号后面大概率有两个字符,使用工具解码即可,还没遇见这样的题,遇到再说

1.4 base家族

这个稍微复杂点,等我学完原理再来掰扯(我太菜了)
————————————————————————
2022.10.26
之前在线上赛发现了一个特别好使的base脚本,可以破解base16,32,64,91,92(没记错的话),下面是链接:
https://download.csdn.net/download/zss192/12133420?utm_medium=distribute.pc_relevant_download.none-task-download-2defaultBlogCommendFromBaiduRate-3-12133420-download-16675859.topnsimilar_compare_v2&depth_1-utm_source=distribute.pc_relevant_download.none-task-download-2defaultBlogCommendFromBaiduRate-3-12133420-download-16675859.topnsimilar_compare_v2&dest=https%3A%2F%2Fdownload.csdn.net%2Fdownload%2Fzss192%2F12133420&spm=1003.2020.3001.6616.3
其中有一点小问题,就是Import导入base92python3可能会遇到一些问题,python3.10似乎没有easy_install,之后Windows下的安装可能会遇到文件夹无权限的情况,所以需要设置文件夹权限,而Linux下也会遇到这种情况,但是文件夹权限相比Windows似乎简单的多,cmd或终端提示哪个文件夹没啥权限参考设置文件夹权限
ps:我在Windows下安装包没有成功,但在Kali中安装成功了

1.5 社会主义核心价值观编码

这个太好识别,学过社会主义核心价值观的一眼就能看出,其就是社会主义核心价值观的词组成的密文,在线工具解码即可

二、古典密码

2.1 移位密码

如果题目给出一个字符串,但字符串依稀能够看出flag{}(得益于语言打乱后也能正确阅读233333),需要考虑是否是移位密码。移位密码写一个python脚本解决:
代码出自《CTF安全竞赛入门》,书上运行环境是python2,我稍微修改了一下变成了python3环境下运行的,但代码不是我写的。

import math

ciphertext = ''

key = 14

numro = key
numcol = round(len(ciphertext)/key)
numshado = (numcol * numro) - len(ciphertext)
plaintext = ['']*int(numcol)

col = 0
ro = 0

for symbol in ciphertext:
    plaintext[col] += symbol
    col += 1

    if(col == numcol) or (ro >= numro - numshado):
        col = 0
        ro += 1

    print(''.join(plaintext))

    #THE FLAG YOU ARE LOOKING FOR IS FD3VDUF1SK3U..
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

这里的字符串是我在一个线上赛里面遇到的,但是否有后一步我暂时不清楚(我太菜了),但是我大致猜了猜是有后一步的。
——————————————————————————————————————————
2022.10.26

2.1.1 曲路密码

明文填入一个表中,并按照一定的曲路遍历,是移位密码的一种

2.1.2 云影密码

云影密码仅包含01248五个数字,其中0用于分割字符,其余数字用于做加和操作之后转换为明文

2.2 栅栏密码

题目一般会提示栅栏(比如栏杆啊等等,因为栅栏解密需要一个栏杆数),解栅栏密码可以用线上工具,似乎难度不大,但主要是考脑洞,能不能想到这一点,与之类似的还有希尔(Hill)解密(bugku上就有一道题的标题叫小山丘23333333)。
栅栏解密在线工具:https://ctf.bugku.com/tool/railfence
也有线下的工具,我看bugku评论在喷在线工具,可能我解这个题的时候没有遇到啥bug吧。

2.3 培根密码&摩斯密码

lei了lei了,各种奇奇怪怪的题出现了。培根密码是一种替换密码,每个明文字母被一个五个字符组成的序列表示。最初的方式是A和B两个字符组成(二元字符,5个长度),这个有点类似常见的摩斯密码(点和杠),但摩斯密码并不是固定5个长度。因此出现二元化的字符(比如两种字母,字母大小写)和5的倍数长度的字符串,要考虑培根密码,题目一般也会给出提示。
比如在一次线上赛,我在晃悠着找签到题,但是每个密码学的题目看了看都很复杂(我看到了RSA的简单题,虽然有固定思路但是懒得动233333333),偶然间我打开了一个题,看到了字符串是5个5个一组,两种字母组成,嘿这不就是典型的培根密码吗,解出flag后提交flag时发现,这题叫作breakfast(早餐)哈哈哈哈哈哈原来暗示在这。
当然上述题目是最简单的签到题,还有稍微增加一点点点难度的(没别的意思就是稍稍修改了一下),你会发现是5个字符组成字符串,很明显的培根密码,但是你对照密码表发现解不出来,因为出题人把两种字符倒过来了,比如AAAAB变成了BAAAA,这时如果懒的话直接写个脚本解决就好。
还有一类脑洞比较大的题,比如:
在这里插入图片描述

可以看到只有一个链接,但这个链接藏着一个密码(这个题我稍微简化了一下),但是怎么看也没看出有什么特征。
但是将链接中的标点去掉后,链接会变成一个字符串HttPpcatcnbloGscOMHh,字符串正好是5的倍数,而且大小写正好是二元化,于是联想到培根密码,大写字母作B,小写字母作A,解密后得到密码。
请添加图片描述
摩斯密码这个可太出名了,没啥好讲的,直接在线解密工具:http://www.all-tool.cn/Tools/morse/?&rand=e68158465290e3180b7e7091c14e36d4

2.4 九宫格密码&键盘密码

手机的数字键盘和九宫格输入的结合,通过两个数字定位到具体字符。这种密码的发现主要题目中都会暗示密码和手机相关。与之相似的还有键盘密码,也会提示密码和键盘相关。手机九宫格和键盘解密直接对照密码表,当然可以斩草除根的用脚本一劳永逸。
在这里插入图片描述

2.5 夏多密码&猪圈密码&当铺密码&盲语

这一类密码特征十分明显,因为都是图形类解密。这个大家自己百度一下搜索一下图吧,基本都是图形密码。
音符密码在线解密:https://www.qqxiuzi.cn/bianma/wenbenjiami.php?s=yinyue
盲语密码在线解密:https://www.qqxiuzi.cn/bianma/wenbenjiami.php?s=mangwen
猪圈密码在线解密:http://www.metools.info/code/c90.html

2.6 博多密码

这个密码是我在做bugku的题的时候发现的,当时题目提示说是一种5bit的密码,我当时有点懵,快速回忆了一下我看过的密码,与5相关的似乎只有培根,但是很明显题目给出的字符串不是二元化的字符组成的,于是百度一下原来还有一种5位的密码博多密码。
在线解密工具:https://www.boxentriq.com/code-breaking/baudot-code

2.7 Rabbit密码&Rot13密码

两者都需要题目提示(比如暗示兔子之类的),之后在线解密,rot13可能提示比较特殊,rot13是加密移动13位解密移动13位。
Rabbit在线解密:http://www.wetools.com/rabbit/

2.8 希尔密码

希尔密码是需要一个矩阵来解密的,所以希尔密码的出现会有一个矩阵,这个稍稍复杂一些,需要一个脚本解密:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from numpy import *
Dic = {chr(i+97):i for i in range(26)}
def decode(pwd, org):
    temp = []
    result = []
    while True:
        if len(pwd) % 3 != 0:
            pwd.append(pwd[-1])
        else:
            break
    for i in pwd:
        temp.append(Dic.get(i))
    temp = array(temp)
    temp = temp.reshape(int(len(pwd)/3), 3)
    #print temp
    #print org
    xx = matrix(temp)*org
    for j in range(int(len(pwd)/3)):
        for i in range(3):
            if (int(xx[j, i]) >= 26):
                result.append(chr(xx[j, i] % 26 + 97))
                #print xx[j, i] % 26
            else:
                #print xx[j, i]
                result.append(chr(xx[j, i] + 97))
    return result
def get_vmatrix(org):
    org_adjoin = org.I*linalg.det(org)
    #print org_adjoin
    org_det = int(str(abs(linalg.det(org))).split('.')[0])
    #print org_det
    for i in range(1, 26):
        if i * org_det % 26 == 1:
            break
    org_mod = -org_adjoin * i % 26
    org_mod = matrix(org_mod)
    temp = []
    for i in range(org_mod.shape[0]):
        for j in range(org_mod.shape[1]):
            temp.append(int(str(org_mod[i, j]).split('.')[0]))
    org_final = matrix(temp).reshape(org_mod.shape[0], org_mod.shape[1])
    #print org_final
    return org_final
if __name__ == '__main__':
    #pwd = ""  这里实际是要写的,但是这里注释是因为不注释发不出来
    pwd = list(pwd)
    org = matrix(array([[1,2,3],[4,5,6],[7,8,9]]))
    org_vm = get_vmatrix(org)
    #print org_vm
    print("Your flag is :" + "".join(decode(pwd, org_vm)))

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54

2.9 凯撒编码

2.10 维吉尼亚密码

2.11 棋盘密码&键盘棋盘密码

三、对称密码

3.1 DES

3.2 AES

四、非对称密码

4.1 RSA

如果是简单应用,这里可以参考这篇blog,写的通俗易懂:
https://www.cnblogs.com/wwcdg/p/15913896.html
更为复杂的等我学一下数学基础再掰扯
————————————————————————————————
2022.10.26
RSA实在有点复杂,还是太多分解组合方法了,出题人俄罗斯套娃一样,针对更多位大数有费马分解等方法,而e较小时还有小指数明文爆破,还有公约数模数分解

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/422828
推荐阅读
相关标签
  

闽ICP备14008679号