CTF密碼學-加解密總結
一、密碼學基本簡介
密碼學(在西歐語文中,源于希臘語kryptós“隱藏的”,和gráphein“書寫”)是研究如何隱密地傳遞信息的學科。
在現代特別指對信息以及其傳輸的數學性研究,常被認為是數學和計算機科學的分支,和信息論也密切相關。
著名的密碼學者Ron Rivest解釋道:“密碼學是關于如何在敵人存在的環境中通訊”,自工程學的角度,這相當于密碼學與純數學的異同。
密碼學是信息安全等相關議題,如認證、訪問控制的核心。
密碼學的首要目的是隱藏信息的涵義,并不是隱藏信息的存在。密碼學也促進了計算機科學,特別是在于電腦與網絡安全所使用的技術,如訪問控制與信息的機密性。
密碼學已被應用在日常生活:包括自動柜員機的芯片卡、電腦使用者存取密碼、電子商務等等。
密碼是通信雙方按約定的法則進行信息特殊變換的一種重要保密手段。
依照這些法則,變明文為密文,稱為加密變換;變密文為明文,稱為脫密變換。
密碼在早期僅對文字或數碼進行加、脫密變換,隨著通信技術的發展,對語音、圖像、數據等都可實施加、脫密變換。
二、密碼學的發展
第一個階段是從古代到19世紀未——古典密碼(classical cryptography)
第二個階段從20世紀初到1949年——近代密碼
第三個階段從C.E.Shannon(香農)于1949年發表的劃時代論文“The Communication Theory of Secret Systems”開始——現代密碼
第四個階段從1976年W.Diffie和M.Hellman創造性地發表了論文”New Directions in Cryptography”開始——公鑰密碼
三、對稱和非對稱算法
對稱密碼算法(Symmetric cipher):加密密鑰和解密密鑰相同,或實質上等同,即從一個易于推出另一個。
又稱傳統密碼算法(Conventional cipher)、秘密密鑰算法或單密鑰算法。DES、3DES、IDEA、AES
非對稱密碼算法(Asymmetric cipher):加密密鑰和解密密鑰不同,從一個很難推出另一個。又叫公鑰密碼算法(Public-key cipher)。
其中的加密密鑰可以公開,稱為公開密鑰(public key)簡稱公鑰;
解密密鑰必須保密,稱為私人密鑰(private key),簡稱私鑰。
RSA、ECC、EIGamal
四、JS混淆
有些時候開發者為了保護勞動成果可以通過對javascript的變量名稱和過程名稱進行編碼
從而起到混淆is代碼的作用,通常使用eval函數進行混淆處理,該函數可以計算字符串,并執行其中的JS代碼。
如,對alert(‘XSS’);進行16進制轉換,然后使用eval函數進行讀取
eval(”\x61\×6c\x65\×72\×74\×28\×27\×58\x 53\×53\×27\×29\×3b”);
特點:通常在S腳本里使用eval與function函數進行混淆。
JS在線解混淆:http://www.atool.org/jscompression.php
JSFuck
JSFuck 是用6個字符[0(0!+來編寫JavaScript程序
如下圖所示,alert(‘zkaq’)經過加密后便使用了[00!+進行編寫
點擊run this 可進行解密,或將密文放在瀏覽器的console控制臺上進行解密。

JSFuck在線加解密:http://www.jsfuck.com/
Jother
Jother是一種運用于javascript語言中利用少量字符構造精簡的匿名函數方法對于字符串進行的編碼方式。其中8個少量字符包括:!+()[]{}。
只用這些字符就能完成對任意字符串的編碼(可以在瀏覽器的console控制臺上直接解密)。
例如0到9


aaencode
aaencode使用的表情符號對js代碼進編碼,可以直接在命令行中繼續解碼,或者在以下的鏈接網站進行解碼。

加解密地址:http://utf-8.jp/public/aaencode.html
五、換位加密
換位加密:柵欄密碼、曲路密碼、列位移密碼
柵欄密碼
柵欄密碼(Rail-fence Cipher)就是把要加密的明文分成N個一組
然后把每組的第1個字符組合,每組第2個字符組合..每組的第N(最后一個分組可能不足N個)個字符組合,最后把他們全部連接起來就是密文。

柵欄密碼在線加解密:http://www.qqxiuzi.cn/bianma/zhalanmima.php
曲路密碼
曲路密碼(Curve Cipher)是一種換位密碼需要事先雙方約定密鑰(也就是曲路路徑)。
例如:秘鑰就是行列數,但我感覺只需要列數就好了(可能是我理解有問題)
使用行列數構成一個表格,將明文依次填入
例如:行列為6列3行, 明文為: “flag{y0uare_p1g@}”

然后從最后一個字符像如下方式串起來即構成了密文:}ey{r@gaga_1pulf0

列位移密碼
列移位密碼(Columnar Transposition Cipher)是一種比較簡單,易于實現的換位密碼,通過一個簡單的規則將明文打亂混合成密文。

列位移密碼在線加解密:http://www.practicalcryptography.com/ciphers/classical-era/columnar-transposition/
六、替換加密
替換加密:凱撒密碼、摩斯密碼、ROT5/13/18/47、維吉尼亞密碼、培根密碼
凱撒密碼
凱撒密碼(Caesar Cipher或稱愷撒加密、愷撒變換、變換加密、位移加密)
是一種替換加密,明文中的所有字母都在字母表上向后(或向前)按照一個固定數目進行偏移后被替換成密文。
例,當偏移量是3的時候,所有的字母A將被替換成D,B變成E,以此類推。

摩斯密碼
摩爾斯電碼(Morse Code)是由美國人薩繆爾·摩爾斯在1836年發明的一種時通時斷的且通過不同的排列順序來表達不同英文字母、數字和標點符號的信號代碼,摩爾斯電碼主要由以下5種它的代碼組成:
1.點(.)
2.劃(-)
3.每個字符間短的停頓(通常用空格表示停頓)
4.每個詞之間中等的停頓(通常用/劃分)
5.以及句子之間長的停頓
源文本: THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG 編碼后:-...../--.-..-..-.-.-.-/-....-.---.---./..-.----..-/.---..---.--..../---...-..-./-...../.-...---..-.--/-..-----.
在線編碼解碼:http://ctf.ssleye.com/
ROT5/13/18/47
ROT5:只對數字進行編碼,用當前數字往前數的第5個數字替換當前數字,例如當前為0,編碼后變成5,當前為1,編碼后變成6,以此類推順序循環。
ROT13:只對字母進行編碼,用當前字母往前數的第13個字母替換當前字母,例如當前為A,編碼后變成N,當前為B,編碼后變成O,以此類推順序循環。
ROT18:這是一個異類,本來沒有,它是將ROT5和ROT13組合在一起,為了好稱呼,將其命名為ROT18。
ROT47:對數字、字母、常用符號進行編碼,按照它們的ASClI值進行位置替換,用當前字符ASClI值往前數的第47位對應字符替換當前字符,例如當前為小寫字母z,編碼后變成大寫字母K,當前為數字0,編碼后變成符號。
用于ROT47編碼的字符其ASClI值范圍是33-126,具體可參考ASCll編碼。

ROT5/13/18/47 在線加解密:http://www.qqxiuzi.cn/bianma/ROT5-13-18-47.php
維吉尼亞密碼
維吉尼亞密碼(Vigenere Cipher)是在單一愷撒密碼的基礎上擴展出多表代換密碼,根據密鑰(當密鑰長度小于明文長度時可以循環使用)來決定用哪一行的密表來進行替換,以此來對抗字頻統計。
在一個凱撒密碼中,字母表中的每一字母都會作一定的偏移
例如偏移量為3時,A就轉換為了D、B轉換為了E……而維吉尼亞密碼則是由一些偏移量不同的愷撒密碼組成。
為了生成密碼,需要使用表格法。
這一表格(如下圖所示)包括了26行字母表,每一行都由前一行向左偏移一位得到。
具體使用哪一行字母表進行編譯是基于密鑰進行的,在過程中會不斷地變換。

例如,假設明文為:
ATTACKATDAWN
選擇某一關鍵詞并重復而得到密鑰,如關鍵詞為LEMON時,密鑰為:
LEMONLEMONLE
對于明文的第一個字母A,對應密鑰的第一個字母L,于是使用表格中L行字母表進行加密,得到密文第一個字母L。
類似地,明文第二個字母為T,在表格中使用對應的E行進行加密,得到密文第二個字母X。
以此類推,可以得到:
明文:ATTACKATDAWN
密鑰:LEMONLEMONLE
密文:LXFOPVEFRNHR
解密的過程則與加密相反。
例如:根據密鑰第一個字母L所對應的L行字母表,發現密文第一個字母L位于A列,因而明文第一個字母為A。密鑰第二個字母E對應E行字母表,而密文第二個字母X位于此行T列,因而明文第二個字母為T。以此類推便可得到明文。
培根密碼
培根密碼(Baconian Cipher)是一種替換密碼,每個明文字母被一個由5字符組成的序列替換
最初的加密方式就是由AA和‘B’組成序列替換明文(所以你當然也可以用別的字母),比如字母‘D’替換成“aaabb”
以下是全部的對應關系(另一種對于關系是每個字母都有唯一對應序列,I和J與U/V各自都有不同對應序列)。

加密者需使用兩種不同字體,分別代表A和B。
準備好一篇包含相同AB字數的假信息后,按照密文格式化假信息,即依密文中每個字母是A還是B分別套用兩種字體。
解密時,將上述方法倒轉。所有字體一轉回A,字體二轉回B,以后再按上表拼回字母。

培根密碼在線加解密:http://rumkin.com/tools/cipher/baconian.php
七、其他密碼
其他密碼:MD5、SHA、仿射密碼、當鋪密碼、playfair密碼、曼徹斯特編碼
MD5
MD5(哈希算法)MD5以512位分組來處理輸入的信息,且每一分組又被劃分為16個32位子分組,經過了一系列的處理后,算法的輸出由四個32位分組組成,將這四個32位分組級聯后將生成一個128位散列值。
MD5值分為16位和32位,通常MD5的值中最大是F,如,
603F52D844017E83CA267751FEE5B61B。

MD5在線加解密地址:http://www.cmd5.com/
SHA
SHA(安全哈希算法)SHA-1是一種數據加密算法
該算法的思想是接收一段明文,然后以一種不可逆的方式將它轉換成一段(通常更小)密文
也可以簡單的理解為取一串輸入碼(稱為預映射或信息),并把它們轉化為長度較短、位數固定的輸出序列即散列值(也稱為信息摘要或信息認證代碼)的過程。
SAH的值通常是40位,最大值是F對強行攻擊的安全性:最顯著和最重要的區別是SHA-1摘要比MD5摘要長32位。
使用強行技術,產生任何一個報文使其摘要等于給定報摘要的難度對MD5是2^128數量級的操作,而對SHA-1則是2^160數量級的操作。這樣,SHA-1對強行攻擊有更大的強度。

在線加密解密:http://tool.oschina.net/encrypt?type=2
仿射密碼
概述:基本上和數學上的仿射變換類似y=ax+b,通過如此達到一一對應加密。
仿射變換加密加密過程:
加密算法:c=a*m+ b(mod n)
加密過程:
1.獲取a,b(密鑰),n(字符個數)2.獲取明文。3.加密成密文,明文轉換成各個字符所對應的數字,將所得數字帶入上面的算法公式,得到數字再轉換成對應的字符
解密過程:
算法:m=a^-1(m-b)(mod n)這里a^-1不是指倒數,而是a關于字符數量模的乘法可逆元,下面介紹一下乘法可逆元
乘法可逆元定義;
群G中任意一個元素a,都在G中有唯一的逆元a‘,具有性質aa’=a’a=e,其中e為群的單位元
簡單來說就是
加密函數:Y=(AX+B)%26
解密函數:Y=(AX+B)%26,得到:X=(A的逆元)*(Y-B)%26
在線加密解密:https://aliyunvi.com/affine
當鋪密碼
當鋪密碼是一種很有意思的密碼,專門用來加密數字的,不需要密鑰,明文信息包含在加密后的密文中。
它通過一個漢字中隱藏的信息:筆畫數,來將漢字和數字關聯起來,將漢字定義為明文,將數字定義為密文,加密是將數字映射到對應筆畫的漢字,解密是將漢字按照筆畫映射回數字。
有很多漢字的筆畫數是相同的,所以可能會有多個明文(漢字)對應同一個密文(數字),當然這個主要是看漢字筆畫映射表的選
如果映射表只準備了9個漢字,每種筆畫有一個漢字對應則是一對一的,否則是一對多的。
一對一的話有個缺點就是如果要加密的明文中有重復數字
比如33,轉換為“飛馬”比“三三”更難總結出規律,而這種沒有秘鑰的加密方式重要的就是隱藏自己的規律,所以一對多會更難被破譯。
這個加密算法比較簡單,實現的話只需要一個漢字筆畫對照表,參考鏈接中會附上一個1~10筆畫的漢字筆畫映射表。

在線加密解密:http://dsb.ink/ctf/dangpu.html
參考:https://www.cnblogs.com/cc11001100/p/9357263.html
playfair密碼
普萊費爾密碼(英文:Playfair cipher 或 Playfair square)是一種使用一個關鍵詞方格來加密字符對的加密法
1854年由一位名叫查爾斯·惠斯通(Charles Wheatstone)的英國人發明。
經萊昂·普萊費爾提倡在英國軍地和政府使用。
它有一些不太明顯的特征:密文的字母數一定是偶數;
任意兩個同組的字母都不會相同
如果出現這種字符必是亂碼和虛碼。
它使用方便而且可以讓頻度分析法變成瞎子,在1854到1855年的克里米亞戰爭和1899年的布爾戰爭中有廣泛應用。
但在1915年的一戰中被破譯了。
編寫分三步:
1.編制密碼表 2.整理明文 3.編寫密文
構成部分:
1.密鑰 2.明文3.密文4.注明的某個字母代替的另一個字母。
它依據一個5*5的正方形組成的密碼表來編寫,密碼表里排列有25個字母。如果一種語言字母超過25個,可以去掉使用頻率最少的一個。
如,法語一般去掉w或k,德語則是把i和j合起來當成一個字母看待。英語中z使用最少,可以去掉它。
第一步是編制密碼表。在這個5*5的密碼表中,共有5行5列字母。
第一列(或第一行)是密鑰,其余按照字母順序。密鑰是一個單詞或詞組,若有重復字母,可將后面重復的字母去掉。
當然也要把使用頻率最少的字母去掉。如:密鑰是Live and learn,去掉后則為liveandr。
如果密鑰過長可占用第二列或行。同時字母I和J會被當成一個字母。
如密鑰crazy dog,可編制成

第二步整理明文。
將明文每兩個字母組成一對。如果成對后有兩個相同字母緊挨或最后一個字母是單個的,就插入一個字母X(或者Q)。
如,communist,應成為co,mx,mu,ni,st。
最后編寫密文。
對明文加密規則如下:
1、若p1 p2在同一行,對應密文c1 c2分別是緊靠p1 p2 右端的字母。
其中第一列被看做是最后一列的右方。如,按照前表,ct對應dc;
2 、若p1 p2在同一列,對應密文c1 c2分別是緊靠p1 p2 下方的字母。其中第一行被看做是最后一行的下方;
3 、若p1 p2不在同一行,不在同一列,則c1 c2是由p1 p2確定的矩形的其他兩角的字母(至于橫向替換還是縱向替換要事先約好,或自行嘗試)。
如,按照前表,wh對應ku或uk。
如,依照上表,明文where there is life,there is hope.
可先整理為:WH ER ET HE RE IS LI FE TH ER EI SH OP EX
然后密文為:KU YO XD OL OY PL FK DL FU YO LG LN NG LY
將密文變成大寫,然后幾個字母一組排列。
如5個一組就是KUYOX DOLOY PLFKD LFUYO LGLNN GLY
解密:Playfair解密算法首先將密鑰填寫在一個5*5的矩陣中(去Q留Z),矩陣中其它未用到的字母按順序填在矩陣剩余位置中,根據替換矩陣由密文得到明文。
對密文解密規則如下:
1 、若c1 c2在同一行,對應明文p1 p2分別是緊靠c1 c2 左端的字母。其中最后一列被看做是第一列的左方。
2 、若c1 c2在同一列,對應明文p1 p2分別是緊靠c1 c2 上方的字母。其中最后一行被看做是第一行的上方。
3、 若c1 c2不在同一行,不在同一列,則p1 p2是由c1 c2確定的矩形的其他兩角的字母。其實就是反其道而行之。
另外PlayFair解密算法不能解決字母中連續出現’XX’的情況,但是在英語中很少有連續兩個XX的字母,所以不太影響PlayFair算法的使用。
一:密鑰:boys and girls are students (按列填充密鑰,不在同一行或列的密文,采用縱向替換) 密文GUUID BCYZC YOETX UUGAB EPBCE TDIUV LDDSB KRPRD IRUW 明文(原文):Itisnot a problem.Itis a challenge.Enjoy facing it. 二:密鑰:father (按列填充密鑰,不在同一行或列的密文,采用橫向替換) UIHEK INREL EFPVI CMRYM ORROQ GQCLV OEPOH UXHPO IDKIH C 明文(原文):Nothingin the world is difficult,if you set your mind to it.
曼徹斯特編碼
曼徹斯特編碼(Manchester)又稱裂相碼、同步碼、相位編碼,是一種用電平跳變來表示1或0的編碼方法,其變化規則很簡單,即每個碼元均用兩個不同相位的電平信號表示,也就是一個周期的方波,但0碼和1碼的相位正好相反。
由于曼徹斯特碼在每個時鐘位都必須有一次變化,因此,其編碼的效率僅可達到50%左右
編碼規則:在曼徹斯特編碼中,每一位的中間有一跳變,位中間的跳變既作時鐘信號,又作數據信號。曼徹斯特編碼有兩種相反的約定。
其中的第一種約定由1949年由GE托馬斯(GE Thomas)首次出版,隨后有眾多作家使用,例如,安迪·塔南鮑姆(Andy Tanenbaum)。
它指定對于0位,信號電平將為低高電平(假設對數據進行幅度物理編碼)-在位周期的前半段為低電平,在后半段為高電平。對于1位,信號電平將為高-低。
第二種約定也被眾多作者使用(例如William Stallings),IEEE 802.4(令牌總線)和IEEE 802.3(以太網)標準的低速版本所遵循。它指出邏輯0由高-低信號序列表示,邏輯1由低-高信號序列表示。
其中非常值得注意的是,在每一位的”中間”必有一跳變,根據此規則,可以得出曼徹斯特編碼波形圖的畫法。
例如:傳輸二進制信息0,若將0看作一位,我們以0為中心,在兩邊用虛線界定這一位的范圍,然后在這一位的中間畫出一個電平由高到低的跳變。
后面的每一位以此類推即可畫出整個波形圖。
編碼原理:曼徹斯特編碼是將時鐘和數據包含在信號流中,在傳輸代碼信息的同時,也將時鐘同步信號一起傳輸到對方。曼徹斯特編碼的每一個碼元都被調制成兩個電平,所以數據傳輸速率只有調制速率的1/2。
解碼:有保證的跳變的存在使信號可以自計時,也可以使接收器正確對準。接收器可以識別它是否在半個比特周期內未對齊,因為在每個比特周期內將不再總是存在過渡。
與更簡單的NRZ編碼方案相比,這些好處的代價是帶寬需求增加了一倍。
