CTF中的編碼與加密題
0x00 前言
正文開始之前先閒扯幾句吧,玩CTF的小夥伴也許會遇到類似這樣的問題:表哥,你知道這是什麼加密嗎?其實CTF中腦洞密碼題(非現代加密方式)一般都是各種古典密碼的變形,一般出題者會對密文進行一些處理,但是會給留一些線索,所以寫此文的目的是想給小夥伴做題時給一些參考,當然常在CTF裡出現的編碼也可以瞭解一下。本來是想盡快寫出參考的文章,無奈期間被各種事情耽擱導致文章斷斷續續寫了2個月,文章肯定有許多沒有提及到,歡迎小夥伴補充,總之,希望對小夥伴們有幫助吧!最後歡迎小夥伴來 部落格 玩耍:P
0x01 目錄
-
常見編碼:
- ASCII編碼
- Base64/32/16編碼
- shellcode編碼
- Quoted-printable編碼
- XXencode編碼
- UUencode編碼
- URL編碼
- Unicode編碼
- Escape/Unescape編碼
- HTML實體編碼
- 敲擊碼(Tap code)
- 莫爾斯電碼(Morse Code)
- 編碼的故事
-
各種文字加密
-
換位加密:
- 柵欄密碼(Rail-fence Cipher)
- 曲路密碼(Curve Cipher)
- 列移位密碼(Columnar Transposition Cipher)
-
替換加密:
- 埃特巴什碼(Atbash Cipher)
- 凱撒密碼(Caesar Cipher)
- ROT5/13/18/47
- 簡單換位密碼(Simple Substitution Cipher)
- 希爾密碼(Hill Cipher)
- 豬圈密碼(Pigpen Cipher)
- 波利比奧斯方陣密碼(Polybius Square Cipher)
- 夏多密碼(曲折加密)
- 普萊菲爾密碼(Playfair Cipher)
- 維吉尼亞密碼(Vigenère Cipher)
- 自動金鑰密碼(Autokey Cipher)
- 博福特密碼(Beaufort Cipher)
- 滾動金鑰密碼(Running Key Cipher)
- Porta密碼(Porta Cipher)
- 同音替換密碼(Homophonic Substitution Cipher)
- 仿射密碼(Affine Cipher)
- 培根密碼(Baconian Cipher)
- ADFGX和ADFGVX密碼(ADFG/VX Cipher)
- 雙密碼(Bifid Cipher)
- 三分密碼(Trifid Cipher)
- 四方密碼(Four-Square Cipher)
- 棋盤密碼(Checkerboard Cipher)
- 跨棋盤密碼(Straddle Checkerboard Cipher)
- 分組摩爾斯替換密碼(Fractionated Morse Cipher)
- Bazeries密碼(Bazeries Cipher)
- Digrafid密碼(Digrafid Cipher)
- 格朗普雷密碼(Grandpré Cipher)
- 比爾密碼(Beale ciphers)
- 鍵盤密碼(Keyboard Cipher)
-
其他有趣的機械密碼:
- 恩尼格瑪密碼
-
程式碼混淆加密:
- asp混淆加密
- php混淆加密
- css/js混淆加密
- VBScript.Encode混淆加密
- ppencode
- rrencode
- jjencode/aaencode
- JSfuck
- jother
- brainfuck程式語言
-
相關工具
-
參考網站
0x02 正文
常見編碼
1.ASCII編碼
ASCII編碼大致可以分作三部分組成:
第一部分是:ASCII非列印控制字元(參詳ASCII碼錶中0-31);
第二部分是:ASCII列印字元,也就是CTF中常用到的轉換;
第三部分是:擴充套件ASCII列印字元(第一第三部分詳見 ASCII碼錶 解釋)。
編碼轉換示例
源文字: The quick brown fox jumps over the lazy dog
ASCII編碼對應十進位制:
#!shell
84 104 101 32 113 117 105 99 107 32 98 114 111 119 110 32 102 111 120 32 106 117 109 112 115 32 111 118 101 114 32 116 104 101 32 108 97 122 121 32 100 111 103
對應可以轉換成二進位制,八進位制,十六進位制等。
2.Base64/32/16編碼
base64、base32、base16可以分別編碼轉化8位位元組為6位、5位、4位。16,32,64分別表示用多少個字元來編碼,這裡我注重介紹base64。Base64常用於在通常處理文字資料的場合,表示、傳輸、儲存一些二進位制資料。包括MIME的email,email via MIME,在XML中儲存複雜資料。
編碼原理:Base64編碼要求把3個8位位元組轉化為4個6位的位元組,之後在6位的前面補兩個0,形成8位一個位元組的形式,6位2進位制能表示的最大數是2的6次方是64,這也是為什麼是64個字元(A-Z,a-z,0-9,+,/這64個編碼字元,=號不屬於編碼字元,而是填充字元)的原因,這樣就需要一張對映表,如下:
舉個例子(base64):
源文字:T h e
對應ascii碼:84 104 101
8位binary:01010100 01101000 01100101
6位binary:010101 000110 100001 100101
高位補0:000010101 00000110 00100001 00100101
對應ascii碼:21 6 33 37
查表:V G h l
利用Python base64模組,我們分別可以這樣加密解密base64 32 16:
3.shellcode編碼
源文字: The quick brown fox jumps over the lazy dog
編碼後:
#!shell
\x54\x68\x65\x7f\x71\x75\x69\x63\x6b\x7f\x62\x72\x6f\x77\x6e\x7f\x66\x6f\x78\x7f\x6a\x75\x6d\x70\x73\x7f\x6f\x76\x65\x72\x7f\x74\x68\x65\x7f\x6c\x61\x7a\x79\x7f\x64\x6f\x67
4.Quoted-printable 編碼
它是多用途網際網路郵件擴充套件(MIME) 一種實現方式。有時候我們可以郵件頭裡面能夠看到這樣的編碼,編碼原理 參考 。
源文字: 敏捷的棕色狐狸跳過了懶惰的狗
編碼後:
#!shell
=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=B0=E7=9A=84=E7=8B=97
編碼解碼 連結
5.XXencode編碼
XXencode將輸入文字以每三個位元組為單位進行編碼。如果最後剩下的資料少於三個位元組,不夠的部份用零補齊。這三個位元組共有24個Bit,以6bit為單位分為4個組,每個組以十進位制來表示所出現的數值只會落在0到63之間。以所對應值的位置字元代替。它所選擇的可列印字元是:+-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz,一共64個字元。跟base64列印字元相比,就是UUencode多一個“-” 字元,少一個”/” 字元。
源文字: The quick brown fox jumps over the lazy dog
編碼後: hJ4VZ653pOKBf647mPrRi64NjS0-eRKpkQm-jRaJm65FcNG-gMLdt64FjNkc+
編碼解碼 連結
6.UUencode編碼
UUencode是一種二進位制到文字的編碼,最早在unix 郵件系統中使用,全稱:Unix-to-Unix encoding,UUencode將輸入文字以每三個位元組為單位進行編碼,如果最後剩下的資料少於三個位元組,不夠的部份用零補齊。三個位元組共有24個Bit,以6-bit為單位分為4個組,每個組以十進位制來表示所出現的位元組的數值。這個數值只會落在0到63之間。然後將每個數加上32,所產生的結果剛好落在ASCII字符集中可列印字元(32-空白…95-底線)的範圍之中。
源文字: The quick brown fox jumps over the lazy dog
編碼後: M5&AE('%U:6-K(&)R;W=N(&9O>"!J=6UP<R!O=F5R('1H92!L87IY(&1O9PH*
編碼解碼 連結
7.URL編碼
url編碼又叫百分號編碼,是統一資源定位(URL)編碼方式。URL地址(常說網址)規定了常用地數字,字母可以直接使用,另外一批作為特殊使用者字元也可以直接用(/,:@等),剩下的其它所有字元必須通過%xx編碼處理。 現在已經成為一種規範了,基本所有程式語言都有這種編碼,如js:有encodeURI、encodeURIComponent,PHP有 urlencode、urldecode等。編碼方法很簡單,在該位元組ascii碼的的16進位制字元前面加%. 如 空格字元,ascii碼是32,對應16進位制是'20',那麼urlencode編碼結果是:%20。
源文字: The quick brown fox jumps over the lazy dog
編碼後:
#!shell
%54%68%65%20%71%75%69%63%6b%20%62%72%6f%77%6e%20%66%6f%78%20%6a%75%6d%70%73%20%6f%76%65%72%20%74%68%65%20%6c%61%7a%79%20%64%6f%67
編碼解碼 連結
8.Unicode編碼
Unicode編碼有以下四種編碼方式:
源文字: The
&#x [Hex]: The
&# [Decimal]: The
\U [Hex]: \U0054\U0068\U0065
\U+ [Hex]: \U+0054\U+0068\U+0065
編碼解碼 連結
9.Escape/Unescape編碼
Escape/Unescape加密解碼/編碼解碼,又叫%u編碼,採用UTF-16BE模式, Escape編碼/加密,就是字元對應UTF-16 16進製表示方式前面加%u。Unescape解碼/解密,就是去掉"%u"後,將16進位制字元還原後,由utf-16轉碼到自己目標字元。如:字元“中”,UTF-16BE是:“6d93”,因此Escape是“%u6d93”。
源文字: The
編碼後: %u0054%u0068%u0065
10.HTML實體編碼
完整編碼手冊 參考
11.敲擊碼
敲擊碼(Tap code)是一種以非常簡單的方式對文字資訊進行編碼的方法。因該編碼對資訊通過使用一系列的點選聲音來編碼而命名,敲擊碼是基於5×5方格波利比奧斯方陣來實現的,不同點是是用K字母被整合到C中。
敲擊碼錶:
#!shell
1 2 3 4 5
1 A B C/K D E
2 F G H I J
3 L M N O P
4 Q R S T U
5 V W X Y Z
12.莫爾斯電碼
摩爾斯電碼(Morse Code)是由美國人薩繆爾·摩爾斯在1836年發明的一種時通時斷的且通過不同的排列順序來表達不同英文字母、數字和標點符號的訊號程式碼,摩爾斯電碼主要由以下5種它的程式碼組成:
- 點(.)
- 劃(-)
- 每個字元間短的停頓(通常用空格表示停頓)
- 每個詞之間中等的停頓(通常用
/
劃分) - 以及句子之間長的停頓
摩爾斯電碼字母和數字對應表:
#!shell
A .- N -. . .-.-.- + .-.-. 1 .----
B -... O --- , --..-- _ ..--.- 2 ..---
C -.-. P .--. : ---... $ ...-..- 3 ...--
D -.. Q --.- " .-..-. & .-... 4 ....-
E . R .-. ' .----. / -..-. 5 .....
F ..-. S ... ! -.-.-- 6 -....
G --. T - ? ..--.. 7 --...
H .... U ..- @ .--.-. 8 ---..
I .. V ...- - -....- 9 ----.
J .--- W .-- ; -.-.-. 0 -----
K -.- X -..- ( -.--.
L .-.. Y -.-- ) -.--.-
M -- Z --.. = -...-
源文字: THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG
編碼後:
#!shell
- .... . / --.- ..- .. -.-. -.- / -... .-. --- .-- -. / ..-. --- -..- / .--- ..- -- .--. ... / --- ...- . .-. / - .... . / .-.. .- --.. -.-- / -.. --- --.
線上編碼解碼 傳送門
摩爾斯電碼除了能對字母數字編碼以外還對一些標點符號,非英語字元進行了編碼,而且還有一些特定意義的組合稱為特殊符號,比如 ·-·-·-·-·-
表達的意思是呼叫訊號,表示“我有訊息傳送”。如果你感興趣可以參考 WiKi 。
13.編碼的故事
推薦大家去看 編碼的故事 一文。
各種文字加密
文字加密可以將正常文字內容打亂為不可連讀的文字或符號(漢字 數字 字母 音樂符號 國際音標 盲文 韓文 日文 傣文 彝文 箭頭符號 花朵符號 俄文),換行等格式資訊也會被清除,達到加密的作用。在進行文字加密時可以設定一個密碼,這樣只有知道密碼的人才能解密文字。密碼可以是數字、字母和下劃線,最多九位。
加密示例:
源文字: 敏捷的棕色狐狸跳過了懶惰的狗
編碼解碼 連結
換位加密
1.柵欄密碼
(1)介紹
柵欄密碼(Rail-fence Cipher)就是把要加密的明文分成N個一組,然後把每組的第1個字元組合,每組第2個字元組合...每組的第N(最後一個分組可能不足N個)個字元組合,最後把他們全部連線起來就是密文,這裡以2欄柵欄加密為例。
明文: The quick brown fox jumps over the lazy dog
去空格: Thequickbrownfoxjumpsoverthelazydog
分組: Th eq ui ck br ow nf ox ju mp so ve rt he la zy do g
第一組: Teucbonojmsvrhlzdg
第二組: hqikrwfxupoeteayo
密文: Teucbonojmsvrhlzdghqikrwfxupoeteayo
加解密 傳送門
2.曲路密碼
曲路密碼(Curve Cipher)是一種換位密碼,需要事先雙方約定金鑰(也就是曲路路徑)。
明文: The quick brown fox jumps over the lazy dog
填入5行7列表(事先約定填充的行列數)
加密的迴路線(事先約定填充的行列數)
密文: gesfc inpho dtmwu qoury zejre hbxva lookT
3.列移位密碼
(1)介紹
列移位密碼(Columnar Transposition Cipher)是一種比較簡單,易於實現的換位密碼,通過一個簡單的規則將明文打亂混合成密文。下面我們以明文 The quick brown fox jumps over the lazy dog,金鑰 how are u為例:
填入5行7列表(事先約定填充的行列數,如果明文不能填充完表格可以約定使用某個字母進行填充)
金鑰: how are u
按how are u在字母表中的出現的先後順序進行編號,我們就有a為1,e為2,h為3,o為4,r為5,u為6,w為7,所以先寫出a列,其次e列,以此類推寫出的結果便是密文:
密文: qoury inpho Tkool hbxva uwmtd cfseg erjez
這裡提供一個行列數相等的填充規則列移位密碼加解密
0x00 前言
正文開始之前先閒扯幾句吧,玩CTF的小夥伴也許會遇到類似這樣的問題:表哥,你知道這是什麼加密嗎?其實CTF中腦洞密碼題(非現代加密方式)一般都是各種古典密碼的變形,一般出題者會對密文進行一些處理,但是會給留一些線索,所以寫此文的目的是想給小夥伴做 需要 顯示 數據類型 在屏幕上 nbsp gb2312 python2 想要 區別 python2中程序默認數據類型為ASCII,
所以需要先將數據解碼(decode)成為Unicode類型,
然後再編碼(encode)成為想要轉換的數據類型(gbk,utf-8,gb180
今天玩Python爬蟲,下載一個網頁,然後把所有內容寫入一個txt檔案中,出現錯誤;TypeError: write() argument must be str, not bytesAttributeError: 'URLError' object has no attri
0x00 前言 正文開始之前先閒扯幾句吧,玩CTF的小夥伴也許會遇到類似這樣的問題:表哥,你知道這是什麼加密嗎?其實CTF中腦洞密碼題(非現代加密方式)一般都是各種古典密碼的變形,一般出題者會對密文進行一些處理,但是會給留一些線索,所以寫此文的目的是想給小夥伴做題時給一些參考,當然常在CTF裡出現的
[CTF]中那些腦洞大開的編碼和加密
摘自:https://www.cnblogs.com/mq0036/p/6544055.html
0x00 前言
正文開始之前先閒扯幾句吧,玩CTF的小夥伴也許會遇到類似這樣的問題:表哥,你知道這是什麼加密嗎?其實CTF中腦洞密碼題(非現代加密方式) nbsp new node odin ips ren nod bsp 格式
// var CryptoJS = require("crypto-js");
// var key = CryptoJS.enc.Utf8.parse("8NONwyJtHesysWpM"); python3 encode 由於 表示 nic code .... 以及 mage 一、編碼
二、編碼與解碼
Python3中對py文件的默認編碼是urf-8。但是字符串的編碼是Unicode。
由於Unicode采用32位4個字節來表示一個字符,存儲和傳輸太浪費資 .aspx pick 可執行 repl cap picker VR ref charset 0x00.綜合
網站中包含大多編碼的解碼。
http://web2hack.org/xssee/
https://www.sojson.com/
http://web.chacuo.
下面是UTF-8編碼的轉換程式碼
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
/* 16進位制字元表 */
static const char c2x_table[] = "0
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
 
早就想寫了,今天剛好遇到一道反序列化的題就記錄一下
自己在本地搭的,原始碼如下:
index1.php
<?php
error_reporting(E_ALL & ~E_NOTICE);
$user = $_GET["user"];
$file = $_GET["fil
問:有時候在特殊情況下,需要使用GET請求來傳遞引數,而傳遞的引數中有中文字元。如何直接傳遞過去,會導致亂碼問題,針對這個情況如何解決?
原因:在使用get請求傳遞引數時,需要依賴瀏覽器環境,由於我們在javascript中沒有做任何操作,完全依賴瀏覽器進行編碼後傳遞到後臺,一旦於後臺編碼格式不
Python2.x 和 Python3.x 中關於字元編碼的問題
1. 一些基本的概念
2. 編碼格式
3. 編碼和解碼
4. Python3 的預設編碼
1,首先在電腦上安裝Redis,安裝步驟 (1),下載解壓 (2),開啟redis資料夾,按Shift+滑鼠右鍵,開啟小視窗輸入命令 redis-server redis.windows.conf (3),執行時先開啟伺服器,再開伺服器
2,在pom.xml中新增依賴
& 1、charAt():把字串分成每一個字元,從左往右提取指定位置的字元
var str = '天氣';
alert( str.charAt(1) ); &nbs
CSS網頁佈局有很多值得學習的地方,這裡和大家重點討論一下CSS中id與class命名及編碼的6個最佳習慣,相信本文介紹一定會讓你有所收穫。
一、用class_name方式寫類名
以前喜歡用class-name寫,不過好像兩樣也沒什麼差別。但我比較反對用className寫
首先,java中的一個char是2個位元組。java採用unicode,2個位元組來表示一個字元,這點與C語言中不同,C語言中採用ASCII,在大多數系統中,一個char通常佔1個位元組,
1、gbk轉換為utf-8
QString strUtf8=QString::fromLocal8Bit(char* strGBK);
2、utf-8轉換為gbk
QString strGBk = QString::fromUtf8(QString strUtf8);
【LeetCode & 劍指offer 刷題筆記】目錄(持續更新中...)
41 資料流中的中位數
題目描述
如何得到一個數據流中的中位數?如果從資料流中讀出
奇數個數值,那麼
中位數就是所有數值排序之後位於中間的數值。如果從資料流中讀出偶數個數值
最近在工作中遇到將Java環境的一個使用者ID用表單形式傳遞給.net環境做校驗,考慮到不能將使用者ID作為明文傳遞,因此利用簡單的3DES進行加密解密操作。
需要注意的就是:
(1)兩種環境下3DES加密解密的一致性問題:C#會對解密生成的byte在不滿足長度16時,自動 相關推薦
CTF中的編碼與加密題
python2與python3中編碼與解碼的區別
python3中編碼與解碼之Unicode與bytes
CTF中那些腦洞大開的編碼和加密
[CTF]中那些腦洞大開的編碼和加密
nodejs與javascript中的aes加密
Python3中字符串的編碼與解碼以及編碼之間轉換(decode、encode)
CTF中常見密碼題解密網站總結
linux 下URL中 UTF-8編碼、GB2312編碼與漢字之間的轉換
Script中16進位制Unicode編碼與中文的相互轉換
ctf中的一道反序列化題
GET請求中關於中文的編碼與解碼
Python 中的編碼與解碼
idea中redis快取與加密(MD5)
js --- 中字串與unicode編碼
CSS 中 id 與 class 命名規則及編碼的 6 個最佳習慣
幫你理清Java中字元與位元組的編碼關係
Qt中GB編碼與UTF8編碼的轉換
【LeetCode & 劍指offer刷題】查詢與排序題3:41 資料流中的中位數(295. Find Median from Data Stream)
Java和C#中3DES的加密與解密