常见的加密方式

303 阅读12分钟

常见的加密方式

凯撒加密

移位密码只有25种密匙(25次位移)

基本思想是:通过把字母移动一定的位数来实现加密和解密。明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文。

当偏移量是3的时候,所有的字母A将被替换成D,B变成E,以此类推X将变成A,Y变成B,Z变成C。

例如:
iodj{123d} 偏移量3 解密后:flag{123a}
​
​

栅栏加密

栅栏密码(Rail-fence Cipher)就是把要加密的明文分成N个一组,然后把每组的第1个字符组合,每组第2个字符组合…每组的第N(最后一个分组可能不足N个)个字符组合,最后把他们全部连接起来就是密文,这里以2栏栅栏加密为例。

示例:栅栏2 分成两组
明文:flag{123a}
去空格:flag{123a}
分组:fl ag {1 23 a}
第一组:fa{2a
第二组:lg13}
密文:fa{2alg13}
​
样题: fa{fe13f590lg6d46d0d0}

URL编码

import urllib.parse
url = '%20HOW%20TO%20'
x = urllib.parse.unquote(url)
print(x)

image-20230726200546237

base64

分为:base16、base32、base58、base62、base64、base91、base92、base100
ZmxhZ3sxMjNhfQ== #flag{123a}
import base64
print(base64.b64encode(b'flag{123a}'))
b'ZmxhZ3sxMjNhfQ=='

image-20230726140913647

base16 由 字母A-F、数字0-9共16个字符组成

image-20230726140954107

base32 由 字母A-Z、数字2-7共32个字符组成,“=”符号作为后缀填充

image-20230726141022634

base58 用于比特币中使用的一种独特的编码方式,主要用于比特币的钱包地址,base58不使用数字 0 ,字母大写 O,字母大写 I(小写i) 和字母大写L(小写l)以及 +,/符号 base62 由(A-Z、a-z、0-9、)62个可见字符组成,相比base64,去掉 +,/两个符号

