【THM】Introduction to Cryptography(密碼學簡介)-學習
本文相關的TryHackMe實驗房間連結:https://tryhackme.com/r/room/cryptographyintro
本文相關內容:瞭解 AES、Diffie-Hellman 金鑰交換、雜湊、PKI 和 TLS 等加密演算法。
(大部分為機翻,若有錯誤請指出)
介紹
這個房間的目的是向各位介紹基本的密碼學概念,例如:
- 對稱加密,例如 AES
- 非對稱加密,例如 RSA
- Diffie-Hellman 金鑰交換
- hashing
- PKI(公開秘鑰基礎設施)
假設您要傳送一條訊息,除了預期的收件人之外,沒有人能理解。你會怎麼做?
最簡單的密碼之一是凱撒密碼,在 2000 多年前使用。Caesar Cipher 將字母向左或向右移動固定位數。考慮向右移動 3 進行加密的情況,如下圖所示。
收件人需要知道文字已向右移動了 3 才能恢復原始郵件。
使用相同的金鑰加密“TRY HACK ME”,我們得到“WUB KDFN PH”。
我們上面描述的凱撒密碼可以使用 1 到 25 之間的金鑰。當金鑰為 1 時,每個字母移動一個位置,其中 A 變為 B,Z 變為 A。當金鑰為25 時,每個字母移動 25 個位置,其中 A 變為 Z,B 變為 A。金鑰為 0 表示沒有變化;此外,金鑰為 26 也不會導致任何變化,因為它會導致一完全輪迴。因此,我們得出結論,凱撒密碼的金鑰空間為 25;使用者可以選擇 25 種不同的金鑰。
假設您截獲了使用凱撒密碼加密的資訊是:“YMNX NX FQUMF GWFAT HTSYFHYNSL YFSLT MTYJQ RNPJ”。我們被要求在不知道金鑰的情況下解密它。我們可以透過使用蠻力來嘗試這一點,即,我們可以嘗試所有可能的金鑰,看看哪一個最有意義。在下圖中,我們注意到金鑰為 5 時最有意義,“THIS IS ALPHA BRAVO CONTACTING TANGO HOTEL MIKE“。
凱撒密碼被認為是一種替換密碼,因為字母表中的每個字母都被另一個字母替換。
另一種型別的密碼稱為變位密碼,它透過改變字母的順序來加密訊息。讓我們考慮下圖中的一個簡單的換位密碼。我們從明文開始,“THIS IS ALPHA BRAVO CONTACTING TANGO HOTEL MIKE”,還得加上金鑰。在我們透過將明文的字母按列排序豎向填寫進格子後,我們根據金鑰重新排列,然後按行橫向讀取。
換句話說,我們按列寫入,按行讀取。另外請注意,在此示例中,我們忽略了明文中的所有空格。生成的密文“NPCOTGHOTH...”按行讀取。換句話說,換位密碼只是重新排列字母的順序,這與替換密碼不同,替換密碼在不改變字母順序的情況下替換字母。42351
此關卡介紹了簡單的替換和變位密碼,並將它們應用於由字母字元組成的明文。
若要使加密演算法被認為是安全的,應該做到讓恢復原始訊息(即明文)是不可行的。(用數學術語來說,我們需要一個難題,即一個不能在多項式時間內解決的問題(時間複雜度要高)。
我們可以在多項式時間內解決問題,即使對於很長的密文輸入也是可行的,儘管計算機可能需要相當長的時間才能完成。
如果加密訊息可以在一週內被破解,則使用的加密將被視為不安全。但是,如果加密資訊可以在 100 萬年內被破解,那麼加密將被認為實際上是安全的。
考慮單字母替換密碼,其中每個字母都對映到一個新字母。例如,在英語中,您將“a”對映到 26 個英文字母之一,然後將“b”對映到剩餘的 25 個英文字母之一,然後將“c”對映到剩餘的 24 個英文字母之一,依此類推。
例如,我們可以選擇字母表“abcdefghijklmnopqrstuvwxyz”中的字母分別對映到“xpatvrzyjhecsdikbfwunqgmol”。換句話說,“a”變成“x”,“b”變成“p”,依此類推。收件人需要知道金鑰“xpatvrzyjhecsdikbfwunqgmol”才能成功解密加密郵件。
此演算法可能看起來非常安全,特別是因為嘗試其他所有可能的金鑰是不可行的。但是,可以使用不同的技術來使用這種加密演算法破解密文。
這種演算法的一個弱點是字母頻率。在英語文字中,最常見的字母是“e”、“t”和“a”,因為它們的出現頻率分別為 13%、9.1% 和 8.2%。此外,在英語文字中,最常見的首字母是“t”、“a”和“o”,因為它們分別出現在 16%、11.7% 和 7.6% 處。除此之外,大多數訊息單詞都是字典單詞,您將能夠立即使用字母替換密碼破解加密文字。
我們真的不需要使用加密金鑰來解密接收到的這條密文:“Uyv sxd gyi siqvw x sinduxjd pvzjdw po axffojdz xgxo wsxcc wuidvw.“如下圖所示,使用quipqiup這樣的網站,需要一點時間才能發現原文是“The man who moves a mountain begins by carrying away small stones”。此示例清楚地表現出這種演算法已被破解,不能夠應用於機密通訊。
答題
您已收到以下加密訊息:
“Xjnvw lc sluxjmw jsqm wjpmcqbg jg wqcxqmnvw;xjzjmmjd lc wjpm sluxjmw jsqm bqccqm zqy.”Zlwvzjxj Zpcvcol
你可以猜到這是一句名言。是誰說的?
WP
我們進入網站quipqiup - cryptoquip and cryptogram solver即可根據詞頻解密簡單的替換密碼
對稱加密
讓我們回顧一些術語:
- 加密演算法或密碼:此演算法定義加密和解密過程。
- 金鑰:加密演算法需要金鑰才能將明文轉換為密文,反之亦然。
- 明文是我們要加密的原始訊息
- 密文是經過加密後的訊息
對稱加密演算法使用相同的金鑰進行加密和解密。因此,通訊雙方需要在能夠交換任何訊息之前就金鑰達成一致。
在下圖中,傳送方向加密過程提供了明文和獲取密文的金鑰。密文通常透過某種通訊通道傳送。
在另一端,接收方使用傳送方使用的相同金鑰提供解密過程,以便從接收到的密文中恢復原始明文。如果不知道金鑰,接收方將無法恢復明文。
美國國家標準與技術研究院(NIST)於1977年釋出了資料加密標準(DES)。DES是一種對稱加密演算法,使用56位大小的金鑰。1997年,破解使用DES加密資訊的挑戰得到了解決。因此,證明使用暴力搜尋找到金鑰並破解使用DES加密的訊息是可行的。1998年,DES金鑰在56小時內被破解。這些情況表明DES不再被認為是安全的。
NIST於2001年釋出了高階加密標準(AES)。與DES一樣,它也是一種對稱加密演算法;然而,它使用128、192或256位大小的金鑰,它仍然被認為是安全的,並且今天仍在使用。AES多次重複以下四種轉換:
SubBytes(state)
:此轉換查詢給定替換表(S-box)中的每個位元組,並用相應的值替換它。是16位元組,即128位,儲存在一個4 × 4的陣列中。state
ShiftRows(state)
:第二行移動一位,第三行移動兩位,第四行移動三位。如下圖所示。MixColumns(state)
:每列乘以一個固定的矩陣(4 × 4陣列)。AddRoundKey(state)
:透過異或操作向狀態中新增一個圓key。
轉換輪次的總數取決於金鑰的大小。
不要擔心,如果你覺得這種加密演算法非常神秘,那就對了!我們的目的不是學習AES如何工作的細節,也不是將其實現為一個程式設計庫;目的是瞭解古代加密演算法和現代加密演算法在複雜性上的差異。如果您想深入瞭解細節,可以檢視AES規範,包括其釋出的標準FIPS PUB 197中的虛擬碼和示例。
(加密原理動畫解釋5分鐘搞定AES演算法)
除了AES之外,許多其他對稱加密演算法也被認為是安全的。下面是GPG (GnuPG) 2.37.7支援的對稱加密演算法列表,例如:
加密演算法 | 筆記 |
---|---|
AES, AES192, AES256 | AES,金鑰大小為128、192和256位 |
IDEA | 國際資料加密演算法(IDEA) |
3DES | 三倍的 DES(資料加密標準),並且基於DES。我們應該注意到3DES將在2023年棄用,2024年不允許使用。 |
CAST5 | 也稱為CAST-128。一些資料表明,CAST代表其作者的名字:卡萊爾·亞當斯和斯塔福德·塔瓦雷斯。 |
BLOWFISH | 由Bruce Schneier設計 |
TWOFISH | 由Bruce Schneier設計,源自BLOWFISH |
CAMELLIA128, CAMELLIA192, CAMELLIA256 | 由三菱電機和日本NTT設計。它的名字來源於山茶花。 |
目前所提到的演算法都是分組密碼對稱加密演算法。分組密碼演算法將輸入(明文)轉換為塊並對每個塊進行加密。一個塊通常是128位。在下面的圖中,我們要加密明文“TANGO HOTEL MIKE”,共16個字元。第一步是用二進位制表示它。如果我們使用ASCII,“T”十六進位制格式是“0x54
”,“A”十六進位制格式是“0x41
”,以此類推。每兩個十六進位制數字組成8位,代表一個位元組。128位的塊實際上是16個位元組,用4 × 4陣列表示。128位塊作為一個單元饋入加密方法。
另一種對稱加密演算法是流密碼,它一個位元組一個位元組地加密明文。考慮這樣一個情況,我們想要加密訊息“TANGO HOTEL MIKE”;每個字元都需要轉換成二進位制表示。如果我們使用ASCII,“T”十六進位制格式是“0x54
”,“A”十六進位制格式是“0x41
”,以此類推。加密方法每次只處理一個位元組。如下圖所示:
對稱加密解決了本文討論的許多安全問題。假設Alice和Bob見面,選擇了一種加密演算法,並就一個特定的金鑰達成了一致。我們假設所選擇的加密演算法是安全的,並且金鑰是安全的。讓我們來看看我們可以實現什麼:
- 機密性:如果Eve截獲了加密資訊,她將無法恢復明文。因此,Alice和Bob之間交換的所有訊息都是機密的,只要它們是加密傳送的。
- 完整性:當Bob接收到一條加密的訊息並使用他與Alice商定的金鑰成功解密時,Bob可以確保沒有人可以透過通道篡改訊息。當使用安全的現代加密演算法時,對密文的任何微小修改都會阻止成功解密,或者導致解密出的明文出現亂碼。
- 真實性:能夠使用金鑰解密密文也證明了訊息的真實性,因為只有Alice和Bob知道金鑰。
我們才剛剛開始,我們現在知道了如何維護機密性,檢查完整性並確保交換訊息的真實性。
更實際和有效的方法將在以後的任務中提出。現在的問題是,這種加密演算法是否可以擴充套件。
對於Alice和Bob,我們需要一把鑰匙。如果我們有Alice、Bob和Charlie,我們需要三把鑰匙:一把給Alice和Bob,另一把給Alice和Charlie,第三把給Bob和Charlie。然而,鑰匙的數量增長很快;100個使用者之間的通訊需要近5000個不同的金鑰。(如果你對它背後的數學很好奇,那就是99+98+97…+1 = 4950)。
此外,如果一個系統遭到破壞,他們需要建立新的金鑰,以便與其他99個使用者一起使用。另一個問題是找到一個與所有其他使用者交換金鑰的安全通道。顯然,這種情況很快就會失控。
在下一個任務中,我們將介紹非對稱加密。使用非對稱加密解決的一個問題是,100個使用者只需要共享總共100個金鑰就可以安全通訊。(如前所述,對稱加密將需要大約5000個金鑰來保護100個使用者的通訊。)
有許多程式可用於對稱加密。我們將重點關注兩種,它們也廣泛用於非對稱加密:
- GNU隱私保護
- OpenSSL專案
GNU隱私保護
GNU Privacy Guard,也稱為GnuPG或GPG,實現了OpenPGP標準。
我們可以使用GnuPG (GPG)加密檔案,使用以下命令:
gpg --symmetric --cipher-algo CIPHER message.txt
其中CIPHER為加密演算法名稱。可以使用該命令檢視支援的密碼:
gpg --version
加密後的檔案將儲存為message.txt.gpg
預設輸出是二進位制OpenPGP格式;但是,如果您希望建立一個可以在任何文字編輯器中開啟的ASCII加密輸出,則應該新增該選項:--armor
例如: gpg --armor --symmetric --cipher-algo CIPHER message.txt
可以使用以下命令解密:
gpg --output original_message.txt --decrypt message.gpg
OpenSSL專案
OpenSSL專案負責維護OpenSSL軟體。
我們可以使用以下命令使用OpenSSL加密檔案:
openssl aes-256-cbc -e -in message.txt -out encrypted_message
我們可以使用以下命令解密輸出檔案:
openssl aes-256-cbc -d -in encrypted_message -out original_message.txt
為了提高加密的安全性和抗暴力攻擊的彈性,我們可以新增使用基於密碼的金鑰派生函式2 (PBKDF2)-pbkdf2
;此外,我們可以指定密碼的迭代次數-iter NUMBER
,以使用它派生加密金鑰。要迭代10,000次,前面的命令將變成:
openssl aes-256-cbc -pbkdf2 -iter 10000 -e -in message.txt -out encrypted_message
因此,解密命令變成:
openssl aes-256-cbc -pbkdf2 -iter 10000 -d -in encrypted_message -out original_message.txt
在接下來的問題中,我們將使用攻擊機進行 gpg
和 openssl
對稱加密。
此任務所需的檔案位於/root/Rooms/cryptographyintro/task02
此任務附帶的zip檔案是任務2、3、4、5和6中的問題檔案。
答題
1.使用 gpg
用金鑰 s!kR3T55
解密檔案 quote01
加密(使用AES256)。檔案中的第三個單詞是什麼?
2.使用 openssl
對用金鑰 s!kR3T55
加密(使用AES256-CBC)的檔案 quote02
進行解密。檔案中的第三個單詞是什麼?
3.使用 gpg
解密用金鑰 s!kR3T55
加密(使用CAMELLIA256)的檔案 quote03
。檔案中的第三個單詞是什麼?
WP
1.使用命令:
gpg --output original_message.txt --decrypt quote01.txt.gpg
並且輸入秘鑰:”s!kR3T55“成功獲取明文
2.使用命令:
openssl aes-256-cbc -d -in quote02 -out original_message.txt
並且輸入秘鑰:”s!kR3T55“成功獲取明文
3.使用命令:
gpg --output original_message.txt --decrypt quote03.txt.gpg
並且輸入秘鑰:”s!kR3T55“成功獲取明文
非對稱加密
對稱加密要求使用者找到一個安全的通道來交換金鑰。透過安全通道,我們主要關注保密性和完整性。換句話說,我們需要一個沒有第三方可以竊聽和讀取流量的通道;此外,沒有人可以更改傳送的訊息和資料。
非對稱加密使得在沒有安全通道的情況下交換加密訊息成為可能;我們只需要一個可靠的渠道。透過可靠的渠道,我們主要關心的是渠道的完整性,而不是保密性。
當使用非對稱加密演算法時,我們將生成一個金鑰對:一個公鑰和一個私鑰。公鑰與全世界共享,或者更具體地說,與想要與我們安全通訊的人共享。私鑰必須安全地儲存,我們絕不能讓任何人訪問它。此外,即使知道公鑰,也無法獲得私鑰。
這個金鑰對是如何工作的?
如果訊息是用一個金鑰加密的,則可以用另一個金鑰解密。換句話說:
- 如果Alice使用Bob的公鑰加密訊息,則只能使用Bob的私鑰解密訊息。
- 相反,如果Bob使用他的私鑰加密訊息,則只能使用Bob的公鑰解密訊息。
保密
我們可以使用非對稱加密,透過使用接收方的公鑰加密訊息來實現機密性。從下面兩張圖中我們可以看到:
Alice想要確保她與Bob的通訊是保密的。她使用Bob的公鑰加密訊息,Bob使用他的私鑰解密訊息。例如,Bob的公鑰預計將釋出在公共資料庫或他的網站上。
當Bob想要回復Alice時,他使用Alice的公鑰加密他的訊息,而Alice可以使用她的私鑰解密。
換句話說,在確保訊息的機密性的同時,與Alice和Bob通訊變得很容易。唯一的要求是,各方都有自己的公鑰可供傳送方使用。
注意:在實踐中,對稱加密演算法允許比非對稱加密更快的操作;因此,我們將在後面介紹如何使用這兩種方法的優點。
完整性、真實性和不可否認性
除了機密性之外,非對稱加密還可以解決完整性、真實性和不可否認性問題。假設Bob想要發表一個宣告,並且希望每個人都能夠確認這個宣告確實來自他。Bob需要使用他的私鑰加密訊息;接收方可以使用Bob的公鑰解密它。如果使用Bob的公鑰成功解密訊息,則意味著使用Bob的私鑰對訊息進行了加密。(實際上,他會對原始訊息的雜湊值進行加密。稍後我們將對此進行詳細說明。)
使用Bob的公鑰成功解密可以得出一些有趣的結論。
- 首先,資訊沒有被改變(通訊渠道);這證明了訊息的完整性。
- 其次,知道沒有人可以訪問Bob的私鑰,我們可以確定這條訊息確實來自Bob;這證明了訊息的真實性。
- 最後,因為除了Bob以外沒有人可以訪問Bob的私鑰,Bob不能否認傳送了這條訊息;這建立了不可否認性。
我們已經看到了非對稱加密如何幫助建立機密性、完整性、真實性和不可否認性。在實際場景中,非對稱加密在加密大型檔案和大量資料時可能相對較慢。在另一項任務中,我們將看到如何將非對稱加密與對稱加密結合使用,以相對更快地實現這些安全目標。
RSA
RSA得名於它的發明者Rivest、Shamir和Adleman。它的工作原理如下:
1.選擇兩個質數p 和q ,算出他們的乘積n = p × q ,算出對應的尤拉函式φ ( n )(利用性質φ ( n ) = φ ( p ) × φ ( q ) = ( p − 1 ) ( q − 1 ))。
2.選擇一個e ,使得e < φ ( n )並且e 與φ ( n ) 互質。
3.算出e 的一個相對於φ ( n )的模反元素d 。
4.( e , n ) 為公鑰,( d , n ) 為私鑰,資訊(明文)m 長度小於n 。
5.加密:c=m^e(mod n)
6.解密:m=c^d~(mod n)
如果上面的數學方程看起來太複雜,不要擔心;你不需要數學就能使用RSA,因為它很容易透過程式和程式設計庫獲得。
RSA安全性依賴於質數分解,這是一個難題。p乘以q很容易;然而,在給定n的情況下找到p和q是非常耗時的。此外,為了保證安全性,p和q應該是相當大的數字,例如,每個都是1024位(這是一個超過300位的數字)。值得注意的是,RSA依賴於安全的隨機數生成,與其他非對稱加密演算法一樣。如果對手可以猜出p和q,那麼整個系統將被認為是不安全的。
讓我們考慮下面的實際示例。
-
Bob選擇了兩個素數:p = 157和q = 199。他計算出N = 31243。
-
然後ϕN (N) =30888,鮑勃選擇e = 163於是d = 379
是因為e×d = 163×379 = 61777並且61777 mod 30888 = 1。公鑰為(31243,163),私鑰為(31243,379)。
-
假設要加密的值是x = 13,那麼Alice會計算併傳送y = x^e mod N = 13^163 mod 31243 = 16342。
-
Bob將透過計算x = y ^d mod N = 16341^379 mod 31243 = 13來解密接收到的值。
前面的例子是為了更好地理解它背後的數學原理。要檢視p和q的實值,讓我們使用 openssl
之類的工具建立一個實對。
user@TryHackMe$ openssl genrsa -out private-key.pem 2048
user@TryHackMe$ openssl rsa -in private-key.pem -pubout -out public-key.pem
writing RSA key
user@TryHackMe$ cat public-key.pem
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAymcAeYg1ohPQLHu7u9l1
UutN8bCP7r6czRX2zrQrpElYrm5mHERi1xweWEhTJ/0Q13FJcHLGtLbdQc0rGpOd
DnYJBuzrqXU2hC7E7dlqLsj63NPADqlOGYCGCWnm/HGM2WuVtDXqRitN4zeNKEWI
QmEctfucopZx5AVJ1vTn+qMv/0D6QU7Mm65MTSYg1SCRA0D0N9NLMj4rYlLOIr5q
5g3iunAE4tCROMcHf7fxWMuWdJTdtxTv7+4P5XGkWrWriO22JFHp9N22Fm96V9jH
7aASRkIZvQFmx+1dl7btZDhsm2ezU07LBabv9efj0gIwz6P3mTJVm+wxaDH6jiXB
dwIDAQAB
-----END PUBLIC KEY-----
user@TryHackMe$ openssl rsa -in private-key.pem -text -noout
Private-Key: (2048 bit, 2 primes)
modulus:
00:ca:67:00:79:88:35:a2:13:d0:2c:7b:bb:bb:d9:
75:52:eb:4d:f1:b0:8f:ee:be:9c:cd:15:f6:ce:b4:
2b:a4:49:58:ae:6e:66:1c:44:62:d7:1c:1e:58:48:
53:27:fd:10:d7:71:49:70:72:c6:b4:b6:dd:41:cd:
2b:1a:93:9d:0e:76:09:06:ec:eb:a9:75:36:84:2e:
c4:ed:d9:6a:2e:c8:fa:dc:d3:c0:0e:a9:4e:19:80:
86:09:69:e6:fc:71:8c:d9:6b:95:b4:35:ea:46:2b:
4d:e3:37:8d:28:45:88:42:61:1c:b5:fb:9c:a2:96:
71:e4:05:49:d6:f4:e7:fa:a3:2f:ff:40:fa:41:4e:
cc:9b:ae:4c:4d:26:20:d5:20:91:03:40:f4:37:d3:
4b:32:3e:2b:62:52:ce:22:be:6a:e6:0d:e2:ba:70:
04:e2:d0:91:38:c7:07:7f:b7:f1:58:cb:96:74:94:
dd:b7:14:ef:ef:ee:0f:e5:71:a4:5a:b5:ab:88:ed:
b6:24:51:e9:f4:dd:b6:16:6f:7a:57:d8:c7:ed:a0:
12:46:42:19:bd:01:66:c7:ed:5d:97:b6:ed:64:38:
6c:9b:67:b3:53:4e:cb:05:a6:ef:f5:e7:e3:d2:02:
30:cf:a3:f7:99:32:55:9b:ec:31:68:31:fa:8e:25:
c1:77
publicExponent: 65537 (0x10001)
privateExponent:
10:fe:00:be:33:3f:3d:72:28:61:f3:a9:59:25:f2:
81:99:9b:9b:94:d5:20:98:04:15:fb:a8:12:c6:71:
7b:83:64:dc:90:0c:26:87:5f:3c:eb:f1:68:3b:fa:
2f:3b:41:b4:b4:a0:13:be:af:0b:f0:e6:36:66:01:
1e:64:12:25:6a:a7:6b:5b:6c:95:77:6f:b2:3d:32:
ef:3c:f7:7b:22:08:5d:8d:b1:6c:09:ae:b2:d9:65:
67:58:ea:b9:7a:d6:f6:51:df:e9:97:35:29:da:ec:
d9:0c:8a:df:3c:a7:29:db:79:4b:95:ea:1a:84:42:
df:7f:ca:29:2f:ba:62:02:37:05:c0:b0:c2:ff:42:
6b:fb:e1:36:40:10:ae:11:0f:d8:87:2f:fe:10:2e:
a4:60:de:ff:fe:c8:ab:0b:29:fa:6c:20:ec:87:33:
46:c0:cd:96:36:cb:9b:ca:81:17:e5:c3:eb:34:b2:
83:0f:52:cc:e9:68:bd:cb:d2:85:2f:fe:c4:47:76:
df:94:69:ce:7b:8a:50:71:36:96:e6:35:fb:fb:b4:
4a:ac:63:9b:9d:1b:bb:32:71:31:45:a2:25:33:cc:
f7:a5:fb:9f:66:b1:4e:30:ce:9d:71:e8:fa:7d:5f:
33:a0:c1:94:0a:b7:b7:f3:16:7e:4f:ad:89:3d:ba:
51
prime1:
00:e0:3d:87:b3:d3:1f:d2:c6:66:23:83:a5:95:d5:
20:35:f8:d8:c0:94:cf:cc:d2:04:d4:e4:ef:cf:c2:
94:00:10:cd:d1:4a:df:09:4e:7e:95:f8:70:08:b1:
20:98:8a:e3:88:f7:cc:a8:32:62:32:68:f6:1f:c0:
fb:c1:71:41:8c:21:a3:ff:20:e6:96:d0:6e:4b:66:
61:08:d0:b7:26:48:27:62:a7:d3:ff:36:55:c8:e1:
ab:91:48:90:fb:b5:b1:92:be:90:06:a8:40:1b:2a:
2d:53:1e:87:fc:a7:8a:57:72:0b:e5:35:71:7b:dd:
8c:e5:b5:ab:64:7c:37:c5:0d
prime2:
00:e7:11:ac:50:f5:dc:16:cf:20:46:77:5d:ca:16:
29:36:35:89:95:c0:f8:4b:42:ef:03:a0:f1:ce:2e:
1b:da:55:a9:ff:5a:28:4d:78:c5:8a:e2:55:9b:94:
b4:56:ec:ab:1b:dd:b8:07:be:dd:d5:0f:49:90:b3:
ed:a2:d7:78:38:24:d5:9e:7d:a2:e8:8c:e0:2a:33:
32:21:1f:0e:6b:aa:0b:b4:11:6a:bd:8f:d9:86:3f:
ad:42:c8:bc:42:23:21:39:8d:0c:60:f2:ca:2a:00:
0a:8e:de:fb:1a:3c:51:9d:f2:dc:0a:59:80:d6:a4:
47:5c:02:a3:d0:30:1d:47:93
[...]
我們執行了三個命令:
openssl genrsa -out private-key.pem 2048
:對於openssl
,我們使用genrsa
來生成RSA私鑰。使用-out
,我們指定生成的私鑰儲存為private-key.pem
。我們新增了2048
來指定2048位的金鑰大小。openssl rsa -in private-key.pem -pubout -out public-key.pem
:使用openssl
,我們指定我們使用RSA演算法與rsa
選項。我們指定要使用-pubout
獲取公鑰。最後,我們使用-in private-key.pem
設定私鑰作為輸入,並使用-out public-key.pem
儲存輸出。openssl rsa -in private-key.pem -text -noout
:我們很想看到真正的RSA變數,所以我們使用-text -noout
。p, q, N, e,和d的值分別是prime1
,prime2
,modulus
,publicExponent
和privateExponent
。
如果我們已經有了接收方的公鑰,我們可以使用命令 openssl pkeyutl -encrypt -in plaintext.txt -out ciphertext -inkey public-key.pem -pubin
對其進行加密
接收方可以使用命令 openssl pkeyutl -decrypt -in ciphertext -inkey private-key.pem -out decrypted.txt
解密它。
答題
1.Bob收到了Alice發給他的檔案 ciphertext_message
。你可以在同一個資料夾裡找到你需要的金鑰。原始明文的第一個字是什麼?
2.看一下Bob的RSA私鑰。p的最後一個位元組是什麼?
WP
1.Alice發給Bob的檔案應該是用Bob的公鑰加密的,Bob要解密應該使用Bob的私鑰,使用以下命令:
openssl pkeyutl -decrypt -in ciphertext_message -inkey private-key-bob.pem -out decrypted.txt
2、3.使用以下命令檢視p、q、n、e、d的變數:
openssl rsa -in private-key-bob.pem -text -noout
Diffie-Hellman 金鑰交換技術
Alice和Bob可以透過不安全的通道進行通訊。所謂不安全,我們指的是存在竊聽者,他們可以讀取在這個通道上交換的訊息。在這種情況下,Alice和Bob怎麼能就一個金鑰達成一致呢?一種方法是使用Diffie-Hellman金鑰交換。
Diffie-Hellman是一種非對稱加密演算法。它允許在公共通道上交換秘密。
- Alice和Bob都統一q和g的值。為了使這個式子成立,q應該是一個質數,g是一個滿足一定條件的小於q的數。(在模演算法中,g是一個生成器。)在這個例子中,我們取q = 29, g = 3。
- Alice隨機選擇一個小於q的數a,計算出A = (g^a ) mod q,其中a必須保密;但是A被髮送給Bob。假設Alice選擇數字a = 13並計算出A = 3^13 %29 = 19並將其傳送給Bob。
- Bob隨機選擇一個小於q的數字b,計算出B = (g^b ) mod q, Bob必須對b保密;但是他把B送給了Alice。讓我們考慮Bob選擇數字b = 15並計算B= 3^15 %29 = 26的情況。他繼續把它寄給Alice。
- Alice接收到B,計算key = B^a mod q。數值示例key = 26^13 mod 29 = 10。
- Bob接收到A,計算出key = A^b mod q。數值示例key = 19^15 mod 29 = 10。
我們可以看到Alice和Bob得到了同一個秘密金鑰。
儘管竊聽者已經知道了q、g、A和B的值,但他們無法計算出Alice和Bob交換的金鑰。以上步驟總結如下圖所示。
雖然我們選擇的數字可以很容易地找到a和b,即使不使用計算機,現實世界的例子也會選擇長度為256位的q。用十進位制表示,就是115右邊加75個零(我也不知道怎麼讀,但有人告訴我它的讀法是115 qutuorvigintillion)。如此大的q將使得即使知道q、g、a和b,也無法找到a或b。
讓我們看一下實際的Diffie-Hellman引數。我們可以使用 openssl
來生成它們;我們需要指定選項 dhparam
來表示我們想要生成Diffie-Hellman引數以及指定的位元大小,例如 2048
或 4096
。
在下面的控制檯輸出中,我們可以使用命令 openssl dhparam -in dhparams.pem -text -noout
檢視素數 P
和生成器 G
。(這與我們對RSA私鑰所做的類似。)
user@TryHackMe$ openssl dhparam -out dhparams.pem 2048
Generating DH parameters, 2048 bit long safe prime
[...]
$ openssl dhparam -in dhparams.pem -text -noout
DH Parameters: (2048 bit)
P:
00:82:3b:9d:b5:29:31:f8:12:fe:21:e1:90:30:37:
ac:d2:48:41:f7:d7:55:e5:d2:5d:dd:87:67:9e:bd:
b3:97:df:05:a9:d2:d9:56:4f:66:b5:d9:d8:65:06:
58:c3:8f:b3:0e:30:d2:9a:0b:c3:0a:56:8d:fc:0f:
f2:e2:9e:4f:16:16:93:4e:b9:a4:c3:9c:09:2d:48:
a2:ec:b6:97:92:63:a3:b4:75:36:3f:51:77:ca:ac:
44:6d:99:eb:4d:4a:97:d5:4b:52:c8:07:f8:16:30:
37:d3:b2:47:30:e6:4e:bc:6a:53:d1:9b:6a:4d:91:
7a:4b:4f:af:3b:f0:ce:b9:ed:91:4d:8b:52:5a:3f:
bb:6b:06:ae:32:95:7d:53:da:9b:ce:b0:ec:7d:81:
25:05:d8:ce:ca:76:e7:d1:5a:31:13:d2:9f:62:b4:
d5:ad:7d:cd:c9:ab:3d:28:e3:92:27:9f:f3:66:a0:
be:61:49:cc:47:21:d8:e0:2c:e8:c6:35:4b:2f:ba:
35:36:8f:bb:41:c6:89:b2:60:3c:62:bb:fe:bf:59:
d3:7f:05:69:55:dc:61:1b:b4:bb:68:fa:65:1e:2e:
46:2f:2d:21:62:d1:9f:a0:2b:aa:81:df:3a:f9:7d:
0b:9d:0e:47:68:01:4f:6e:81:cc:4c:2a:91:fc:8c:
f4:6f
G: 2 (0x2)
Diffie-Hellman金鑰交換演算法允許雙方在一個不安全的通道上就一個秘密達成一致。然而,所討論的金鑰交換很容易受到中間人(MitM)攻擊;攻擊者可能會回覆假裝成Bob的Alice,並回復假裝成Alice的Bob。我們將在任務6中討論這個問題的解決方案。
答題
1.在 dhparam.pem
檔案中可以找到一組Diffie-Hellman引數。質數的位數是多少?
WP
1、2.使用以下命令即可檢視dhparam.pem檔案內容:
openssl dhparam -in dhparams.pem -text -noout
雜湊
加密雜湊函式是一種演算法,它將任意大小的資料作為輸入,並返回固定大小的值(稱為訊息摘要或校驗和)作為輸出。
例如, sha256sum
計算SHA256(安全雜湊演算法256)訊息摘要。SHA256,顧名思義,返回大小為256位(32位元組)的校驗和。該校驗和通常使用十六進位制數字書寫。知道一個十六進位制數字代表4位,256位校驗和可以表示為64位十六進位制數字。
在下面的終端輸出中,我們計算了三個大小不同的檔案的SHA256雜湊值:4位元組、275 MB和5.2 GB。使用 sha256sum
計算三個檔案中每個檔案的訊息摘要,我們得到三個完全不同的值,它們看起來是隨機的。值得強調的是,無論檔案大小,結果訊息摘要或校驗和的長度都是相同的。特別是,4位元組檔案 abc.txt
和5.2 GB檔案產生的訊息摘要長度相等,與檔案大小無關。
user@TryHackMe$ ls -lh
total 5.5G
-rw-r--r--. 1 strategos strategos 4 7月 21 12:46 abc.txt
-rw-r--r--. 1 strategos strategos 275M 2月 12 19:08 debian-hurd.img.tar.xz
-rw-r--r--. 1 strategos strategos 5.2G 4月 26 16:55 Win11_English_x64v1.iso
$ sha256sum *
c38bb113c89d8fec6475a9936411007c45563ecb7ce8acd5db7fb58c0872bda0 abc.txt
0317ff0150e0d64b70284b28c97bb788310585ea7ac46cc8139d5a3c850dea55 debian-hurd.img.tar.xz
4bc6c7e7c61af4b5d1b086c5d279947357cff45c2f82021bb58628c2503eb64e Win11_English_x64v1.iso
但是我們為什麼需要這樣一個函式呢?有很多用途,特別是:
- 儲存密碼:不是以明文形式儲存密碼,而是儲存密碼的雜湊。因此,如果發生資料洩露,攻擊者將獲得密碼雜湊列表,而不是原始密碼。(在實踐中,密碼也被“加鹽”,稍後的任務將對此進行討論。)
- 檢測修改:對原始檔案的任何微小修改都會導致雜湊值的劇烈變化,即校驗和。
在下面的終端輸出中,我們有兩個檔案, text1.txt
和 text2.txt
,它們幾乎是相同的,除了(字面上)一個位元不同;字母 T
和 t
在其ASCII表示中只差一位。儘管我們只翻轉了一個位,但很明顯,SHA256的校驗和是完全不同的。因此,如果我們使用安全雜湊函式演算法,我們可以很容易地確認是否發生了任何修改。這可以幫助防止故意篡改和檔案傳輸錯誤。
user@TryHackMe$ hexdump text1.txt -C
00000000 54 72 79 48 61 63 6b 4d 65 0a |TryHackMe.|
0000000a
$ hexdump text2.txt -C
00000000 74 72 79 48 61 63 6b 4d 65 0a |tryHackMe.|
0000000a
$ sha256sum text1.txt
f4616fd825a10ded9af58fbaee09f3e31751d15591f9323ea68b03a0e8ac3783 text1.txt
$ sha256sum text2.txt
9ffa3533ee33998aeb1df76026f8031c8af6ccabd8393eca002d5b7471a0b536 text2.txt
一些正在使用的雜湊演算法仍然被認為是安全的:
- Sha224, sha256, sha384, sha512
- 成熟的MD160
一些較舊的雜湊函式,如MD5 (Message Digest 5)和SHA-1,在加密上是已被破解的。透過破解,我們的意思是有可能生成與給定檔案具有相同校驗和的不同檔案。這意味著我們可以建立一個雜湊衝突。換句話說,攻擊者可以使用給定的校驗和建立新訊息,並且不可能檢測到檔案或訊息篡改。
HMAC
基於三列的資訊驗證碼(HMAC)是一種資訊驗證碼(MAC),它除了使用雜湊函式外還使用加密金鑰。
根據RFC2104, HMAC需要:
- 金鑰
- Inner pad(ipad)一個常量字串。(RFC2104使用位元組
0x36
重複B次。B的值取決於所選擇的雜湊函式。) - Outer pad(opad)是一個常量字串。(RFC2104使用位元組
0x5C
重複B次。)
計算HMAC的步驟如下圖所示:
1.對key追加0,使其長度為B,即使其長度與ipad的長度相同。
2.使用以⊕表示的位異或(XOR),用⊕表示,計算key⊕ipad。
3.將訊息新增到步驟2的XOR輸出。
4.將雜湊函式應用於生成的位元組流(在步驟3中)。
5.使用異或,計算key⊕opad。
6.將第4步的雜湊函式輸出附加到第5步的異或輸出。
7.將雜湊函式應用於生成的位元組流(在步驟6中)以獲得HMAC。
上圖所示的步驟用以下公式表示:H(K⊕opad,H(K⊕ipad,text))
要在Linux系統上計算HMAC,您可以使用任何可用的工具,例如 hmac256
(或 sha224hmac
、 sha256hmac
、 sha384hmac
和 sha512hmac
,其中金鑰新增在選項 --key
之後)。下面我們展示了一個使用 hmac256
和 sha256hmac
兩個不同的key計算HMAC的例子。
user@TryHackMe$ hmac256 s!Kr37 message.txt
3ec65b7e80c5bf2e623e52e0528f1c6a74f605b10616621ba1c22a89fb244e65 message.txt
user@TryHackMe$ hmac256 1234 message.txt
4b6a2783631180fca6128592e3d17fb5bff6b0e563ad8f1c6afc1050869e440f message.txt
user@TryHackMe$ sha256hmac message.txt --key s!Kr37
3ec65b7e80c5bf2e623e52e0528f1c6a74f605b10616621ba1c22a89fb244e65 message.txt
user@TryHackMe$ sha256hmac message.txt --key 1234
4b6a2783631180fca6128592e3d17fb5bff6b0e563ad8f1c6afc1050869e440f message.txt
問題
1.order.json
檔案的SHA256校驗和是多少?
2.開啟 order.json
檔案,將 1000
改為 9000
。新的SHA256校驗和是什麼?
3.使用SHA256和金鑰 3RfDFz82
, order.txt
的HMAC是什麼?
WP
1.使用以下命令檢視order.json檔案的SHA256校驗和:
sha256sum order.json
2.使用vim更改後檢視即可
3.使用以下命令計算金鑰為3RfDFz82時order.txt檔案的HMAC值:
sha256hmac order.txt --key 3RfDFz82
沒找到相關命令,那就換一個:
hmac256 3RfDFz82 order.txt
PKI和SSL/TLS
使用金鑰交換,如Diffie-Hellman金鑰交換,可以在竊聽者的眼皮底下協商出一個金鑰。此金鑰可與對稱加密演算法一起使用,以確保機密通訊。然而,我們前面描述的金鑰交換不能免疫中間人(man -the- middle, MITM)攻擊。原因是,在交換金鑰時,Alice無法確保自己在與Bob通訊,而Bob也無法確保自己在與Alice通訊。
考慮下面的圖。這是Diffie-Hellman金鑰交換任務中解釋的一種針對金鑰交換的攻擊。具體步驟如下:
- Alice和Bob對q和g達成了一致。任何監聽通訊通道的人都可以讀取這兩個值,包括攻擊者Mallory。
- 像往常一樣,Alice選擇一個隨機變數a,計算出A (A = (g^a ) mod q)並將A傳送給Bob。Mallory一直在等待這一步,她選擇了一個隨機變數m,並計算了相應的M。Mallory一收到A,就把M傳送給Bob,假裝她是Alice。
- Bob收到M,認為是Alice傳送的。Bob已經選擇了一個隨機變數b,並計算了相應的B;他把B發給Alice。類似地,Mallory截獲訊息,讀取B並將M傳送給Alice。
- Alice接收M,計算key = M^a mod q。
- Bob接收M,計算key = M^b mod q。
Alice和Bob認為自己在直接通訊,並繼續通訊,而沒有意識到他們正在與Mallory通訊,後者可以在將訊息傳送給目標接收方之前閱讀和修改訊息。
這種敏感性需要某種機制,使我們能夠確認對方的身份。這就引出了公鑰基礎設施(PKI)。
考慮一下透過HTTPS訪問網站example.org的情況。您如何確信您確實在與 example.org
伺服器通訊?換句話說,你怎麼能確定沒有中間人在資料包到達你面前攔截並修改它們呢?答案在於網站證書。
下圖顯示了我們瀏覽example.org時得到的頁面。大多數瀏覽器都用某種鎖圖示來表示加密連線。這個鎖圖示表示連線是透過HTTPS進行保護的,使用的是有效的證書。
寫作證書時,example.org使用的證書由DigiCert Inc.簽名,如下圖所示。換句話說,DigiCert確認這個證書是有效的(直到某個日期)。
要讓證書頒發機構對證書進行簽名,我們需要:
1.生成證書籤名請求(Generate Certificate Signing Request, CSR):你建立一個證書,並將你的公鑰傳送給第三方簽名。
2.將你的CSR傳送給證書頒發機構(CA):目的是讓CA簽名你的證書。另一個通常不安全的解決方案是自簽名證書。
為此,接收方應該識別並信任簽發證書的CA。正如我們所料,我們的瀏覽器信任DigiCert公司作為簽名機構;否則,它將發出安全警告,而不是繼續訪問被請求的網站。
您可以使用 openssl
命令生成證書籤名請求。我們使用了以下選項:
req -new
建立新的證書籤名請求-nodes
儲存不帶密碼的私鑰-newkey
生成新的私鑰rsa:4096
生成長度為4096位的RSA金鑰-keyout
指定儲存金鑰的位置-out
儲存證書籤名請求
然後你將被要求回答一系列問題,如下面的控制檯輸出所示。
user@TryHackMe$ openssl req -new -nodes -newkey rsa:4096 -keyout key.pem -out cert.csr
[...]
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:UK
State or Province Name (full name) []:London
Locality Name (eg, city) [Default City]:London
[...]
一旦CSR檔案準備好了,你就可以把它傳送給你選擇的CA,對它進行簽名,以便在你的伺服器上使用。
一旦客戶端(即瀏覽器)收到它信任的簽名證書,SSL/TLS握手就開始了。目的是就密碼和金鑰達成一致。
我們剛剛描述了PKI(公鑰基礎設施)如何應用於web和SSL/TLS證書。可信第三方是系統可擴充套件的必要條件。
為了測試,我們建立了一個自簽名證書。例如,下面的命令將生成自簽名證書。
openssl req -x509 -newkey -nodes rsa:4096 -keyout key.pem -out cert.pem -sha256 -days 365
-x509
表示我們想生成的是自簽名證書,而不是證書請求。 -sha256
指定SHA-256摘要的使用。因為我們增加了 -days 365
,所以有效期為一年。
您需要檢查 task06
目錄下的證書檔案 cert.pem
。你可以使用以下命令檢視證書:
openssl x509 -in cert.pem -text
問題
1.公鑰的位數是多少?
2.這張證書有效期到哪一年?
WP
1、2.使用以下命令檢視證書:
openssl x509 -in cert.pem -text
使用密碼進行身份驗證
讓我們看看密碼學是如何幫助提高密碼安全性的。透過PKI和SSL/TLS,我們可以與任何伺服器通訊,並提供我們的登入憑據,同時確保在網路上傳輸密碼時沒有人可以讀取我們的密碼。這是一個保護傳輸資料的例子。讓我們來探索如何保護儲存在資料庫中的密碼,即靜止的資料。
最不安全的方法是將使用者名稱和密碼儲存在資料庫中。這樣,任何資料洩露都會暴露使用者的密碼。除了讀取包含密碼的資料庫外,不需要做任何工作。
使用者名稱 | 密碼 |
---|---|
alice |
qwerty |
bob |
dragon |
charlie |
princess |
改進的方法是將使用者名稱和密碼的雜湊值儲存在資料庫中。透過這種方式,資料洩露將暴露密碼的雜湊版本。由於雜湊函式是不可逆的,攻擊者需要不斷嘗試不同的密碼,才能找到能得到相同雜湊值的密碼。下表顯示了密碼的MD5值。(我們選擇MD5只是為了讓密碼欄位較小;否則,我們會使用SHA256或其他更安全的方法。)
使用者名稱 | 雜湊(密碼) |
---|---|
alice |
d8578edf8458ce06fbc5bb76a58c5ca4 |
bob |
8621ffdbc5698829397d97767ac13db3 |
charlie |
8afa847f50a716e64932d995c8e7435a |
前面的方法看起來是安全的;然而,彩虹表的可用性使得這種方法不安全。rainbow表包含密碼及其雜湊值的列表。因此,攻擊者只需要查詢雜湊值就可以恢復密碼。例如,透過查詢 d8578edf8458ce06fbc5bb76a58c5ca4
,可以很容易地發現 alice
的原始密碼。因此,我們需要找到更安全的方法來安全地儲存密碼;我們可以加鹽。salt是一個隨機值,我們可以在對密碼進行雜湊運算之前將其新增到密碼後面。下面給出了一個例子。
使用者名稱 | 密碼雜湊(鹽) | 鹽 |
---|---|---|
alice |
8a43db01d06107fcad32f0bcfa651f2f |
12742 |
bob |
aab2b680e6a1cb43c79180b3d1a38beb |
22861 |
charlie |
3a40d108a068cdc8e7951b82d312129b |
16056 |
上表使用 hash(password + salt)
;另一種方法是使用 hash(hash(password) + salt)
。注意,我們在使用MD5雜湊函式時使用了相對較小的salt值。如果這是一個實際的設定,我們應該切換到一個(更)安全的雜湊函式和一個大的鹽值,以獲得更好的安全性。
在儲存密碼之前,我們可以做的另一個改進是使用金鑰推導函式,如PBKDF2 (password - based key推導function 2)。PBKDF2獲取密碼和鹽,並透過一定的迭代次數(通常為數十萬次)提交它。
如果您想了解與密碼儲存相關的其他技術,我們建議您檢查密碼儲存備忘單。
問題
您在審計一個系統時,發現admin密碼的MD5雜湊值是 3fc0a7acf087f549ac2b266baf94b8b1
。原始密碼是什麼?
WP
隨便找一個MD5解密網站解密即可:
密碼學和資料-示例
在此任務中,我們想探索透過HTTPS登入網站時會發生什麼。
- 客戶端請求伺服器的 SSL/TLS 證書
- 伺服器向客戶端傳送 SSL/TLS 證書
- 客戶端確認證書有效
加密的作用從檢查證書開始。要使證書被視為有效,則意味著它已簽名。簽名意味著證書的雜湊值使用受信任的第三方的私鑰進行加密;加密的雜湊將追加到證書中。
如果第三方是可信的,客戶端將使用第三方的公鑰來解密加密的雜湊,並將其與證書的雜湊進行比較。但是,如果無法識別第三方,則連線將不會自動進行。
客戶端確認證書有效後,將啟動 SSL/TLS 握手。這種握手允許客戶端和伺服器就金鑰和對稱加密演算法等達成一致。從現在開始,所有相關的會話通訊都將使用對稱加密進行加密。
最後一步是提供登入憑據。客戶端使用加密的 SSL/TLS 會話將它們傳送到伺服器。伺服器收到使用者名稱和密碼,需要確認它們是否匹配。
根據安全準則,我們希望伺服器在向其附加隨機鹽後儲存密碼的雜湊版本。這樣,如果資料庫被破壞,密碼將難以恢復。
結論
密碼學是一個龐大的話題。在這個房間裡,我們試圖把重點放在核心概念上,這些概念可以幫助你理解密碼學中常用的術語。這些知識對於理解使用加密和雜湊的系統的配置選項至關重要。