CTF杂项

隐写术-Steganography

隐写术是一门关于信息隐藏的技巧与科学。

简单练习4则

在word中隐藏数据

用字体属性隐藏信息;

用工具->选项->视图->勾选显示隐藏文字

图像元数据

主要是jpeg格式的图像信息

Windows右键属性可查看EXIF信息

powerexif工具可修改EXIF信息

介绍一个 identify 命令,这个命令是用来获取一个或多个图像文件的格式和特性。

-format 用来指定显示的信息,format 各个参数具体意义

移动设备数据隐藏

Google Play(安卓市场)上有一个Hide it Pro安装后会显示一个伪造名称Audio Manger,长按后运行真正的Hide it

Hide it Pro可针对用户或整个安卓手机隐藏文件和文件夹

Hide it Pro 会给文件加上一个随机文件扩展名,并存储在一个单独目录(Program Data/Android/Language)

与Linux类似是给文件名前加“.”来隐藏文件的

将需要隐藏的文件放到Hide it Pro 创建的文件夹即可隐藏,之后只能通过Hide it Pro 浏览隐藏文件

文件压缩工具的数据隐藏

WinRAR,可以自动恢复破损的压缩文件。

利用这个功能可把压缩文件隐藏在一个载体文件中,接收者用WinRAR修复即可打开隐藏文件。

打开WinRAR,点击Files to add,添加需要隐藏的文件,创建hidde.rar

把hidde.rar隐藏在一个载体中(图种)

1
copy /b old.jpg + hidde.rar new.jpg

其实可以用foremost分离或直接改后缀

数字信息隐写术

插入方法

在文件空白部分插入额外内容,除了被隐藏的信息外,还有文件制作工具的标识

这个标识记录了隐写程序处理隐藏载荷的地点。

替换方法

修改文件中的字节顺序,不会改变文件内容

例如,LSB(Least Significant Bit,最低位有效)替换方法,就是修改文件中每个字节的最低有效位(1和0互换)

LSB详解

常用在JPEG和BMP的图片文件上,工具Stegsolve

在PDF中隐藏信息

wbStego4open是一个隐写开源工具,它支持Windows和Linux平台。

可以把文件隐藏到BMP、TXT、HTM和PDF文件中。

这个程序利用PDF文件头添加额外信息,这个区域的信息会被Adobe Acrobat Reader阅读器忽略。

wbStego4open会把插入数据中的每一个ASCII码转换为二进制形式,

然后把每一个二进制数字再替换为十六进制的20或者09,20代表0,09代表1

WinHex查看

https://img.wenhairu.com/images/2019/01/21/0020C7fZzy7jn38ptF3fd690.jpg

用WinHex打开生成文件xxx.pdf,其中混入了许多由20和09组成的8位字节,

将这些8位字节提取出来之后取其最低有效位,组合得其所代表的ASCII码的二进制形式,

再把二进制码转换成ASCII码就可以得到信息(20代表0,09代表1)。

在可执行文件中隐藏信息

使用Hydan (Linux中运行)这个工具可以在可执行文件中隐藏数据。

Hydan利用二进制代码的反向工程技术来判断在可执行文件中隐藏数据段的最佳位置。

以tar可执行文件为例

1
2
3
4
5
./hydan tar message.txt > tar.steg 	#加密,会让输入一个password

./hydan-decode tar.steg #会让输入password

./tar.steg -xvf hydan-0.13.tar #打包

在HTML文件中隐藏信息

工具snow:https://pan.baidu.com/s/1mnUYz25VasGLt0eWd6XaHA
提取码:9utk

1
2
3
snow.exe -C -m "隐藏信息" -p "password" old.html new.html #嵌入隐藏信息到html

snow.exe -C -p "password" x #解密

修改后的html文件视觉上没有任何区别

WinHex查看隐藏数据后的文件,文件中增添了许多由20、09构成的8位字节,而这便是隐藏的数据

常用隐写工具

CTF—Tools:https://github.com/smartjinyu/ctf-tools

Stegdetect

Stegdetect程序主要用于分析JPEG文件

可以检测到通过JSteg、JPHide、OutGuess、Invisible Secrets、F5、appendX、Camouflage等工具隐藏的信息

apt-get install stegdetect

参数:

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
q – 仅显示可能包含隐藏内容的图像

n – 启用检查JPEG文件头功能,以降低误报率。

如果启用,所有带有批注区域的文件将被视为没有被嵌入信息。

如果JPEG文件的JFIF标识符中的版本号不是1.1,则禁用OutGuess检测。

s – 修改检测算法的敏感度,该值的默认值为1。

