CTF-密碼學(xué)和編碼
密碼學(xué)
1.? 維吉尼亞密碼:
在凱撒密碼基礎(chǔ)上的一種變體,只不過對于每個明文字母來說秘鑰長度可能是不一樣的
2.? 費納姆密碼:
采用二進制表示,加密時要將明文和秘鑰都轉(zhuǎn)換成7位二進制數(shù),異或得到密文。解密將密文7個為一組,然后與秘鑰異或,再講結(jié)果轉(zhuǎn)換成ascii
3.? 列置換加密:
??將明文按行填寫在一個矩陣,然后按照預(yù)定的順序按列讀取得到密文。列置換的秘鑰通常會以一個單詞的形式給出,如nice(相當(dāng)于4312)按照每個字符在字母表中出現(xiàn)的前后順序來排列。秘鑰有幾位數(shù)解密采用的矩陣就是幾列,加密時首先去除銘文中的空格,然后依次填入一個4列的矩陣的,最后一行不足的部分可以留空(或用@等符號補全),按照秘鑰的順序一次讀取
4.? Polybius(波利比奧斯密碼):
又稱棋盤密碼。將給定的密文加密為兩兩組合的數(shù)字。
比如,HELLO加密后是23 15 31 31 34
補充ADFGX密碼:
可以看做是Polybius的升級版,用ADFGX代換了五個數(shù)字
?
5.? Brainfuck
它是一種極小化的計算機語言,按照"Turing complete(完整圖靈機) "思想設(shè)計 的語言,它的主要設(shè)計思路是:用最小的概念實現(xiàn)一種“簡單”的語 言,只有八種符號,所有的操作都由這八種符號 ?> < + - . , [ ]? 的組合來完成。
6.二進制冪數(shù)加密:
由于英文字母只有26個字母,由公式可知,只要2的0、1、2、3、4、5次冪就可以表示31個單元。通過用二進制冪數(shù)表示字母序號數(shù)來加密。4=2^2 所以D加密過之后是2;15=2^0+2^1+2^2+2^3所以O(shè)加密后是0123
?
7.仿射加密:
仿射加密則是將銘文與密鑰的一部分相乘然后加上密鑰的另一部分。為便于計算將26個英文字母用數(shù)字表示:a=0,b=1.....z=25密鑰有兩個:a和b,取值范圍是[0,25]。要求a和26互質(zhì)。比如x是明文y是密文,加密公式是y=(ax+b)mod26.a=7,b=3假設(shè)明文為c,x=2,y=17,密文就是r
8.培根密碼:
是一種簡單的替換密碼,密文字符只有兩個:a,b;每個明文資福都會被替換成為一個有a,b組成的長度為5的字符串。若看到全部銘文都是由兩種字符構(gòu)成的密文可以猜測其是培根密碼。
9.輪轉(zhuǎn)機加密:
杰斐遜輪轉(zhuǎn)加密器,這個裝置由36篇同樣大小的木制轉(zhuǎn)輪,套在一根鐵桿上,沒票輪轉(zhuǎn)的圓周邊緣上刻有亂序的26個英文字母表。駕麋芳轉(zhuǎn)動加密器上的轉(zhuǎn)輪使明文(不超過36字)正好出現(xiàn)在同一行上,這時轉(zhuǎn)輪上排列的其他25行都是無意義的亂碼,吧其中一行抄寫下來得到密文。接收方街道密文轉(zhuǎn)動加密器上的轉(zhuǎn)輪使得密文正好出現(xiàn)再同一行,然后查看其他25行上的內(nèi)容,其中有意義的就是銘文。
10.ROT13:
凱撒密碼的變體,間隔數(shù)是13.PHP中的str_rot13()函數(shù)可以實現(xiàn)rot13加密。
?
11.RSA攻擊
分類:模數(shù)分解,低加密指數(shù)分解,低加密指數(shù)廣播攻擊,低解密指數(shù)攻擊,共模攻擊
m代表我們要加密的文明,c代表我們加密后的密文,p和q是我們隨機找的大素數(shù),n代表p和q的乘積稱為模數(shù),e是我們找到的和(p-1)(q-1)互質(zhì)的數(shù)稱為加密指數(shù)
12.當(dāng)鋪密碼:
當(dāng)前漢字有多少筆畫出頭,就轉(zhuǎn)化成數(shù)字幾。
如:?王夫 井工 夫口 由中人 井中 夫夫 由中大
轉(zhuǎn)換為數(shù)字:67 84 70 123 82 77 125
?
13.Jjencode
jjencode 將 JS 代碼轉(zhuǎn)換成只有符號的字符串,類似于 rrencode。aaencode 可以將 JS 代碼轉(zhuǎn)換成常用的網(wǎng)絡(luò)表情,也就是我們說的顏文字 js 加密
?
14.加鹽hash
網(wǎng)站后臺一般只儲存用戶密碼的hash值,存在一定風(fēng)險,因為如果黑客拿到了密碼的hash后,可以的通過對比已經(jīng)存在的明文與哈希的對應(yīng)數(shù)據(jù),進行對比獲得明文密碼。因此。加鹽hash,就是隨機的在用戶密碼后加上一段字符后再進行hash運算,由于黑客不知道加的鹽是什么,依然無法得到密碼。
?
編碼
(一):base家族
Base16:就是十六進制數(shù),0-9,A-F
Base32:小寫字母,234567
Base64:將二進制數(shù)編碼成字符,大小寫字母,0-9+/,還可能會使用=作為后綴,但是=并不是必須的,只有編碼后位數(shù)不是4的倍數(shù)的時候才會用=作為后綴
Base85:大小寫字母,0-9和23個字符!&@#%()*+-;<=>_~{}|
在ASCII碼表中,算上空格, 從32到126共95個是可見字符,不算上空格則為94個。也叫打印字符,即可以被直接打印出來的字符。剩下的則是不可見字符,即不可以被直接打印出來
?
(二):url編碼
url編碼(%加十六進制數(shù))如果要傳入的參數(shù)包含=或者&字符可以對其進行編碼,URL編碼格式:%十六進制ASCII碼,如&的URL編碼是%26。傳輸容易引起歧義的字符時需要編碼。若在URL中對一些ascii標(biāo)準(zhǔn)字符進行了URL編碼,瀏覽器會自動將其解碼。如果在URL當(dāng)中需要傳輸中文也必須要經(jīng)過URL編碼。+比較特殊,它在URL當(dāng)中會被視為空格。URL 編碼將字符轉(zhuǎn)換為可通過因特網(wǎng)傳輸?shù)母袷健?/span>URL 只能使用 ASCII 字符集 通過因特網(wǎng)進行發(fā)送。由于 URL 通常包含 ASCII 集之外的字符,因此必須將 URL 轉(zhuǎn)換為有效的 ASCII 格式。URL 編碼使用后跟十六進制數(shù)字的 "%" 替代不安全的 ASCII 字符。URL 不能包含空格。URL 編碼通常使用加號(+)或 %20 替代空格。
Python3默認采用Unicode,Python2默認采用ascii
?
(三):Unicode編碼
Unicode編碼包含世界所有文化、所有字符的編碼方案。在不同的應(yīng)用場合所采用的表示方法也不一樣,常見的四種表示方法:&#[HEX], &#[DEC],\U[HEX],\U+[HEX].前兩種主要用在網(wǎng)頁上,可以直接放到HTML中解析
?
(四):UTF編碼
Unicode只是對所有字符進行了編碼但沒有規(guī)定如何存儲和傳輸。UTF編碼即Unicode Transformation Format,Unicode的轉(zhuǎn)換格式。UTF-8是一種可變長的編碼方式,用1-6個字節(jié)表示一個符號。英文字母被編碼成一個字節(jié),漢字通常是3個字節(jié),生僻字才會被編碼成4-6個字節(jié)。如果字節(jié)的第一位是0則這個字節(jié)單獨就是一個字符,若第一個是1,連續(xù)有多少個1就表示當(dāng)前字符占多少字節(jié)。當(dāng)數(shù)據(jù)在計算機內(nèi)存中被處理時,統(tǒng)一用Unicode,需要存到硬盤或者傳輸?shù)臅r候需轉(zhuǎn)換為utf-8
(五):jjencode aaencode
jjencode代碼,就是將正常的js代碼轉(zhuǎn)換成復(fù)雜的只有符號的字符串編碼,
進行加密 如:[$._$_]+$._$+",\\"+$.$__+$.___+"\\"+$.__$+$.__$+$這樣的組合。
aaencode代碼,則是將正常的js代碼轉(zhuǎn)為好玩的特殊網(wǎng)絡(luò)表情符號。
如: ?ω??= /`m′)? ~┻━┻ //*′?`*/ ['_']; o=(???) 這樣的表情文字