一、密碼學
加密是一種存儲和傳輸數據的的方法。通過編碼爲不可讀的形式來保護信息的科學手段。也是保護敏感信息的有效方法。
密碼分析學是一種研究和破解加密過程、破壞身份驗證方案以及對算法和祕鑰進行逆向工程的學科,是密碼術和密碼學的重要組成部分。
1、密碼系統
(1)密碼系統
一個密碼系統包含用於加密和解密的所有必須組件(如可靠隱私PGP)。一個密碼系統至少包含軟件、協議、算法、祕鑰等組件。
(2)密碼系統的強度
加密算法的強度源自於算法的複雜程度,祕鑰的機密性,祕鑰的長度、初始化向量以及它們如何在密碼系統內協同工作。
(3)Kerckhoffs原則
一個密碼系統唯一需要保密的部分應當是祕鑰。
2、密碼系統提供的服務
(1)機密性:除了授權實體外、其他實體無法理解提交的數據
(2)完整性: 數據從創建到傳輸、存儲都不會被未授權更改
(3)身份驗證:對創建信息的用戶或系統的身份進行驗證
(4)授權: 證明身份之後,向個體提供允許訪問某些資源的祕鑰或密碼
(5)不可否認性:確保發送方無法否認發送過消息
3、密碼學的種類
(1)一次性密碼本
一次性密碼本是使用一組由隨機值組成的密碼本。需要加密的明文消息已轉換爲位,而一次性密碼本也有隨機爲組成,加密過程使用“異或”的二進制數學函數,簡寫爲XOR。
一次性密碼本使用要求:由真正的隨機值構成、只使用一次、安全分發至目的地、在接受方和發送方處都是安全的、至少與消息一樣長
(2)隱藏密碼與滾動密碼
滾動密碼:滾動祕鑰密碼使用周圍隨處可見的方法(如電視劇連城訣中將寶藏藏於詩詞)
隱藏密碼:消息內的消息,是一種隱寫術
(3)隱寫術
隱寫術是將一種數據隱藏在另一種介質中以藏匿數據的方法
隱寫術涉及的組件:
載體:內部具有隱藏信息的信號、數據流或文件
隱寫介質:將信息隱藏在內的介質
有效載荷:要隱藏和傳輸的數據
4、密碼的種類
(1)替代密碼
替代密碼是使用不同的位、字符或字符分組來替換原來的位、字符或字符分組。替代密碼使用祕鑰來規定應當如何實現替代。
(2)換位密碼
換位密碼是對原有的值進行置換,重新排列原來的位、字符或字符分組以隱藏其原有的意義。祕鑰決定了字符移動到的位置。
5、加密的方法
(1)對稱算法和非對稱算法
對稱加密使用同一祕鑰加密和解密。非對稱祕鑰使用兩個不同的祕鑰來達到加密和解密的目的。
對稱加密和非對稱加密的對比:
屬性 |
對稱系統 |
非對稱系統 |
祕鑰 |
兩個或多個實體共享同一個祕鑰 |
一個實體擁有公鑰,另一個實體擁有私鑰 |
祕鑰交換 |
通過安全機制進行帶外交換 |
公鑰每個人都能擁有,私鑰只屬於所有者 |
速度 |
算法不太複雜,運行速度快 |
算法複雜,運行速度慢 |
用途 |
批量加密,加密文件和通信路徑 |
祕鑰分發和數字簽名 |
作用 |
提供機密性 |
提供身份驗證和不可否認性 |
(2)分組密碼和流密碼(對稱算法的只要類型)
分組密碼:分組密碼用於加密解密時,消息會被劃分爲爲若干位分組,這些分組隨後會通過數學函數進行處理,每次一個分組。分組密碼在方法上使用了擴散和騷亂。擴散指單獨一個明文位會影響到若干密文位,類似雪崩效應。擾亂指使祕鑰和密文之間的關係儘可能複雜,從而令攻擊者無法從密文中發現祕鑰。
流密碼:流密碼將消息作爲位流對待,並且使數學函數分別作用在每一位上。流密碼使用了祕鑰流生成器,它生成的位流與明文位進行異或,從而產生密文。
(2)初始化向量(IV)
初始化向量用於算法,可確保加密過程中不會產生某種模式的隨機值,它們與祕鑰一同使用,而且在傳輸時不需要加密。
(3)混合加密
對稱祕鑰與非對稱祕鑰的混合使用:發送方使用對稱祕鑰加密消息,使用非對稱祕鑰加密對稱祕鑰;接受方解密並獲取對稱祕鑰,然後使用對稱祕鑰解密消息。
會話祕鑰:使用一次的對稱祕鑰,用於對通信會話期間兩個用戶之間的消息進行加密。
二、對稱加密系統
主要的對稱加密算法有DES、3DES、AES、IDEA、Blowfish、RC4、Rc5、Rc6
1、數據加密標準(DES)
DES是一種標準,DEA是一種執行DES的算法;DES已經被NIST開發的作爲高級加密標準(AES)的Rijndael算法所取代。
(1)DES的工作方式
DES是一種對稱分組加密算法,DES使用64位祕鑰,其中56位爲實際使用的祕鑰,另外8位用於奇偶校驗。DES算法將消息分成若干組,並且一次加密一個分組,這些分組經歷16輪換位和替代函數運算。最後得到的結果是64位分組。
(2)DES的工作模式
電子密碼本(ECB):ECB模式像一個密碼本,將一個64位的數據分組輸入帶祕鑰的算法,就會生成一個密文分組。ECB使用更便捷,但風險是數據分組都是用相同的祕鑰進行加密,因此密碼本也完全一樣。
密碼分組鏈接(CBC):一組明文和祕鑰總是生成相同的密文。CBC並不暴露加密模式,算法會處理每個文本分組,祕鑰以及基於前一個分組的值,並將他們應用於下一個文本分組,這樣得到的密文更隨機。
密文反饋(CFB模式):CFB的工作方式使用了分組密碼和流密碼
輸出反饋(OFB)
計數器(CTR)模式
2、三重DES(3DES)
3DES使用了48輪運算,使它對於差分密碼分析有很強的抵禦能力,但是3DES要執行額外的操作,所以嚴重影響其性能,3DES完成加密解密的時間要比DES長3倍。
3、高級加密標準(AES)
NIST選擇了Rijndael作爲高級加密標準的算法,AES是一種對稱分組密碼,支持128、192、256位的祕鑰。如果祕鑰和數據分組大小爲128位是執行10輪運算,如果爲192位時,執行12輪運算,如果爲256位時執行14輪運算。
4、國際數據加密算法(IDEA)
IDEA是一種分組密碼,它處理64位數據分組。64位大小的數據分組劃分爲16個更小的分組,每個分組都執行8輪數學函數運算,IDEA使用的祕鑰長度爲128位。
IDEA使用了與DES類似的模式,但祕鑰更長。
IDEA申請了專利,需要付費才能使用。
5、Blowfish
Blowfish也屬於分組密碼,它處理64位的數據分組,祕鑰長度爲32-448位,數據分組要經過16輪加密函數運算以得到密文。
6、RC4
RC4是最常用的流密碼之一、它的祕鑰長度可變,用於SSL協議。
RC4算法簡單、快捷、有效。但它的擴散率低,容易遭受到攻擊
7、RC5
RC5是一種分組密碼,參數可變,該算法的分組通常大小爲32、64或128位,其祕鑰長度可達128位,用於加密解密的輪數也是可變的,最多可達255輪。
8、RC6
RC5基礎上構建的,所有屬性與RC5相同。
三、非對稱加密系統
1、Diffie-Hellman算法
Diffie-Hellman是第一個非對稱祕鑰協定算法,Diffie-Hellman算法使兩個系統不需要提前建立關係或預先安排就能安全地交換祕鑰,這種算法可實現祕鑰發送,但並不提供加密或數字簽名功能。
2、RSA
RSA是全球標準,能夠用於數字簽名,祕鑰交換和加密,它於1978年在麻省理工學院開發,並提供身份認證和祕鑰加密。RSA算法的安全性來自於分解大因數爲質數的困難性。
3、EI Gamal
EI Gamal是一種用於數字簽名、加密和祕鑰交換的公鑰算法,它是以在一個有限域內計算離散對數的困難性爲基礎。它實際上是Diffie-Hellman算法的擴展,主要缺點是性能。
4、橢圓曲線密碼系統(ECC)
ECC提供的功能與RSA相似,有數字簽名、安全祕鑰分發和加密。ECC的效率比其他對稱加密算法的效率更高。
5、揹包算法
第一版Merkle-Hellman算法只能用於加密,後來經過改進,可提供數字簽名功能。由於不安全,目前已經不再使用。
6、零知識證明
只告訴需要知道的知識,不會提供更重要的信息。
四、消息的完整性
1、單項散列
單向散列是一種函數,它將可變長的字符串或消息壓縮變換成固定長度的值,散列函數並不保密,它是公開的,單項散列函數的祕密是它的“單向性”。單向散列函數本身不使用任何祕鑰。爲了對消息摘要提供更多的保護,需要使用消息身份驗證代碼(MAC),MAC函數是通過某種形式對消息應用祕密祕鑰而派生的一種身份驗證機制,但並不表示它使用對稱祕鑰來加密消息。MAC有三種基本類型,和單向散列對比如下:
函數 |
步驟 |
提供的安全服務 |
散列 |
|
完整性,不提供機密性或身份驗證,只能檢測無意更改 |
HMAC |
|
完整性和數據源身份驗證,不提供機密性 |
CBC-MAC |
|
數據源身份驗證和完整性,不提供機密性 |
CMAC |
CMAC的工作方式CBC-MAC相同,但是基於更復雜的邏輯和數學函數 |
|
2、散列算法
(1)MD4
Ron Rivest設計的單向函數,生成128位的消息摘要值
(2)MD5
MD4的審計版本,仍生成128位消息摘要,但它的算法比較複雜,所以更難攻破,目前不已經不再是很安全
(3)SHA
SHA由NSA設計,NIST發佈,並和數字簽名標準(DSS)一起使用。SHA生成160位的散列值或消息摘要,生成的結果隨後輸入非對稱算法。SHA後更名爲SHA-1,SHA-1容易遭受碰撞攻擊,該算法的新版本(SHA-2,SHA-3)已經開發和發佈即SHA-256,SHA-512。SHA-2和SHA-3可安全使用。
3、數字簽名
數字簽名是使用發送方的私鑰加密的散列值。簽名的動作以爲着使用私鑰來加密消息的散列值。
五、公鑰基礎設施
公鑰基礎設施(PKI)是一種使用公鑰密碼學和X.509標準的ISO身份驗證框架,建立這個框架的目的是允許在不同的網絡和互聯網之間進行身份驗證。PKI由程序、數據格式、措施、通信協議、安全策略及公鑰密碼機制組成,這些組件以綜合的方式運行,使得分散的人們能以安全的、預定的方式相互通信。
PKI基礎設施包含了標識用戶身份,創建和分發證書,維護和取消證書,分發和維護加密等部分,並使得所有技術都能夠溝通,而且能夠共同運行以達到加密通信和驗證身份的目的。
PKI由許多不同的部分組成,包括認證授權,註冊授權,證書,祕鑰以及用戶。
1、認證授權機構(CA)
CA是保管和發佈數字證書的可信組織機構。CA負責創建和簽發數字證書,當CA簽發證書時,它將個人的身份和公鑰綁定在一起,還負責該個體的真實性。CA還在必要時負責取消證書,被取消的證書的信息存儲在證書吊銷列表(CRL)中。
CA的認證過程:當一個人請求證書時,註冊授權機構RA會驗證這個人的身份,並將證書請求提交給CA,隨後,CA創建證書並簽名,再將其發送給請求者,同時爲請求者在證書的有效期內保管該證書。當一個人想要與這個人通信時,CA通常要擔保該人的身份。
交叉認證:不同的CA之間建立信任關係,以以來彼此的數字證書和公鑰,就像證書和祕鑰是它們自己簽發的一樣。
在線證書狀態協議(OCSP):OSCP會實時確認證書是否被取消,並向用戶報告證書是否有效、無效、還是未知。
2、證書
證書是用於將公鑰和唯一標識其所有者所需的組成部分關聯起來的機制,CA創建數字證書的標準是x.509,它規定證書中使用的不同字段以及能夠在這些字段中輸入的有效值。目前使用的是X.509 v3。
3、註冊授權機構(RA)
RA建立和確認個人的身份,代表終端用戶啓動使用CA的認證過程,以及執行證書生命週期管理功能。
4、證書的生成
(1)終端用戶註冊自己,即獲取數字證書的過程
1)用戶想RA發送一個請求
2)RA向用戶索要特定的身份標識信息
3)RA接收並驗證其身份標識信息,通過了就將用戶的認證請求發送給CA
4)CA創建一個證書,該證書嵌入了用戶的公鑰及身份信息。
(2)終端用戶與其他用戶保密通信的過程
1)用戶從一個公共目錄請求得到對方的公鑰
2)這個目錄(存儲庫)將對方的公鑰發送給用戶。
3)用戶驗證數字證書並提供對方的公鑰,並使用該公鑰加密一個會話祕鑰,這個會話祕鑰用於加密它們之間傳遞的信息,然後將加密的會話祕鑰發送給對方,還要講自己的包含其公鑰的證書也發送給對方
4)對方接受到用戶的證書時,其瀏覽器會詢問CA是否對該證書進行了數字簽名,只有對方的瀏覽器信任這個CA,並且驗證了證書,雙方就可以進行加密通信了。
六、Openssl
OpenSSL是一個加密工具包,實現了安全套接字層(SSL v2/v3)和傳輸層安全(TLSV1)網絡協議及其所需的相關加密標準。而openssl程序是一個命令行工具,用於使用openssl的各種加密功能。
OpenSSL由三部分組成:分別是libencrypto庫、libssl庫、openssl多用途命令行工具
1、SSL(安全套接字層)/TLS(傳輸層安全)
爲網絡通信提供安全及數據完整性的一種安全協議。TLS與SSL在傳輸層與應用層之間對網絡連接進行加密。
SSL/TLS握手的過程:
(1)客戶端發起請求,將它所支持的算法列表、協議版本及一個用作產生密鑰的隨機數發送給服務器;
(2)服務器從算法列表中選擇一種加密算法,並將它和一份包含服務器公用密鑰的證書發送給客戶端;該證書還包含了用於認證目的的服務器標識,服務器同時還提供了一個用作產生密鑰的隨機數;
(3)客戶端對服務器的證書進行驗證,並抽取服務器的公用密鑰;然後,再產生一個稱作pre_master_secret的隨機密碼串,並使用服務器的公用密鑰對其進行加密,並將加密後的信息發送給服務器;
(4)客戶端與服務器端根據pre_master_secret以及客戶端與服務器的隨機數值獨立計算出加密和MAC密鑰
(5)客戶端將所有握手消息的MAC值發送給服務器;
(6)服務器將所有握手消息的MAC值發送給客戶端。
2、OpenSSL祕鑰工具的使用
(1)對稱加密的使用
工具:openssl enc, gpg
支持的算法:3des, aes, blowfish, towfish
# 使用3des算法加密
~]# openssl enc -e -des3 -a -salt -in /etc/passwd -out ./passwd.cipher
# 解密
~]# openssl enc -d -des3 -a -salt -out passwd -in passwd.cipher
(2)非對稱加密的使用
# 生成私鑰
~]# (umask 077; openssl genrsa -out /tmp/tmp_rsa 2048)
Generating RSA private key, 2048 bit long modulus
................................................................+++
.....................+++
e is 65537 (0x10001)
# 提取公鑰
~]# openssl rsa -in /tmp/tmp_rsa -pubout
writing RSA key
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5PZudMhzDk/W73zu7PcF
UXsBoShjZ5krrVsg3xjHgs14zYDXW0H3nihX2KV2mJlb/8KiKc6z1Cb9A7MWIqRs
l9vLNlo1w55KdtFstxEdH8vEl6QBzGE30bohQmt6jjTndum4QNXPBzZ5TAeBTG2s
Rkj50II4acIWeJYpvvvbV1RkBzddXLfYQd+GNC7+CkVfM7usVCmYtXHmGqUdPS9U
8TjEb1+RkJ2b4jN0F7rPsoNzk43DBjpV+248DEl8gl7InFhPiUEE2wqT8DgpzOFl
lh6HPVakFKqFujvBlWTwiYL+QntRevIw6B0je2O1q/9Wp1g7xbWFfEsXBxbY2Jc4
mQIDAQAB
-----END PUBLIC KEY-----
(3)使用openssl生成隨機數
~]# openssl rand -base64 10
X/lajp48Zl6CoQ==
~]# openssl rand -hex 10
ef58126dbf9a52db5904
3、使用openssl建立私有CA
Openssl與CA相關的配置文件爲/etc/pki/tls/openssl.cnf,主要的配置內容如下:
[ CA_default ]
dir = /etc/pki/CA # Where everything is kept
certs = $dir/certs # Where the issued certs are kept
crl_dir = $dir/crl # Where the issued crl are kept
database = $dir/index.txt # database index file.
#unique_subject = no # Set to 'no' to allow creation of
# several ctificates with same subject.
new_certs_dir = $dir/newcerts # default place for new certs.
certificate = $dir/cacert.pem # The CA certificate
serial = $dir/serial # The current serial number
crlnumber = $dir/crlnumber # the current crl number
crl = $dir/crl.pem # The current CRL
private_key = $dir/private/cakey.pem# The private key
RANDFILE = $dir/private/.rand # private random number file
x509_extensions = usr_cert # The extentions to add to the cert
name_opt = ca_default # Subject Name options
cert_opt = ca_default # Certificate field options
default_days = 365 # how long to certify for
default_crl_days= 30 # how long before next CRL
default_md = sha256 # use SHA-256 by default
preserve = no # keep passed DN ordering
policy = policy_match
試驗環境如下:
CA server:搭建私有CA IP:192.168.16.130
客戶機:向CA請求籤署證書 IP:192.168.16.155
(1)構建私有CA
在確定配置爲CA的服務上生成一個自簽證書,併爲CA提供所需要的目錄及文件即可
# 生成私鑰
~]# (umask 077; openssl genrsa -out /etc/pki/CA/private/cakey.pem 4096)
# 生成自簽證書,在簽署過程中需要輸入相關信息
~]# openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem -days 365
# 爲CA提供所需的目錄及文件
~]# mkdir -pv /etc/pki/CA/{certs,crl,newcerts}
~]# touch /etc/pki/CA/{serial,index.txt}
~]# echo 01 > /etc/pki/CA/serial
在簽署時的一些參數說明:
-new:生成新證書籤署請求;
-x509:生成自籤格式證書,專用於創建私有CA時;
-key:生成請求時用到的私有文件路徑;
-out:生成的請求文件路徑;如果自籤操作將直接生成簽署過的證書;
-days:證書的有效時長,單位是day;
(2)客戶機向CA請求籤署證書
# 在請求籤署證書的主機上生成私鑰
]# (umask 077; openssl genrsa -out /etc/pki/nginx/private/server.key 2048)
# 在請求籤署證書的主機上生成簽署請求,需要輸入相關信息
]# openssl req -new -key /etc/pki/nginx/private/server.key -out /etc/pki/nginx/private/server.csr -days 365
# 將請求通過可靠方式發送給CA
]# scp /etc/pki/nginx/private/server.csr [email protected]:/tmp/testCA
# CA主機簽署請求
~]# openssl ca -in /tmp/testCA/server.csr -out /etc/pki/CA/certs/server.crt -days 365
Using configuration from /etc/pki/tls/openssl.cnf
Check that the request matches the signature
Signature ok
Certificate Details:
Serial Number: 1 (0x1)
Validity
Not Before: Mar 22 16:53:19 2020 GMT
Not After : Mar 22 16:53:19 2021 GMT
Subject:
countryName = cn
stateOrProvinceName = Shanghai
organizationName = dayi123
organizationalUnitName = dayi123
commonName = www.dayi123.com
emailAddress = [email protected]
X509v3 extensions:
X509v3 Basic Constraints:
CA:FALSE
Netscape Comment:
OpenSSL Generated Certificate
X509v3 Subject Key Identifier:
8A:D2:3A:A9:AA:CB:9B:20:88:6C:B0:E1:47:DD:E8:EE:EC:97:4F:CB
X509v3 Authority Key Identifier:
keyid:33:C5:D7:C8:31:DF:34:95:8C:82:26:4A:CF:85:42:F1:A0:EA:8E:F6
# 將簽署完成的證書發送給請求主機
~]# scp /etc/pki/CA/certs/server.crt [email protected]:/etc/pki/nginx/private/
# 查看證書中的信息
]# openssl x509 -in /etc/pki/nginx/private/server.crt -noout -serial -subject
serial=01
subject= /C=cn/ST=Shanghai/O=dayi123/OU=dayi123/CN=www.dayi123.com/[email protected]
(3)吊銷證書
# 客戶端獲取要吊銷的證書的serial(在使用證書的主機執行):
]# openssl x509 -in /etc/pki/nginx/private/server.crt -noout -serial -subject
serial=01
subject= /C=cn/ST=Shanghai/O=dayi123/OU=dayi123/CN=www.dayi123.com/[email protected]
# 先根據客戶提交的serial和subject信息,對比其與本機數據庫index.txt中存儲的是否一致,一致時吊銷,在CA server上執行
~]# openssl ca -revoke /etc/pki/CA/newcerts/01.pem
Using configuration from /etc/pki/tls/openssl.cnf
Revoking Certificate 01.
Data Base Updated
#生成吊銷證書的吊銷編號(第一次吊銷證書時執行)
~]# echo 01 > /etc/pki/CA/crlnumber
# 更新證書吊銷列表
~]# openssl ca -gencrl -out server.crl
# 查看crl文件:
~]# openssl crl -in server.crl -noout -text
Certificate Revocation List (CRL):
Version 2 (0x1)
Signature Algorithm: sha256WithRSAEncryption
Issuer: /C=cn/ST=Shanghai/L=Shanghai/O=dayi123/OU=dayi123/CN=www.dayi123.com/[email protected]
Last Update: Mar 22 17:05:42 2020 GMT
Next Update: Apr 21 17:05:42 2020 GMT
CRL extensions:
X509v3 CRL Number:
1
Revoked Certificates:
Serial Number: 01
Revocation Date: Mar 22 17:03:26 2020 GMT
Signature Algorithm: sha256WithRSAEncryption
七、針對密碼學的攻擊
被動攻擊:攻擊者滅有影響協議、算法、祕鑰、消息或加密系統的任何部分。如偷聽和嗅探。
主動攻擊:攻擊者實施了破壞行爲,如篡改消息,更改系統文件和假冒他人
常見的攻擊向量:祕鑰、算法、實現、數據、人
1、唯密文攻擊
攻擊者擁有若干消息的密文,每條消息都是使用相同加密算法加密的,攻擊者的目標是找出加密過程中的祕鑰。
2、已知明文攻擊
攻擊者擁有一條或多條消息的明文和相對應的密文。攻擊者的目標是找出用於加密消息的祕鑰,從而解密和讀取其他消息。
3、選定明文攻擊
攻擊者擁有明文和密文,不過可選擇已加密的明文來查看相應的密文,這樣可以使得它們更深入理解加密過程的工作方式,從而能夠獲得正在使用的祕鑰的更多信息。
4、選定密文攻擊
攻擊者選擇將要解密的密文,並且可以獲得解密後的明文。
5、差分密碼分析
也以找出加密祕鑰爲目標,這種工具會查看對具有特定差異的明文及逆行加密而生成的密文對,並且分析這些差異的影響和結果。這也是一種選定明文攻擊。
6、線性密碼分析
通過執行函數來確定使用分組算法的加密過程中利用某個特定祕鑰的最大概率。
7、旁路攻擊
不用直接攻擊一臺設備,只需監視它如何運行就可以瞭解其工作機制。
8、重放攻擊
重放攻擊是攻擊者捕獲了某些類型的數據並重新提交它,從而寄希望於欺騙接收設備誤以爲這些是合法信息、時間標記和序列號是防禦重放攻擊的兩種對策。
9、代數攻擊
代數攻擊分析算法內使用的數學原理中存在的脆弱性,並利用了其內在的代數結構
10、分析式攻擊
分析式攻擊會確定算法結構上的弱點或缺陷
11、統計式攻擊
統計式攻擊確定算法設計中的統計弱點並對其加以利用
12、社會工程攻擊
攻擊者可以通過各種社會工程攻擊類型誘使人們提供加密祕鑰材料。