检测结果的匹配度与检测算法的敏感度成正比,

算法敏感度的值越大,检测出的可疑文件包含敏感信息的可能性越大。

d – 打印带行号的调试信息。

t – 设置要检测哪些隐写工具(默认检测jopi),可设置的选项如下:

j – 检测图像中的信息是否是用jsteg嵌入的。

o – 检测图像中的信息是否是用outguess嵌入的。

p – 检测图像中的信息是否是用jphide嵌入的。

i – 检测图像中的信息是否是用invisible secrets嵌入的。

当然误报率还是有的

outguess

linux下载安装:

1
2
3
git clone https://github.com/crorvick/outguess.git

./configure && make && make install

加密:

outguess -k "pass" -d hidden.txt demo.jpg out.jpg

加密之后,demo.jpg会覆盖out.jpg,

hidden.txt中的内容是要隐藏的东西

解密:

outguess -k "pass" -r out.jpg hidden.txt

解密之后,解密内容放在hidden.txt中

mp3stego

链接:https://pan.baidu.com/s/1Yf2TY5uiskHfooNmoeIDXg
提取码:7t0g

主要用于mp3隐写

1
2
3
encode -E hidden_text.txt -P pass steg.wav steg.mp3 #加密

decode -X -P pass steg.mp3 #解密
Stegsolve

图片隐写破解工具,破解LSB算法、隐藏二维码等

链接:https://pan.baidu.com/s/1D0lPn7DpN5Ez3fweyrg7xQ
提取码:i0vl

binwalk,dd,foremost命令

linux下binwalk命令常用于分析隐写文件,dd命令用于提取文件。

分析:

binwalk new.jpg

binwalk -e new.jpg #分离文件

提取文件:

dd if=baozou_new.jpg of=2.zip bs=1 skip=4308

foremost命令同样可以达到效果:

foremost new.jpg

支持恢复如下格式:

1
2
3
avi, bmp, dll, doc, exe, gif, htm, jar, jpg, mbd, 
mov, mpg, pdf, png, ppt, rar, rif, sdw, sx, sxc,
sxi,sxw, vis, wav, wmv, xls, zip。
F5-steganography
1
2
3
4
5
6
7
git clone https://github.com/matthewgao/F5-steganography

cd F5-steganography

java Extract 1234546.jpg -p 123456

输出output.txt文件
steghide

官网地址:http://steghide.sourceforge.net/documentation.php

在文件中隐藏数据

1
steghide embed -cf 123.jpg -ef hide.txt #隐藏信息到123.jpg, 加上-p可添加密码

检查图片中隐藏的信息

1
2
steghide info 123.jpg #检测
steghide extract -sf 123.jpg #解密

多媒体中的数据隐藏

在音频文件中隐藏数据

MP3隐写

运用MP3Stego工具

WAV文件格式解析

上边介绍的MP3Stego工具,可以将.wav文件和隐藏载荷文件作为输入,生成一个新的MP3文件。

波形隐写

Audacity在CTF中的应用

LSB 音频隐写

类似于图片隐写中的 LSB 隐写,音频中也有对应的 LSB 隐写。主要可以使用 Silenteye 工具

数字视频文件中的数据隐藏

MSU Stego是一款免费、非开源的视频隐写工具

必须使用AVI格式输入

上边的连接中有下载和使用方法,傻瓜式操作

压缩包隐写

zip隐写

ZIP文件格式解析

zip伪加密破解

明文破解例题+wp

CRC32

CRC 本身是「冗余校验码」的意思,CRC32 则表示会产生一个 32 bit ( 8 位十六进制数) 的校验值。

由于 CRC32 产生校验值时源数据块的每一个 bit (位) 都参与了计算

所以数据块中即使只有一位发生了变化,也会得到不同的 CRC32 值。

CRC32 校验码出现在很多文件中比如 png 文件,同样 zip 中也有 CRC32 校验码。

值得注意的是 zip 中的 CRC32 是未加密文件的校验值。

这也就导致了基于 CRC32 的攻击手法。

  • 文件内内容很少 (一般比赛中大多为 4 字节左右)
  • 加密的密码很长

我们不去爆破压缩包的密码,而是直接去直接爆破源文件的内容 (一般都是可见的字符串),从而获取想要的信息。

比如我们新建一个 flag.txt,其中内容为 123,使用密码 !QAZXSW@#EDCVFR$ 去加密。

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
# -*- coding: utf-8 -*-
# python2.7
import binascii
import base64
import string
import itertools
import struct

alph = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*+/='

crcdict = {}
print "正在计算所有可能的CRCs..."
for x in itertools.product(list(alph), repeat=4):
st = ''.join(x)
testcrc = binascii.crc32(st)
crcdict[struct.pack('<i', testcrc)] = st
print "Done!"