base91 由(0-9,a-z,A-Z,!@#$%^&*()_+,./:;<>=?`[]{}|~")组成

base92 比base91 多了一个反向 ~ 字符

base100 由一堆Emoji 表情 组成

HTML 的实体编码

MDN:HTML 实体是一段以连字号(&)开头、以分号(;)结尾的文本(字符串)。实体常常用于显示保留字符(这些字符会被解析为 HTML 代码)和不可见的字符(如“不换行空格”)。你也可以用实体来代替其他难以用标准键盘键入的字符。
​
不可分的空格:&nbsp;
<(小于符号):&lt;
>(大于符号):&gt;
&(与符号):&amp;
"(双引号):&quot;
'(单引号):'&apos;
©(版权符号)&copy;

ASCII编码

特点

我们一般使用的 ascii 编码的时候采用的都是可见字符,而且主要是如下字符

  • 0-9, 48-57
  • A-Z, 65-90
  • a-z, 97-122

image-20230726135538152

image-20230726135504882

异或加密

异或加密特性:
① 两个值相同时,返回false,否则返回true 。
② 如果对一个值连续做两次 XOR,会返回这个值本身。

python中异或是通过^进行计算。

unicode 加密

其实这应该不算一种加密 更多的应该算是一种编码与解码,但是由于运用很广泛

str1 = "你好"
  
# 编码
enStr1 = str1.encode('unicode-escape').decode()
print(enStr1) # \u4f60\u597d
  
# 解码
deStr1 = enStr1.encode().decode('unicode-escape')
print(deStr1) # 你好

URL编码

每对name/value由&;符分开;其实url编码就是一个字符ascii码的十六进制。不过稍微有些变动,需要在前面加上%。比如,它的ascii码是92,`92`的十六进制是5c,所以的url编码就是%5c。

image-20230726135700979

JSfuck

是基于JavaScript原子部分的深奥和教育性编程风格。它仅仅使用六个不同的字符来编写和执行代码。 分别是:() [ ] + !

Morse 编码

image-20230726210123984

image-20230726210141652

特点

  • 只有 .-
  • 最多 6 位;
  • 也可以使用 01 串表示。

二维码

  • 用某种特定几何图形按一定规律在平面分步的黑白相间的图形记录数据符号信息

    image-20230727090444191

压缩包伪加密

原理:ZIP伪加密是在文件头的加密标志位进行修改,进而再次打开文件时被识别为加密压缩包。

一个ZIP文件由三大部分组成:

压缩源文件数据区+压缩源文件目录区+压缩源文件目录结束标志

    header:文件头用于标识该文件的开始,记录了该压缩文件的信息,这里的文件头标识由固定值 50 4B 03 04 开头,也是 ZIP 的文件头的重要标志。 file data:文件数据记录了相应压缩文件的数据。 data desc:数据描述符用于标识该文件压缩结束.

识别一个zip文件是否加密主要是看压缩源文件数据的全局方式位标记和压缩源文件目录区的全局方式位标记,关键操作在其中的全局方式标记的第一字节数字的奇偶上,其它的不管为何值,都不影响它的加密属性。通常全局方式位标记为2 bytes长度,第一字节数字为偶数表示无加密,例如:00,02,04等;为奇数表示有加密,例如01,03,09等。

伪加密:

image-20230726142613213

image-20230726142639028image-20230726142705465

常见的图片文件头

PNG
文件头:89 50 4E 47
文件尾:AE 42 60 82
JPG(jpeg)
文件头:FF D8 FF
文件尾:FF D9
ZIP
文件头:50 4B 03 04
文件尾:50 4B
GIF
文件头:47 49 46 38
文件尾:00 3B

image-20230726142737638

image-20230726142812602

文件修复

有些图片无法正确打开,可能是因为图片的文件头错误,所以将图片的文件头修改为正确的文件头即可打开

图片隐写的常见类型

EXIF信息隐藏、嵌入式隐写、文件分离、LSB替换隐写、NTFS隐写、GIF隐写和修复、盲水印隐写、直接附加

EXIF隐写

记录图片的拍摄日期、宽度、高度、分辨率、位深度等 kali中使用exif隐写:

exiftool + 图片名称 (显示文件信息、备注信息)
文件筛选:exiftool + 图片名称| grep flag (筛选出关于flag的信息)
解压压缩包命令:unzip + 文件名

image-20230726144730564

嵌入式隐写

分为 追加嵌入法和前置插入法 插入的信息种类分为:文本插入(将文本插入到图片里)、文件插入(将图片插入到图片里)

copy 1.jpg /b+2.php 3.jpg
    /b是二进制形式打开
    /a是ascii方式打开

image-20230726144905252

image-20230726144934806

文件分离

文件提取工具:binwalk或者foremost工具(kali使用)

binwalk + 文件名称
binwalk -e + 文件名称 (完全提取图片信息)
binwalk + 文件名称 -D=png(按照png格式分离出)
foremost + 文件名称 (直接分离)
foremost -v -i 要提取的原文件 -o 要输出的路径

LSB替换隐藏

LSB隐写(最低有效位的隐写),是指通过改变图片中像素的最低位来实现信息的隐藏的。这种隐写方式需要图片是无压缩的位图,因此一般用于bmp和png图片。

图片中的像素一般由三种颜色组成rgb rgb三种轨道 工具:Stegsolve

image-20230726145107738

GIF隐写和修复

使用Stegsolve工具 在Analys----Frame Browser下(gif一帧一帧显示)

image-20230726145518340

JPG图片

0xffd80xffd9为 JPG 文件的开始结束的标志。

JPG(jpeg)
文件头:FF D8 FF
文件尾:FF D9

音频隐写

通过Audacity.exe工具进行频谱的分离

音频通常会有一个较明显的特征,听起来是一段杂音或者比较刺耳

频谱 摩斯加密

image-20230726153554633

曼彻斯特编码(由低到高为0)获得二进制 波频上为1 下为0

image-20230726153709976

二进制8个一组,转ASCII

频谱图

image-20230726154402322

具有key值 工具:silent eye

image-20230726160121653

image-20230726160052996

压缩包暴力破解

弱口令爆破

kali下通过zip2john 提取密文

image-20230726145815252

image-20230726152527279

docx文件转压缩包

修改后缀为zip,进行解压

明文攻击

明文攻击特征: ①已知加密压缩包中的一个文件

②在进行明文攻击时,压缩算法一定要相同

明文文件 与密文包内文件 CRC校验和相同

image-20230726153023677

文字盲水印

存在密码

from text_blind_watermark import TextBlindWatermark
text='密文'
password = '密码'
twm_new = TextBlindWatermark(password=password)
flag = twm_new.extract(text)
print(flag)

图片盲水印

特征:两张看起来相同的图片

解密脚本:github.com/chishaxie/B…

image-20230726200150142

1.查看图像-属性-详细信息是否包括隐藏内容

2.利用WinHex打开图像,搜索CTF、ctf或flag看是否在打开数据中存在相关信息

3.检查图像开始标志和结束标志是否正确,若不正确修改图像标志恢复图像,打开查看是否ctf或flag等信息(往往gif属于动图,需要分帧查看各帧图像组合所得数据 若不是直接的ctf或flag信息 需要考虑将其解码)

jpg图像开始标志:FF D8 结束标志:FF D9

gif图像开始标志:47 49 46 38 39 61 结束标志:01 01 00 3B

4.将图像放置kali系统中,执行binwalk xxx.jpg 查看图像中是否是多个图像组合或者其中包含其他文件(若存在多幅图像组合,再执行foremost xxx.jpg会自动分离;若检测出其他文件修改其后缀即可,如.zip)

5.使用StegSolve对图像进行分通道扫描,查看是否为LSB隐写

6.改图片高度(对应题目难度:中)

常用命令

strings 命令

打印文件中可打印的字符,经常用来发现文件中的一些提示信息或是一些特殊的编码信息,常常用来发现题目的突破口。

  • 可以配合 grep 命令探测指定信息

    strings test|grep -i flag
    
  • 也可以配合 -o 参数获取所有 ASCII 字符偏移

    root in ~/Desktop/tmp λ strings -o flag|head
        14 IHDR
        45 gAMA
        64  cHRM
        141 bKGD
        157 tIME
        202 IDATx
        223 NFdVK3
        361 |;*-
        410 Ge%<W
        431 5duX@%
    

binwalk 命令

binwalk 本是一个固件的分析工具,比赛中常用来发现多个文件粘合再在一起的情况。根据文件头去识别一个文件中夹杂的其他文件,有时也会存在误报率(尤其是对 Pcap 流量包等文件时)。

root: binwalk flag

DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
0             0x0             PNG image, 450 x 450, 8-bit grayscale, non-interlaced
134           0x86            Zlib compressed data, best compression
25683         0x6453          Zip archive data, at least v2.0 to extract, compressed size: 675, uncompressed size: 1159, name: readme.txt
26398         0x671E          Zip archive data, at least v2.0 to extract, compressed size: 430849, uncompressed size: 1027984, name: trid
457387        0x6FAAB         End of Zip archive

配合 -e 参数可以进行自动化提取。

也可以结合 dd 命令进行手动切割。

root in ~/Desktop/tmp: dd if=flag of=1.zip bs=1 skip=25683
431726+0 records in
431726+0 records out
431726 bytes (432 kB, 422 KiB) copied, 0.900973 s, 479 kB/s

pngcheck

image-20230727102507476 binwalk提取一下 得到两个zlib文件。以前的思路,zlib文件,里面没东西。不管了。 这次不一样,信息恰恰藏在zlib文件中。

image-20230727102715677

没有zlib后缀的就是zlib解压后的文件。

grep

grep -rn "flag"