<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh">
	<id>https://game.etao.net/w/index.php?action=history&amp;feed=atom&amp;title=%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%9B%B8%E5%85%B3%E7%BC%96%E7%A0%81</id>
	<title>计算机相关编码 - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="https://game.etao.net/w/index.php?action=history&amp;feed=atom&amp;title=%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%9B%B8%E5%85%B3%E7%BC%96%E7%A0%81"/>
	<link rel="alternate" type="text/html" href="https://game.etao.net/w/index.php?title=%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%9B%B8%E5%85%B3%E7%BC%96%E7%A0%81&amp;action=history"/>
	<updated>2026-05-06T07:53:42Z</updated>
	<subtitle>本wiki上该页面的版本历史</subtitle>
	<generator>MediaWiki 1.43.0</generator>
	<entry>
		<id>https://game.etao.net/w/index.php?title=%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%9B%B8%E5%85%B3%E7%BC%96%E7%A0%81&amp;diff=243&amp;oldid=prev</id>
		<title>127.0.0.1：​创建页面，内容为“{{Ctf_Wiki}} = 计算机相关的编码 =  本节介绍一些计算机相关的编码。  == 字母表编码 ==  * A-Z/a-z 对应 1-26 或者 0-25  &lt;span id=&quot;ascii-编码&quot;&gt;&lt;/span&gt; == ASCII 编码 ==  ascii  === 特点 ===  我们一般使用的 ascii 编码的时候采用的都是可见字符，而且主要是如下字符  * 0-9, 48-57 * A-Z, 65-90 * a-z, 97-122  === 变形 ===  ==== 二进制编码 ====  将 ascii 码对应的数字…”</title>
		<link rel="alternate" type="text/html" href="https://game.etao.net/w/index.php?title=%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%9B%B8%E5%85%B3%E7%BC%96%E7%A0%81&amp;diff=243&amp;oldid=prev"/>
		<updated>2023-07-03T03:42:44Z</updated>

		<summary type="html">&lt;p&gt;创建页面，内容为“{{Ctf_Wiki}} = 计算机相关的编码 =  本节介绍一些计算机相关的编码。  == 字母表编码 ==  * A-Z/a-z 对应 1-26 或者 0-25  &amp;lt;span id=&amp;quot;ascii-编码&amp;quot;&amp;gt;&amp;lt;/span&amp;gt; == ASCII 编码 ==  [[File:./figure/ascii.jpg|ascii]]  === 特点 ===  我们一般使用的 ascii 编码的时候采用的都是可见字符，而且主要是如下字符  * 0-9, 48-57 * A-Z, 65-90 * a-z, 97-122  === 变形 ===  ==== 二进制编码 ====  将 ascii 码对应的数字…”&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{Ctf_Wiki}}&lt;br /&gt;