f = open('flag.zip')
data = f.read()
f.close()
crc = ''.join(data[14:18])
if crc in crcdict:
print crcdict[crc]
else:
print "失败!"
例题

SSCTF-2017我们的秘密是绿色的

这一题,基本涵盖了比赛中 ZIP 的常见考察手法,爆破,伪加密,明文攻击等

Abctf-2016:zippy-120

WriteUp:CRC32爆破

rar隐写

文件格式

RAR 文件主要由标记块,压缩文件头块,文件头块,结尾块组成。

其每一块大致分为以下几个字段:

名称 大小 描述
HEAD_CRC 2 全部块或块部分的 CRC
HEAD_TYPE 1 块类型
HEAD_FLAGS 2 阻止标志
HEAD_SIZE 2 块大小
ADD_SIZE 4 可选字段 - 添加块大小

Rar 压缩包的文件头为 0x 52 61 72 21 1A 07 00

紧跟着文件头(0x526172211A0700)的是标记块(MARK_HEAD),其后还有文件头(File Header)。

结尾~~

每个 RAR 文件的结尾快(Terminator)都是固定的。

名称 Size (bytes) Possibilities
HEAD_CRC 2 Always 0x3DC4
HEAD_TYPE 1 Header type: 0x7b
HEAD_FLAGS 2 Always 0x4000
HEAD_SIZE 2 Block size = 0x0007
爆破

Linux 下的 RarCrack

windows下还是ARCHPR

伪加密

RAR 文件的伪加密在文件头中的位标记字段上,用WinHex 修改这一位可以造成伪加密

磁盘内存分析

常用工具
磁盘

常见的磁盘分区格式有以下几种

  • Windows: FAT12 -> FAT16 -> FAT32 -> NTFS

  • Linux: EXT2 -> EXT3 -> EXT4

  • 删除文件:目录表中文件名第一字节 e5

  • FAT 主磁盘结构

VMDK

VMDK 文件本质上是物理硬盘的虚拟版,也会存在跟物理硬盘的分区和扇区中类似的填充区域

我们可以利用这些填充区域来把我们需要隐藏的数据隐藏到里面去

这样可以避免隐藏的文件增加了 VMDK 文件的大小(如直接附加到文件后端)

也可以避免由于 VMDK 文件大小的改变所带来的可能导致的虚拟机错误。

而且 VMDK 文件一般比较大,适合用于隐藏大文件。

内存
  • 解析 Windows / Linux / Mac OS X 内存结构
  • 分析进程,内存数据
  • 根据题目提示寻找线索和思路,提取分析指定进程的特定内存数据
题目
  • Jarvis OJ - MISC - 取证 2

Pyc文件

在导入 python 脚本时在目录下会生成个一个相应的 pyc 文件

是 pythoncodeobj 的持久化储存形式, 加速下一次的装载。

文件结构

pyc 文件由三大部分组成

  • 最开始 4 个字节是一个 Maigc int, 标识此 pyc 的版本信息
  • 接下来四个字节还是个 int, 是 pyc 产生的时间
  • 序列化的 PyCodeObject, 结构参照 include/code.h, 序列化方法 python/marshal
pyc 完整的文件解析可以参照
关于 co_code

一串二进制流, 代表着指令序列, 具体定义在 include/opcode.h 中, 也可以参照 python opcodes

python3.6 以上参数永远占 1 字节, 如果指令不带参数的话则以0x00代替, 在运行过程中被解释器忽略,

也是 Stegosaurus 技术原理; 而低于 python3.5 的版本中指令不带参数的话却没有0x00填充

例题

Hackover CTF 2016 : img-enc

首先尝试 pycdc 反编译失败

1
2
3
4
5
6
7
8
9
10
11
12
13
# Source Generated with Decompyle++
# File: imgenc.pyc (Python 2.7)

import sys
import numpy as np
from scipy.misc import imread, imsave

def doit(input_file, output_file, f):
Unsupported opcode: STOP_CODE
img = imread(input_file, flatten = True)
img /= 255
size = img.shape[0]
# WARNING: Decompyle incomplete

注意到是 python2.7, 也就是说指令序列共占 1 字节或 3 字节 (有参数无参数)

使用 pcads 得到

1
2
3
4
5
6
7
8
9
imgenc.pyc (Python 2.7)
...
67 STOP_CODE
68 STOP_CODE
69 BINARY_DIVIDE
70 JUMP_IF_TRUE_OR_POP 5
73 LOAD_CONST 3: 0
76 LOAD_CONST 3: 0
79 BINARY_DIVIDE

