杂项
常见编码
ASCII
ASCII非打印控制字符(0-31,127)
ASCII打印字符
扩展ASCII打印字符
base64/32/16编码
定义
base64、base32、base16可以分别编码转化8位字节为6位、5位、4位。16,32,64分别表示用多少个字符来编码,常用的为base64。Base64常用于在通常处理文本数据的场合,表示、传输、存储一些二进制数据。
base64
编码原理
Base64编码要求把3个8位字节转化为4个6位的字节,之后在6位的前面补两个0,形成8位一个字节的形式,6位2进制能表示的最大数是2的6次方是64,这也是为什么是64个字符(A-Z,a-z,0-9,+,l这64个编码字符,=号不属于编码字符,而是填充字符)的原因,这样就需要一张映射表
若三位一组分组时不足三位:
差一位:转二进制时后面补8个0,对应base64码为‘=’
一个’='可以隐藏2bit信息
差两位:转二进制时后面补16个0,对应base64码为‘==’
两个’='隐藏4bit信息
base32/16
编码原理
base32就是用32(2的5次方)个特定ASCII码来表示256个ASCII码。所以,5个ASCIl字符经过base32编码后会变为8个字符(公约数为40),长度增加3/5,不足8n用“=”补足。
base16就是用16(2的4次方)个特定ASCII码表示256个ASCII字符。1个ASCIl字符经过base16编码后会变为2个字符,长度增加一倍。不足2n用“=”补足
base16实际上也是十六进制转换
与base64类似,base32使用32个可见字符进行编码,2的5次方为32,所以每5bit为1个分组。5字节为40bit,对应于8个base32分组,即5个字节用8个base32中字符来表示。但如果不足5个字节,则会先对第一个不足5bit的分组用0补足了5bit,对后面剩余分组全部使用“=”填充,直到补满5个字节。由此可知,base32最多只有6个等号出现
shellcode
源文本:The quick brown fox jumps over the lazy dog
编码后:
\×54\×68\×65\×20\×71\×75\×69\x63\x6b\×20\×62\×72\×6f\×77\x6e\x20\×66\x6f\×78\×20\×6a\×75\x6d\×70\×73\×20\×6f\×76\x65\×72\×20\×74\x68\x65\×20\×6c\x61\×7a\x79\×20\x64\x6f\x67
解码:本质还是解十六进制
Quoted-printable编码(只针对于非英文)
源文本:敏捷的棕色狐狸跳过了懒惰的狗
编码后:
=E6=95=8F=E6=8D=B7=E7=9A=84=E6=A3=95=E8=89=B2=E7=8B=90=E7=8B=B8=E8=B7=B3=E8=BF=87=E4=BA=86=E6=87=92=E6=83=BO=E7=9A=84=E7=8B=97
http: // www.mxcz.net/tools/QuotedPrintable.aspx
- 编码原理
- 任何一个8位的字节值可编码为3个字符:一个等号”=”后跟随两个十六进制数字(0–9或A–F)表示该字节的数值.例如,ASCII码换页符(十进制值为12)可以表示为”=0C”,等号”=”(十进制值为61)必须表示为”=3D”.除了可打印ASCII字符与换行符以外,所有字符必须表示为这种格式.
- 所有可打印ASCII字符(十进制值的范围为33到126)可用ASCII字符编码来直接表示,但是等号”=”(十进制值为61)不可以这样直接表示.ASCII的水平制表符(tab)与空格符,十进制为9和32,如果不出现在行尾则可以用其ASCII字符编码直接表示。如果这两个字符出现在行尾,必须QP编码表示为"=09″(tab)或"=20″(space).
XXencode编码
简介:
XXencode将输入文本以每三个字节为单位进行编码。如果最后剩下的资料少于三个字节,不够的部份用零补齐。这三个字节共有24个Bit,以6bit为单位分为4个组,每个组以十进制来表示所出现的数值只会落在0到63之间。以所对应值的位置字符代替。它所选择的可打印字符一共64个字符。跟base64打印字符相比,就是XXencode多一个“-”字符,少一个”/”
字符:+- 0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz
源文本:Thequickbrownfoxjumpsoverthelazydog
编码后:hJ4VZ653pOKBf647mPrRi64NjS0-eRKpkQm-jRaJm65FcNG-gMLdt64FjNk++
UUencode编码
简介:
UUencode是一种二进制到文字的编码,最早在unix邮件系统中使用,全称:Unix-to-Unix encoding,UUencode将输入文本以每三个字节为单位进行编码,如果最后剩下的资料少于三个字节,不够的部份用零补齐。三个字节共有24个Bit,以6-bit为单位分为4个组,每个组以十进制来表示所出现的字节的数值。这个数值只会落在0到63之间。然后将每个数加上32,所产生的结果刚好落在ASCIl字符集中可打印字符(32-空白…95-底线)的范围之中
特点:没有特点,一串乱码但都在可打印字符范围内
源文本:Thequickbrownfoxjumpsoverthelazydog
编码后:M5&AE('%U:6-K(&)R;W=N(&9O>"!J=6UP<R!O=F5R('1H92!L87IY(&1O9PH*
URL编码(%编码)
本质ASCII编码的十六进制前加%
Unicode编码
Unicode码扩展自ASCIl字元集。在严格的ASCIl中,每个字元用7位元表示,或者电脑上普遍使用的每字元有8位元宽;而Unicode使用全16位元字元集。这使得Unicode能够表示世界上所有的书写语言中可能用於电脑通讯的字元、象形文字和其他符号。Unicode只有一个字符集,中、日、韩的三种文字占用了Unicode中0x3000到0x9FFF的部分Unicode目前普遍采用的是UCS-2,它用两个字节来编码一个字符,比如汉字"经"的编码是0x7ECF
特征 &,#
http: //www.mxcz.net/tools/Unicode.aspx
Escape/UNescape编码
简介:
Escape/Unescape加密解码/编码解码,又叫%u编码,采用UTF-16BE模式,Escape编码/加密,就是字符对应UTF-1616进制表示方式前面加%u。Unescape解码/解密,就是去掉“%u“后,将16进制字符还原后,由utf-16转码到自己目标字符。如:字符“中”,UTF-16BE是:“6d93”,因此Escape是“%u6d93”。
举例:
源文本:The
编码后:%u0054%u0068%u0065
敲击码
简介
敲击码(Tap code)是一种以非常简单的方式对文本信息进行编码的方法。
因该编码对信息通过使用一系列的点击声音来编码而命名,敲击码是基于5×5方格波利比奥斯方阵来实现的,不同点是是用K字母被整合到C中。
莫尔斯电码(Morse Code)
简介:
莫尔斯电码(Morse Code)是由美国人萨缪尔·摩尔斯在1836年发明的一种时通时断的且通过不同的排列顺序来表达不同英文字母、数字和标点符号的信号代码,摩尔斯电码主要由以下5种它的代码组成:
点(.)
划(一)
每个字符间短的停顿(通常用空格表示停顿)
每个词之间中等的停顿(通常用/划分)
以及句子之间长的停顿
摩斯电码一定是有分隔的
源文本:THEQUICKBROWNFOXJUMPSOVERTHELAZYDOG
编码后:-...../--.-..-..-.-.-.-/-....-.---.---./..-.----..-/.---..---.--..../---...-..-./-...../.-...---..-.--/-..-----.
对应表
ROT 5/13/18/47
简介
-
ROT 5/13/18/47是一种简单的码元位置顺序替换密码
-
ROT 5只对数字进行加密,用当前数字往前数用第5个数字替接当前数字
-
ROT 13只对字母进行加密,用当前字母往前数用第13个字母替换当前字母
-
ROT 18将ROT5和ROT13组合一起
-
ROT 47对数字、字母、常用符号进行编码,按照它们的ASCl值进行位置誉换,用当前字符ASC1|值往前数的第47位对应字符替换当前字符,例如当前为小写字母z,编码后变成大写字母K,当前为数字0,编码后变成符号。用于ROT47编码的字符其ASCII值范图是33一126,具体可参考ASCll编码。
举例:ROT13
明文:thequickbrownfoxjumpsoverthelazydog
密文:gurdhvpxoebjasbkwhzcfbiregurynmlqbt
变形
JSfuck
JSFuck只使用6种字符
[ ] ! ( ) +
来书写任何Javascript代码。当然,用这种方式写出来的代码会很长。JSFuck不需要依赖浏览器,也可以在Node.JS上运行。
不是一一对应
brainfuck编码
Brainfuck加密,brainfuck又被称为brainf**k或者BF,brainfuck语言用
< > + - . ,[ ]
八种符号来替换C语言的各种语法和命令,具体规则如下:
特点
加号多,五位一组
变形:Ook
OoK. Ook! Ook?
再变:short Ook
再Ook基础上删去Ook,并且可以删去并排列入一行中
隐写术(消息嵌入技术)
隐写术(steganography)一词来源于希腊词汇stegons和graphia,意即“隐藏”(cover)和“书写”(writing)。
在古希腊战争中,为了安全地传送军事情报,奴隶主剃光奴隶的头发,将情报纹在奴隶的头皮上,待头发长起后再派出去传送消息。
在我国信息隐藏的发展很大程度上得益我战争中隐蔽通信的需要。我国古代有文字可考的最早的信息隐藏见于《六韬》中对“阴符”的记载。“阴符”是当古代战中中采用的高度保密的通讯方式。其办法是先制造形制、花纹不同的兵符,每一种表示一种固定的含义。这种含义须事先约定好,只有当事人可以理解,若被敌方截获,他们也不会知道其中的含义。
将某些特殊信息隐藏于正常载体之中,从而实现掩盖特殊信息存在的事实,在通信过程中隐蔽通信掩盖了秘密通信的行为,不易引起攻击者的怀疑。
隐写载体
- 文本
- 图像
- 音频
- 视频
1、插入隐藏
- 在文本文件、多媒体文件及可执行文件等载体文件中,利用其文件特性与冗余性,在不影响载体正常使用的情况下,将秘密信息插入到载体中,实现信息隐藏。
- 根据文件特性与冗余性可分为:追加插入法和前置插入法
1.1、追加插入
- 追加插入法是数字隐写术中最常用、最简单的一种方法,一般是利用文件的特性在文件末位进行附加数据。
- 例如:对于JPG图片,其文件结构特性为图像开始(SOl)标记为0xFFD8,图片结尾(E0I)结束标记为0xFFD9。
1.2、前置插入
-
前置插入法是利用文件的冗余部分进行插入,而且丝毫不影响原始文件的使用效果。冗余部分可以是批注内容、注释信息等,一般文件都存在批注信息,此类信息修改后对原始文件不会产生影响。
-
例如,对于文本文件和数字媒体文件很容易用来嵌入数据,以jpg图片和文本文件为例。
标识符 | 十六进制值 | 大小(字节) | 详细信息 |
---|---|---|---|
SOI | FF D8 | 2 | 图像起始位置 |
APP0 | FF D8 | 2 | 文件详细信息 |
SOF0 | FF C0 | 2 | 框架起始位置 |
SOS | FF DA | 2 | 扫描起始位置 |
EOI | FF D9 | 2 | 图像结束位置 |
- 在文件详细信息中修改属性值,在JPEG的应用程序标识符FFE0和帧起始标识符FFC0这两个标识符之间一般为批注区,对于数据隐藏来说批注区是很好的利用位置。
2、替换隐藏
- 通过替换方法隐藏消息会改变载体消息中的字节或者置换字节顺序。替换方法不会在载体文件中增加任何新的内容,而是通过修改字节或者调整字节位置达到隐藏消息的目的。
LSB原理
- 图像是由像素组成,每个像素有一个灰度值。灰度值是介于0到255之间的整数,0代表黑色,255代表白色,其中灰度值越大表示亮度越高。例如在图片中像素灰度用8比特二进制数表示,其中最高位对图像的贡献最大,最低位对图像的贡献最小,最低位则为最低比特位(least significant bit,LSB)。我们将一副图片所有像素的比特位抽取出来,就构成了8个不同的位面。
- 将信息嵌入到随机选择的图像点中最不重要的像素位(LSB)上,这可保证嵌入的水印是不可见的。嵌入只在像素的最低位嵌入,使得其像素值的改变量最小,将文件某些像素转换成二进制,如图所示
最低位即转化为二进制数后最右位(奇数位1,偶数为0)
- 使用LSB嵌入时,都先将要隐藏的文件转换为二进制代码,假设我们要把011010嵌入到以上像素的图片中(使用最低有效位替换)。
- 利用最低比特位替换可以将信息添加到载体文件的最低有效像素位(LSB)上面,而且可以保证嵌入的数据或水印对载体影响较小。
3、图片隐写
3.1、PNG(无损压缩)
- 对于一个PNG文件来说,其文件头总是由位固定的字节来描述的,剩余的部分由3个以上的PNG的数据块(Chunk)按照特定的顺序组成。
- 文件头89504E470DOA1A0A+数据块+数据块+数据块……
- 数据块CHUNk
- PNG定义了两种类型的数据块,一种是称为关键数据块(critical chunk),这是标准的数据块,另一种叫做辅助数据块(ancillary chunks),这是可选的数据块。关键数据块定义了4个标准数据块,每个PNG文件都必须包含它们,PNG读写软件也都必须要支持这些数据块。
对于每个数据块都有着统一的数据结构,每个数据块由4个部分组成
CRC域中的值是对Chunk Type Code域和Chunk Data域中的数据进行计算得到的。
3.1.1、IHDR
-
文件头数据块IHDR(Header Chunk):它包含有PNG文件中存储的图像数据的基本信息,由13字节组成,并要作为第一个数据块出现在PNG数据流中,而且一个PNG数据流中只能有一个文件头数据块
-
其中我们关注的是前8字节的内容
-
我们经常会去更改一张图片的高度或者宽度使得一张图片显示不完整从而达到隐藏信息的目的。
域的名称 字节数 说明
Width 4bytes 图像宽度,以像素为单位Height 4bytes 图像高度,以像素为单位
3.1.2、IDAT
- 图像数据块IDAT(image data chunk):它存储实际的数据,在数据流中可包含多个连续顺序的图像数据块。
- 储存图像像数数据
- 在数据流中可包含多个连续顺序的图像数据块
- 采用LZ77算法的派生算法进行压缩
- 可以用zlib解压缩
- 值得注意的是,IDAT块只有当上一个块充满时,才会继续一个新的块。
3.1.3、IEND
- 图像结束数据IEND(image trailer chunk):它用来标记PNG文件或者数据流已经结束,并且必须要放在文件的尾部。
- 00 00 00 00 49 45 4E 44 AE 42 60 82
- IEND数据块的长度总是00 00 00 00,数据标识总是IEND 49 45 4E 44,因此,CRC码也总是 AE 42 60 82。
3.2、JPG(有损压缩)
- JPEG是有损压缩格式,将像素信息用JPEG保存成文件再读取出来,其中某些像素值会有少许变化。在保存时有个质量参数可在0至100之间选择,参数越大图片就越保真,但图片的体积也就越大。一般情况下选择70或80就足够了
- JPEG没有透明度信息
- JPG基本数据结构为两大类型:“段”和经过压缩编码的图像数据。
- 0xffd8和0xffd9为JPG文件的开始结束的标志。
名称 | 字节数 | 数据 | 说明 |
---|---|---|---|
段标识 | 1 | FF | 每个新段的开始标识 |
段类型 | 1 | 类型编码(标记码) | |
段长度 | 2 | 段内容和段长度,不包括段标识、段类型 | |
段内容 | 2 | ≤65533字节 |
JSteg隐写算法
- 基于DCT系数的变换进行数字隐写,主要思想是将秘密消息嵌入在量化后的DCT系数的最低比特位上。但对原始值为0、1的DCT系数不进行嵌入。提取秘密消息时,只需将载密图像中不等于0、I的量化DCT系数的LSB取出即可。
- DCT系数包含一个DC系数和多个AC系数。
JSteg隐写过程:
- 部分解码JPEG图像,得到二进制存储的AC系数,判断该AC系数是否等于1或0,若等于则跳过该AC系数,否则,执行下一步。
- 判断二进制存储的AC系数的LSB是否与要嵌入的秘密信息比特相同,若相同,则不对其进行修改,否则执行下一步。
- 用秘密信息比特替换二进制存储的AC系数的LSB,将修改后的AC系数重新编码得到隐秘JPEG图像。
隐写软件
- Stegdetect
通过统计分技术评估JPEG文件的DCT频率系数的隐写工具,可以检测到通过JSteg、JPHide、OutGuess、InvisibleSecrets、F5、appendX和Camouflage等这些隐写工具隐藏的信息,并且还具有基于字典暴力破解密码方法提取通过Jphide、outguess和jsteg-shell方式嵌入的隐藏信息。
https://github.com/abeluck/stegdetect - JPHS
JPEG图像的信息隐藏软件JPHS,它是由AllanLatham开发设计实现在Windows和Linux系统平台针对有损压缩JPEG文件进行信息加密隐藏和探测提取的工具。软件里面主要包含了两个程序JPHIDE和JPSEEK。JPHIDE程序主要是实现将信息文件加密隐藏到JPEG图像功能,而JPSEEK程序主要实现从用JPHIDE程序加密隐藏得到的JPEG图像探测提取信息文件,Windows版本的JPHS里的JPHSWIN程序具有图形化操作界面且具备JPHIDE和JPSEEK的功能。
图片隐写常用工具
- Binwalk
- Stegsolve
- Stegdetect
- StegSecret
- Steghide
- jhide
附:
binwalk '文件路径' #查看文件内容
binwalk -e 文件名 #提取文件内容
压缩文件打开后右上角带*说明该文件加密
当文件原始大小 小于等于字节时可以反推文件内容
Python2 crc32.py reverse 0x(crc32值)
功能,而JPSEEK程序主要实现从用JPHIDE程序加密隐藏得到的JPEG图像探测提取信息文件,Windows版本的JPHS里的JPHSWIN程序具有图形化操作界面且具备JPHIDE和JPSEEK的功能。
图片隐写常用工具
- Binwalk
- Stegsolve
- Stegdetect
- StegSecret
- Steghide
- jhide
附:
binwalk '文件路径' #查看文件内容
binwalk -e 文件名 #提取文件内容
压缩文件打开后右上角带*说明该文件加密
[外链图片转存中…(img-tMcJRga9-1624241436389)]
当文件原始大小 小于等于字节时可以反推文件内容
Python2 crc32.py reverse 0x(crc32值)