1. 程式人生 > >ctf密碼學總結

ctf密碼學總結

自己做題總結的小知識點。

1.RSA

公鑰標準檔案的字尾是  .pem

加密過程  選擇兩個大素數p和q,計算出模數N = p * q 

計算φ = (p−1) * (q−1) 即N的尤拉函式,然後選擇一個e (1<e<φ),且e和φ互質

 取e的模反數為d,計算方法: e * d ≡ 1 (mod φ) 

對明文m進行加密:c≡m^e (mod n) 或 c = pow(m,e,n),得到的B即為密文 

對密文c進行解密,m≡c^d( mod n) 或 m = pow(c,d,n),得到的A即為明文

 p 和 q :大整數N的兩個因子(factor)

 N:大整數N,我們稱之為模數(modulus)

 e 和 d:互為模反數的兩個指數(exponent)

 c 和 m:分別是密文和明文,這裡一般指的是一個十進位制的數

一般有如下稱呼:

(N,e):公鑰

(N,d):私鑰

分解N可以線上factordb.com,也可以用yafu,也可以用msieve,yafu的使用方法為:

先進入yafu的安裝資料夾,然後執行語句 yafu-x64.exe factor(N)

Msieve的使用方法為:msieve153.eve n(如果n是十六進位制的,前面要加上0x) -v

最上面一行是固定的

右上方第二行是16進位制的,需要用程式設計師計算器進行轉換

Python裡命令: print int(‘xxx’,16),原先是幾進位制就寫數字幾

Openssl語句:

(1)從公鑰中讀取e和n:openssl rsa -pubin -text -modulus -in warmup -in public.pem

引數:-pubin匯入公鑰時特有的,-text直接打印出明文,-modulus模數,-in匯入檔案(匯入公鑰檔案時前面要有-pubin,匯入私鑰檔案時不需要加-pubin)

(2)Rsatool.py生成指定的私鑰:python rsatool.py -o private.pem -e 65537 -p 123 -q 123

(3)用私鑰解密:openssl rsautl -decrypt -in flag.enc -inkey private.pem -out flag.txt

引數:這個語句主要用來用解密flag檔案的,如flag.enc,解密這種檔案的時候用私鑰檔案,私鑰檔案是用qpe三個引數利用python指令碼生成的pem檔案。將私鑰檔案和加密的flag檔案放到kali裡面執行這個語句。 Rsautl是openssl裡的解密的包,-decrypt是解密,-in是匯入待解密的檔案,-inkey是匯入私鑰檔案,-out是生成解密後的檔案,一般是txt格式。

如果已知(十六進位制的)cdn,進行解碼,直接python裡  hex(pow(c,d,n))[2:-1].decode('hex')

小總結:最簡單的rsa密碼解密就是先看給出的資訊是幾進位制,如果是十六進位制放進python裡轉換成十進位制,然後找引數,ncpqe,用yafu或者線上進行大質數分解求pq,用指令碼求出來十六進位制,然後轉換成文字字串。

2.凱撒密碼:

from pycipher import Caesar

Caesar(key=1).encipher('The quick brown fox jumps over the lazy dog')

1是偏移量,括號裡面是要解密的文字

3.base

Base64:

(1)標準base64只有64個字元(英文大小寫、數字和+、/)以及字尾“=”;

(2)base64是把3個位元組變成4個可列印字元,所以base64編碼後的字串一定能被4整除

(3)等號一定用作字尾,且數目一定是0個、1個或2個。

(4)base64解碼,用python

   Python2>>>>import base64>>>>print base64 decodestring(‘xxxxxxxx’)

(5)base64編碼還與後面幾位有關係,所以要儘可能多的知道資訊去轉換,當轉化完以後去搜索的時候,就只取前四位或者前三位。當用base64解碼時,如果解不出來有可能是不完整。

Base32:

只有大寫字母A-Z和數字234567

Base16

大寫字母ABCDEF和數字0-9

4.替換密碼

替換密碼用python指令碼

5.Hex轉字串

如果得到的全是數字,就是十進位制,需要轉換成十六進位制。兩種方法,第一種方法是python命令列裡int(‘xxx’,16),第二種方法就是在python腳本里強制轉換hex(n)。然後才可以轉換成字串,兩種方法,第一種方法是線上,第二種方法是python指令碼,在腳本里用binascii庫裡的a2b_hex方法轉換成字串(用得ASCII碼)。

6.utf-9

提示rfc4042的時候就是utf-9編碼的方式,解密需要用python指令碼。首先需要安裝utf9這個庫,然後利用開啟檔案,寫入檔案,讀取檔案,利用utf9庫裡的utf9decode方法來解密。

7.Playfair密碼

是一種雙字替換密碼,,所以字母個數一定是個偶數。最後一位如果有x的話極有可能是為了補位新增的字母,所以在提交flag的時候要適當的靈活。具體原理就不瞭解了,因為有直接的工具。

如何區分密文和祕鑰:祕鑰比密文長,並且祕鑰裡的字母不會重複

解決方法有兩個,一個是線上,國外網站需要翻牆並且比較卡,所以不推薦;第二種方法是python,可以直接在互動模式裡,也可以寫指令碼。在互動模式裡的語句如下:

>>> from pycipher import Playfair

>>> Playfair('ZKLIPOAGSUMDWFHCBVTRYENXQ').encipher('FMGKYBXTSFBNCQDSPT')  注:第一個括號裡祕鑰,encipher是加密,所以第二個括號是待加密的。可以看到祕鑰裡的字母是不重複的。