定位到出错的地方, 观察发现 LOAD_CONST LOAD_CONST BINARY_DIVIDE STORE_FAST opcodes (64 03 00 64 03 00 15 7d 05 00)被破坏了, 根据上下文线索修复后

1
2
3
4
5
6
7
8
9
10
00000120  64 04 00 6b 00 00 72 ce  00 64 03 00 64 03 00 15  |d..k..r..d..d...|
00000130 7d 05 00 64 03 00 64 03 00 15 7d 05 00 64 03 00 |}..d..d...}..d..|
00000140 64 03 00 15 7d 05 00 64 03 00 64 03 00 15 7d 05 |d...}..d..d...}.|
00000150 00 64 03 00 64 03 00 15 7d 05 00 64 03 00 64 03 |.d..d...}..d..d.|
00000160 00 15 7d 05 00 64 03 00 64 03 00 15 7d 05 00 64 |..}..d..d...}..d|
00000170 03 00 64 03 00 15 7d 05 00 64 03 00 64 03 00 15 |..d...}..d..d...|
00000180 7d 05 00 64 03 00 64 03 00 15 7d 05 00 64 03 00 |}..d..d...}..d..|
00000190 64 03 00 15 7d 05 00 64 03 00 64 03 00 15 7d 05 |d...}..d..d...}.|
000001a0 00 64 03 00 64 03 00 15 7d 05 00 64 03 00 64 03 |.d..d...}..d..d.|
000001b0 00 15 7d 05 00 64 03 00 64 03 00 15 7d 05 00 6e |..}..d..d...}..n|

接下来根据修复好的 python 源代码得到 flag 即可

延伸:
Tools

pycdc

将 python 字节码转换为可读的 python 源代码, 包含了反汇编 (pycads) 和反编译 (pycdc) 两种工具

Stegosaurus

允许我们在 Python 字节码文件(pyc 或 pyo)中嵌入任意 Payload。

由于编码密度较低,因此嵌入Payload 的过程不会改变源码的运行行为,也不会改变源文件的文件大小

原理是在 python 的字节码文件中, 利用冗余空间, 将完整的 payload 代码分散隐藏到这些零零碎碎的空间中.

Ref: 一种用于在 Python 字节码中嵌入 Payload 的隐写工具 – Stegosaurus

Challenges: WHCTF-2017:Py-Py-Py

流量包分析

简介

CTF流量分析可以概括为三个方向

  • 流量包修复
  • 协议分析
  • 数据提取

PCAP 文件修复

PCAP 文件结构

通常都能借助于现成的工具如 PcapFix在线版)直接修复

1
2
3
4
5
6
7
8
9
10
11
12
 0                   1                   2                   3   
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Block Type |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Block Total Length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
/ Block Body /
/ /* variable length, aligned to 32 bits */ /
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Block Total Length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
常见块
Section Header BlocK(文件头)

必须存在, 意味着文件的开始

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 0                   1                   2                   3   
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Byte-Order Magic (0x1A2B3C4D) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Major Version(主版本号) | Minor Version(次版本号) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
| Section Length |
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
/ /
/ Options (variable) /
/ /
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Interface Description Block(接口描述)

必须存在, 描述接口特性

1
2
3
4
5
6
7
8
9
10
11
 0                   1                   2                   3   
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| LinkType | Reserved |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| SnapLen(每个数据包最大字节数) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
/ /
/ Options (variable) /
/ /
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Packet Block(数据块)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 0                   1                   2                   3   
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Interface ID | Drops Count |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Timestamp (High) 标准的Unix格式 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Timestamp (Low) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Captured Len |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Packet Len |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
/ Packet Data /
/ /* variable length, aligned to 32 bits */ /
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
/ Options (variable) /
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

例题:find the flag

协议分析

Wireshark (HTTP,HTTPS,FTP,DNS,WIFI,USB)
使用过滤器 Ctrl+F

常用运算符

运算符 说明
== 等于
!= 不等于
> 大于
< 小于
>= 大于等于
<= 小于等于
and , &&
or , \ \
! , not

协议过滤

直接输入协议名即可

1
2
3
4
5
http,tcp,udp,arp,ip

icmp,smtp,ftp,dns

msnms,ssl,oicq

IP地址过滤

1
2
3
4
5
ip.src ==192.168.1.100	#源IP

ip.dst == 192.168.1.100 #目的IP

ip.addr == 192.168.1.100 # 显示源IP和目的IP

端口过滤

tcp.srcport == 80 #源IP的80端口

tcp.dstport == 80 #目的IP 80端口

tcp.port == 80 #所有80端口