= 计算机相关的编码 =&lt;br /&gt;
&lt;br /&gt;
本节介绍一些计算机相关的编码。&lt;br /&gt;
&lt;br /&gt;
== 字母表编码 ==&lt;br /&gt;
&lt;br /&gt;
* A-Z/a-z 对应 1-26 或者 0-25&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;ascii-编码&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== ASCII 编码 ==&lt;br /&gt;
&lt;br /&gt;
[[File:./figure/ascii.jpg|ascii]]&lt;br /&gt;
&lt;br /&gt;
=== 特点 ===&lt;br /&gt;
&lt;br /&gt;
我们一般使用的 ascii 编码的时候采用的都是可见字符，而且主要是如下字符&lt;br /&gt;
&lt;br /&gt;
* 0-9, 48-57&lt;br /&gt;
* A-Z, 65-90&lt;br /&gt;
* a-z, 97-122&lt;br /&gt;
&lt;br /&gt;
=== 变形 ===&lt;br /&gt;
&lt;br /&gt;
==== 二进制编码 ====&lt;br /&gt;
&lt;br /&gt;
将 ascii 码对应的数字换成二进制表示形式。&lt;br /&gt;
&lt;br /&gt;
* 只有 0 和 1&lt;br /&gt;
* 不大于 8 位，一般 7 位也可以，因为可见字符到 127。&lt;br /&gt;
* 其实是另一种 ascii 编码。&lt;br /&gt;
&lt;br /&gt;
==== 十六进制编码 ====&lt;br /&gt;
&lt;br /&gt;
将 ascii 码对应的数字换成十六进制表示形式。&lt;br /&gt;
&lt;br /&gt;
* A-Z--&amp;amp;gt;0x41~0x5A&lt;br /&gt;
* a-z--&amp;amp;gt;0x61~0x7A&lt;br /&gt;
&lt;br /&gt;
=== 工具 ===&lt;br /&gt;
&lt;br /&gt;
* jpk, ascii to number, number to ascii&lt;br /&gt;
* http://www.ab126.com/goju/1711.html&lt;br /&gt;
&lt;br /&gt;
=== 例子 ===&lt;br /&gt;
&lt;br /&gt;
[[File:./figure/ascii-example.png|ascii]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;2018-defcon-quals-ghettohackers-throwback&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 2018 DEFCON Quals ghettohackers: Throwback ===&lt;br /&gt;
&lt;br /&gt;
题目描述如下&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;Anyo!e!howouldsacrificepo!icyforexecu!!onspeedthink!securityisacomm!ditytop!urintoasy!tem!&amp;lt;/pre&amp;gt;&lt;br /&gt;
第一直觉应该是我们去补全这些叹号对应的内容，从而得到 flag，但是补全后并不行，那么我们可以把源字符串按照 &amp;lt;code&amp;gt;!&amp;lt;/code&amp;gt; 分割，然后字符串长度 1 对应字母a，长度 2 对应字母 b，以此类推&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;ori = &amp;#039;Anyo!e!howouldsacrificepo!icyforexecu!!onspeedthink!securityisacomm!ditytop!urintoasy!tem!&amp;#039;&lt;br /&gt;
sp = ori.split(&amp;#039;!&amp;#039;)&lt;br /&gt;
print repr(&amp;#039;&amp;#039;.join(chr(97 + len(s) - 1) for s in sp))&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
进而可以得到，这里同时需要假设 0 个字符为空格。因为这正好使得原文可读。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;dark logic&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== 题目 ===&lt;br /&gt;
&lt;br /&gt;
* Jarvis-basic-德军的密码&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;base-编码&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Base 编码 ==&lt;br /&gt;
&lt;br /&gt;
base xx 中的 xx 表示的是采用多少个字符进行编码，比如说 base64 就是采用以下 64 个字符编码，由于 2 的 6 次方等于 64，所以每 6 个比特为一个单元，对应某个可打印字符。3个字节就有 24 个比特，对应于 4 个 Base64 单元，即 3 个字节需要用 4 个可打印字符来表示。它可用来作为电子邮件的传输编码。在 Base64 中的可打印字符包括字母 A-Z、a-z、数字 0-9，这样共有 62 个字符，此外两个可打印符号在不同的系统中而不同。&lt;br /&gt;
&lt;br /&gt;
[[File:./figure/base64.png|base64]]&lt;br /&gt;
&lt;br /&gt;
具体介绍参见 [https://zh.wikipedia.org/wiki/Base64 Base64 - 维基百科]。&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;编码 man&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
[[File:./figure/base64_man.png|base64 编码 MAN]]&lt;br /&gt;
&lt;br /&gt;
如果要编码的字节数不能被 3 整除，最后会多出 1 个或 2 个字节，那么可以使用下面的方法进行处理：先使用 0 值在末尾补足，使其能够被 3 整除，然后再进行 base64 的编码。在编码后的 base64 文本后加上一个或两个 &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt; 号，代表补足的字节数。也就是说，当最后剩余一个八位字节（一个 byte）时，最后一个 6 位的 base64 字节块有四位是 0 值，最后附加上两个等号；如果最后剩余两个八位字节（2 个 byte）时，最后一个 6 位的 base 字节块有两位是 0 值，最后附加一个等号。参考下表：&lt;br /&gt;
&lt;br /&gt;
[[File:./figure/base64_0.png|base64 补 0]]&lt;br /&gt;
&lt;br /&gt;
由于解码时补位的 0 并不参与运算，可以在该处隐藏信息。&lt;br /&gt;
&lt;br /&gt;
与 base64 类似，base32 使用 32 个可见字符进行编码，2 的 5 次方为 32，所以每 5 bit 为 1 个分组。5 字节为 40 bit，对应于 8 个 base32 分组，即 5 个字节用 8 个 base32 中字符来表示。但如果不足 5 个字节，则会先对第一个不足 5 bit 的分组用 0 补足了 5 bit ，对后面剩余分组全部使用 “=” 填充，直到补满 5 个字节。由此可知，base32 最多只有 6 个等号出现。例如：&lt;br /&gt;
&lt;br /&gt;
[[File:./figure/base32.png|base32]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;特点-1&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 特点 ===&lt;br /&gt;
&lt;br /&gt;
* base64 结尾可能会有 &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt; 号，但最多有 2 个&lt;br /&gt;
* base32 结尾可能会有 &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt; 号，但最多有 6 个&lt;br /&gt;
* 根据 base 的不同，字符集会有所限制&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;有可能需要自己加等号&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;=也就是 3D&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* 更多内容请参见 [https://tools.ietf.org/html/rfc4648 base rfc]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;工具-1&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 工具 ===&lt;br /&gt;
&lt;br /&gt;
* http://www1.tc711.com/tool/BASE64.htm&lt;br /&gt;
* python 库函数&lt;br /&gt;
* [https://github.com/cjcslhp/wheels/tree/master/b64stego 读取隐写信息脚本]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;例子-1&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 例子 ===&lt;br /&gt;
&lt;br /&gt;
题目描述参见 &amp;lt;code&amp;gt;ctf-challenge&amp;lt;/code&amp;gt;中 [https://github.com/ctf-wiki/ctf-challenges/tree/master/misc/encode/computer/base64-stego misc 分类的 base64-stego 目录]中的 data.txt 文件。&lt;br /&gt;
&lt;br /&gt;
使用脚本读取隐写信息。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;import base64&lt;br /&gt;
&lt;br /&gt;
def deStego(stegoFile):&lt;br /&gt;
    b64table = &amp;quot;ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/&amp;quot;&lt;br /&gt;
    with open(stegoFile,&amp;#039;r&amp;#039;) as stegoText:&lt;br /&gt;
        message = &amp;quot;&amp;quot;&lt;br /&gt;
        for line in stegoText:&lt;br /&gt;
            try:&lt;br /&gt;
                text = line[line.index(&amp;quot;=&amp;quot;) - 1:-1]&lt;br /&gt;
                message += &amp;quot;&amp;quot;.join([ bin( 0 if i == &amp;#039;=&amp;#039; else b64table.find(i))[2:].zfill(6) for i in text])[2 if text.count(&amp;#039;=&amp;#039;) ==2 else 4:6]  &lt;br /&gt;
            except:&lt;br /&gt;
                pass&lt;br /&gt;
    return &amp;quot;&amp;quot;.join([chr(int(message[i:i+8],2)) for i in range(0,len(message),8)])&lt;br /&gt;
&lt;br /&gt;
print(deStego(&amp;quot;text.txt&amp;quot;))&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
输出:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;     flag{BASE64_i5_amaz1ng}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
下面是原编辑者的代码，代码的小毛病在于查找隐写字符用`last = line[-3]`写死了，这种写法默认每行尾有一个&amp;#039;\n&amp;#039;,而最后一行并非如此，因此左后一个字符显示错误。&lt;br /&gt;
&lt;br /&gt;
一大串 Base64 密文，试试补 0 位的数据。&lt;br /&gt;
&lt;br /&gt;
```python&lt;br /&gt;
# coding=utf-8&lt;br /&gt;
import base64&lt;br /&gt;
import re&lt;br /&gt;
&lt;br /&gt;
result = []&lt;br /&gt;
with open(&amp;#039;text.txt&amp;#039;, &amp;#039;r&amp;#039;) as f:&lt;br /&gt;
    for line in f.readlines():&lt;br /&gt;
        if len(re.findall(r&amp;#039;=&amp;#039;, line)) == 2:&lt;br /&gt;
            last = line[-4]&lt;br /&gt;
            if last.isupper():&lt;br /&gt;
                num = ord(last) - ord(&amp;#039;A&amp;#039;)&lt;br /&gt;
            elif last.islower():&lt;br /&gt;
                num = ord(last) - ord(&amp;#039;a&amp;#039;) + 26&lt;br /&gt;
            elif last.isdigit():&lt;br /&gt;
                num = int(last) + 52&lt;br /&gt;
            elif last == &amp;#039;+&amp;#039;:&lt;br /&gt;
                num = 62&lt;br /&gt;
            elif last == &amp;#039;/&amp;#039;:&lt;br /&gt;
                num = 63&lt;br /&gt;
            elem = &amp;#039;{0:06b}&amp;#039;.format(num)&lt;br /&gt;
            result.append(elem[2:])&lt;br /&gt;
&lt;br /&gt;
        elif len(re.findall(r&amp;#039;=&amp;#039;, line)) == 1:&lt;br /&gt;
            last = line[-3]&lt;br /&gt;
            if last.isupper():&lt;br /&gt;
                num = ord(last) - ord(&amp;#039;A&amp;#039;)&lt;br /&gt;
            elif last.islower():&lt;br /&gt;
                num = ord(last) - ord(&amp;#039;a&amp;#039;) + 26&lt;br /&gt;
            elif last.isdigit():&lt;br /&gt;
                num = int(last) + 52&lt;br /&gt;
            elif last == &amp;#039;+&amp;#039;:&lt;br /&gt;
                num = 62&lt;br /&gt;
            elif last == &amp;#039;/&amp;#039;:&lt;br /&gt;
                num = 63&lt;br /&gt;
            elem = &amp;#039;{0:06b}&amp;#039;.format(num)&lt;br /&gt;
            result.append(elem[4:])&lt;br /&gt;
&lt;br /&gt;
flag_b = &amp;#039;&amp;#039;.join(result)&lt;br /&gt;
split = re.findall(r&amp;#039;.{8}&amp;#039;, flag_b)&lt;br /&gt;
for i in split:&lt;br /&gt;
    print chr(int(i, 2)),&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
感觉像是程序有点毛病，不过还是能看出来 flag。&lt;br /&gt;
&lt;br /&gt;
```&lt;br /&gt;
flag{BASE64_i5_amaz1ng~&lt;br /&gt;
```&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;题目-1&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 题目 ===&lt;br /&gt;
&lt;br /&gt;
== 霍夫曼编码 ==&lt;br /&gt;
&lt;br /&gt;
参见 [https://zh.wikipedia.org/wiki/%E9%9C%8D%E5%A4%AB%E6%9B%BC%E7%BC%96%E7%A0%81 霍夫曼编码]。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;xxencoding&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== XXencoding ==&lt;br /&gt;
&lt;br /&gt;
XXencode 将输入文本以每三个字节为单位进行编码。如果最后剩下的资料少于三个字节，不够的部份用零补齐。这三个字节共有 24 个 Bit，以 6bit 为单位分为 4 个组，每个组以十进制来表示所出现的数值只会落在 0 到 63 之间。以所对应值的位置字符代替。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;           1         2         3         4         5         6&lt;br /&gt;
 0123456789012345678901234567890123456789012345678901234567890123&lt;br /&gt;
 |         |         |         |         |         |         |&lt;br /&gt;
 +-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
具体信息参见[https://en.wikipedia.org/wiki/Xxencoding 维基百科]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;特点-2&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 特点 ===&lt;br /&gt;
&lt;br /&gt;
* 只有数字，大小写字母&lt;br /&gt;
* +号，-号。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;工具-2&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 工具 ===&lt;br /&gt;
&lt;br /&gt;
* http://web.chacuo.net/charsetxxencode&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;题目-2&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 题目 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;url-编码&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== URL 编码 ==&lt;br /&gt;
&lt;br /&gt;
参见[https://zh.wikipedia.org/wiki/%E7%99%BE%E5%88%86%E5%8F%B7%E7%BC%96%E7%A0%81  URL 编码 - 维基百科]。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;特点-3&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 特点 ===&lt;br /&gt;
&lt;br /&gt;
* 大量的百分号&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;工具-3&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 工具 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;题目-3&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 题目 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;unicode-编码&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Unicode 编码 ==&lt;br /&gt;
&lt;br /&gt;
参见[https://zh.wikipedia.org/wiki/Unicode  Unicode - 维基百科]。&lt;br /&gt;
&lt;br /&gt;
注意，它有四种表现形式。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;例子-2&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 例子 ===&lt;br /&gt;
&lt;br /&gt;
源文本： &amp;lt;code&amp;gt;The&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;amp;#x [Hex]: &amp;lt;code&amp;gt;&amp;amp;amp;#x0054;&amp;amp;amp;#x0068;&amp;amp;amp;#x0065;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;amp;# [Decimal]: &amp;lt;code&amp;gt;&amp;amp;amp;#00084;&amp;amp;amp;#00104;&amp;amp;amp;#00101;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\U [Hex]: &amp;lt;code&amp;gt;\U0054\U0068\U0065&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\U+ [Hex]: &amp;lt;code&amp;gt;\U+0054\U+0068\U+0065&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;工具-4&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 工具 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;题目-4&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 题目 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;html-实体编码&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== HTML 实体编码 ==&lt;/div&gt;</summary>
		<author><name>127.0.0.1</name></author>
	</entry>
</feed>