>>> Playfair('ZKLIPOAGSUMDWFHCBVTRYENXQ').decipher('HDALECIXFTVERYFAIR') 注:第一個括號是祕鑰,decipher是解密,所以第二個括號是密文,同樣祕鑰裡的字母是不重複的。

8.壓縮包解密

一種是偽加密,這種的不需要密碼就可以解開。一種是需要密碼的,需要暴力破解,可以用ziperello軟體,只針對zip檔案,也可以用ARCHPR,針對zip和rar。

偽加密的解密可以用兩種方法,一種是手動,一種是自動。手動修改時,對zip或者rar直接用UE或者Hex開啟,找到明文中 PK 一部分就是加密的,以此來找到版本標記位00 14 ,在這四個數字之後的四個數字,如果是00 00表示未加密,如果是00 09表示偽加密,只需要把9改成0即可。這個方法是在備份檔案上修改。自動修改用ZipCenOp,命令是 java –jar ZipCenOp.jar r rsa.zip。這個方法在原檔案上修改。     

9.摩爾斯密碼,替換密碼,培根密碼

摩爾斯密碼:點,橫之間的停頓,每個詞之間中等的停頓以及每個句子之間長的停頓。與培根密碼比較起來,每組密文的長度不固定。

培根密碼:A和B之間的停頓。每一組密文長度為5 。(不止可以A和B,數量不一定)

替換密碼:將明文中的元素替換另一密碼錶的元素。、

10.Rabbit密碼直接用線上進行解密

11.雜湊函式(MD2、MD4以及MD5等都屬於雜湊函式)

雜湊演算法是一個單向函式。它可以將任何大小的資料轉化為定長的“指紋”,並且無法被反向計算。另外,即使資料來源只改動了一丁點,雜湊的結果也會完全不同。這樣的特性使得它非常適合用於儲存密碼,因為我們需要加密後的密碼無法被解密,同時也能保證正確校驗每個使用者的密碼。需要提到的是,用於保護密碼的雜湊函式和你在資料結構中學到的雜湊函式是不同的。比如用於實現雜湊表這之類資料結構的雜湊函式,它們的目標是快速查詢,而不是高安全性。只有加密雜湊函式才能用於保護密碼,例如SHA256,SHA512,RipeMD和WHIRLPOOL。

如何破解雜湊函式:

(1)字典攻擊和暴力攻擊:最簡單的辦法是猜,兩種最常見的猜密碼的方法就是字典攻擊和暴力攻擊。方法一:字典攻擊需要一個字典檔案,其中的每一個詞都是經過雜湊後儲存的,將字典中的詞和需要破解的詞進行對比來破解。方法二:暴力攻擊就是嘗試每一個給定長度下的各種字元的組合,這樣會消耗大量的計算,是效率最低的方法但是可以得到正確的密碼。

(2)查表法:對於破解一系列演算法相同的雜湊值很有用。主要就是預先計算密碼錶中的每個密碼,然後把雜湊值和對應的密碼儲存到一個用於快速查詢的資料結構中。

(3)反向查表法:可以使攻擊者同時對多個雜湊值發起字典攻擊或者暴力攻擊,而且不需要預先計算。方法就是先構造一個基於密碼和使用者名稱的一對多的表,資料需要從已經入侵的資料庫獲得,然後猜測一系列的雜湊值並且從表中查詢擁有次密碼的使用者,通常許多使用者可能有著相同的密碼,因此這種攻擊方式比較有效。

(4)彩虹表:彩虹表是一種在時間和空間的消耗上找尋平衡的破解技術。它和查表法很類似,但是為了使查詢表佔用的空間更小而犧牲了破解速度。因為它更小,於是我們可以在一定的空間記憶體儲更多的雜湊值,從而使攻擊更加有效。能夠破解任何8位及以下長度MD5值的彩虹表已經出現了。

(4)加鹽:會讓查表法和彩虹表都失去作用。查表法和彩虹法只有在所有密碼都以相同的方式進行雜湊加密時才有效。如果兩個使用者密碼相同,那麼他們密碼的雜湊值也是相同的。我們可以通過“隨機化”雜湊來阻止這類攻擊,於是當相同的密碼被雜湊兩次之後,得到的值就不相同了。比如可以在密碼中混入一段“隨機”的字串再進行雜湊加密,這個被字串被稱作鹽值。如同上面例子所展示的,這使得同一個密碼每次都被加密為完全不同的字串。為了校驗密碼是否正確,我們需要儲存鹽值。通常和密碼雜湊值一起存放在賬戶資料庫中,或者直接存為雜湊字串的一部分。鹽值並不需要保密,由於隨機化了雜湊值,查表法、反向查表法和彩虹表都不再有效。攻擊者無法確知鹽值,於是就不能預先計算出一個查詢表或者彩虹表。這樣每個使用者的密碼都混入不同的鹽值後再進行雜湊,因此反向查表法也變得難以實施。

12.對稱加密和非對稱加密

對稱加密:對稱加密是對稱密碼編碼的技術,它的特點是檔案加密和解密使用相同的金鑰加密,也就是金鑰可以用作解密金鑰。對稱機密使用起來簡單快捷,金鑰較短,並且破譯困難。資料加密標準DES,國際資料加密演算法IDEA。

非對稱加密:非對稱加密需要兩個金鑰,公開金鑰和私有金鑰。並且兩個是成對使用,如果用公鑰對資料進行加密,那麼就要用對應的私鑰進行解密,如果用私鑰對資料進行加密,那麼就要用對應的公鑰進行解密。因為加密和解密是使用不同的金鑰,所以是非對稱加密演算法。