针对长度和内容的过滤表达式

1、针对长度的过滤(这里的长度指定的是数据段的长度)

1
2
3
4
5
表达式为:udp.length < 30   http.content_length <=20

tcp.len >= 7 #指的是ip数据包(tcp下面那块数据),不包括tcp本身

ip.len == 94 #除了以太网头固定长度14,其它都算是ip.len,即从ip本身到最后

2、针对数据包内容的过滤

1
表达式为:http.request.uri matches "flag"  (匹配http请求中含有flag字段的请求信息)

http模式过滤

1
2
3
http.request.method == “GET”

http.request.method == “POST”
信息统计

Protocol History(协议分级)

捕捉文件包含的所有协议的树状分支

Conversation(对话)

发生于一特定端点的 IP 间的所有流量.

查看收发大量数据流的 IP 地址。

有可能只是某台设备正在扫描网络,或仅是一台产生过多数据的 PC。
查看扫描模式(scan pattern)。

这可能是一次正常的扫描,如 SNMP 软件发送 ping 报文以查找网络,但通常扫描都不是好事情

数据提取

通过对协议分析, 找到了题目的关键点, 如何提取数据成了接下来的关键问题

wireshark自动分析

文件->导出对象->HTTP

tshark

tshark 作为 wireshark 的命令行版, 高效快捷是它的优点,

配合其余命令行工具 (awk,grep) 等灵活使用, 可以快速定位, 提取数据从而省去了繁杂的脚本编写

google-ctf-2016 : for2-200 这道题,可以通过 tshark 迅速完成解题

1 鼠标协议中数据提取

2 通过 awk 进行位置坐标转换

3 形成图形

1
2
3
4
what@kali:/tmp$ tshark -r capture.pcapng -T fields -e usb.capdata > data2.txt
what@kali:/tmp$ # awk -F: 'function comp(v){if(v>127)v-=256;return v}{x+=comp(strtonum("0x"$2));y+=comp(strtonum("0x"$3))}$1=="01"{print x,y}' data.txt > data3.txt
what@kali:/tmp$ gnuplot
> plot "data3.txt"

密码学-crypto

简介

推荐阅读:

CTF中那些脑洞大开的编码和加密

一道可以学到密码知识的CTF密码学题目(crc32碰撞)

密码学(Cryptography)一般可分为古典密码学和现代密码学

密码设计者的根本目标是保障信息及信息系统的

  • 机密性(Confidentiality)
  • 完整性(Integrity)
  • 可用性(Availability)
  • 认证性(Authentication)
  • 不可否认性(Non-repudiation)

密码算法

明文:要处理的数据 (message)
密文:处理后的数据 (Ciphertext)
密钥:秘密参数 (key)

密码算法需求

(1)可 逆:算法的使用者可以将密文恢复成明文
(2)不可逆:敌人无法将密文恢复成明文

分类

按照功能分类

加密算法:用于机密性解决方案
杂凑函数:用于完整性解决方案
数字签名:用于认证和不可否认性

按照使用方式

对称密钥:加密密钥和解密密钥相同(分组密码,流密码)
非 对 称:加密和解密密钥不相同 (公钥加密,数字签名)

古典密码
代替密码

棋盘密码,兽栏法,摩尔斯码,凯撒密码,维吉尼亚密码(凯撒升级版)

置换密码

报文倒置,Scytable(天书),几何图形密码

密码机

杰弗逊圆盘,德国Enigma密码机

现代密码

对称加密,以 DES,AES,RC4 为代表。

非对称加密,以 RSA,ElGamal,椭圆曲线加密为代表。

哈希函数,以 MD5,SHA-1,SHA-512 等为代表。

数字签名,以 RSA 签名,ElGamal 签名,DSA 签名为代表

对称加密体制

分组密码(Block Cipher),又称为块密码。

序列密码(Stream Cipher),又称为流密码。

四种攻击类型

攻击类型 说明
唯密文攻击 只拥有密文
已知明文攻击 拥有密文与对应的明文
选择明文攻击 拥有加密权限,能够对明文加密后获得相应密文
选择密文攻击 拥有解密权限,能够对密文解密后获得相应明文

CTF密码学例题

仿射密码

CTF拓展学习链接

图片隐写相关链接:

PNG文件格式详解

PNG文件格式全解

GIF文件格式解析

JPG文件格式分析

BMP位图格式详解

各类文件的文件头标志

png中CRC检验错误的分析

CTF中比较好玩的stego

深入理解JPEG图像格式Jphide隐写

图片隐写术总结

国光DaLao的图片隐写总结更新

实验吧隐写术全部WirteUp