加密解密及算法詳解
??今天我要給大家分享的是互聯網通信中用到的各種加密解密算法,在我們介紹加解密知識前,首先我們了解一下密碼學、密碼、加密、數字簽名、密鑰交換等相關術語的含義。
1.1 密碼學
??密碼學是研究編制密碼和破譯密碼的技術科學。研究密碼變化的客觀規律,應用於編制密碼以保守通信秘密的,稱為編碼學;應用於破譯密碼以獲取通信情報的,稱為破譯學,總稱密碼學。
1.2 密碼
??密碼是通信雙方按約定的法則進行信息特殊變換的一種重要保密手段。依照這些法則,變明文為密文,稱為加密變換;變密文為明文,稱為脫密變換。密碼在早期僅對文字或數碼進行加、脫密變換,隨著通信技術的發展,對語音、圖像、數據等都可實施加、脫密變換。
加密:加密是一種以密碼方式發送信息的方法。只有擁有正確密鑰的人才能解開這個信息的密碼。對於其他人來說,這個信息看起來就像是一系列隨機的字母、數字和符號。如果你要發送不應該讓其他人看的敏感信息時,加密是特別重要的。
數字簽名:數字簽名是一種類似寫在紙上的普通的物理簽名,但是使用了公鑰加密領域的技術實現,用於鑒別數字信息的方法。一套數字簽名通常定義兩種互補的運算,一個用於簽名,另一個用於驗證。
密鑰交換:雙方使用密鑰交換算法確定對稱密鑰,然後用這個密鑰進行加密和解密。這個密鑰交換協議/算法只能用於密鑰的交換, 而不能進行消息的加密和解密。
2、加密算法
2.1 加密算法的特點
對稱加密:加密和解密使用同一個密碼
1)每個密碼都成對兒出現,一個為私鑰(secret key),一個為公鑰(public key)
2)公鑰加密算法很少用來加密數據,速度太慢 比對稱加密算法加密數據的速度慢上3個數量級,1000倍左右
單向加密即散列加密:提取數據特征碼,常用於數據完整性校驗
1)雪崩效應,輸入的微小改變,將會引起結果的巨大改變。不可逆,無法根據特征碼還原原來的數據
2) 定長輸出,無論原始數據是多大,結果大小都是相同的。輸入一樣,輸出必然相同
2.2 加密解密技術常用的功能及算法:
對稱加密:
- 算法:DES, 3DES, AES, Blowfish, Twofish, RC6, CAST5
- 工具:gpg, openssl enc
- 加密算法 + 口令
- 密鑰交換
- 用戶身份認證
- 數據完整性
非對稱加密:
- 算法:RSA, EIGamal, DSA
- 工具:openssl
- 密鑰交換
- 身份認證
單向加密:
- 算法:MD5, SHA1, SHA512, CRC-32
- 工具:sha1sum, md5sum, cksum, openssl dgst
- 完整性
MAC:消息摘要碼,單向加密的延伸應用
- 應用:用於實現在網絡通信中保證所傳輸的數據完整性
- 機制:
- CBC-MAC
- HMAC:使用md5和sha1算法
密鑰交換(IKE: Internet Key Exchange):
- 算法: DH,公鑰加密 [並沒有在互聯網傳輸,比較安全]
- Diffie-Hellman
公鑰加密:公鑰加密、私鑰解密,反之亦然 - 公鑰:pkey
- 私鑰:skey
- 算法:RSA, EIGamal
- 工具:gpg, openssl rsautl
數字簽名:電子簽名私鑰用來加密,公鑰用來解密
- 算法: RSA, EIGamal, DSA [DSA只能用來簽名,無法用來加密]
數字證書:
* 證書格式:x509、pkcs【x509、pkcs12】
* x509格式:
* 公鑰和有效期限;
* 證書的合法擁有者;(主機名)
* 證書的使用方式;
* CA的信息;
* CA的數字簽名;(CA簽名的校驗碼)
* 誰給CA發證:自簽署證書
3、PKI
PKI: Public Key Infrastructure 公鑰基礎設施
CA: Certificate Authority CA證書權威機構
自建CA並完成對服務器發證:
3.1 自建CA(CA端)
生成一對兒密鑰
生成自簽證書
命令:
#(umask 077; openssl genrsa -out private/cakey.pem 2048) 【生成CA私鑰】
#openssl req -new -x509 -key private/cakey.pem -out cacert.pem 【生成自簽證書】(.pem)
3.2 證書申請(客戶端)
生成一對兒密鑰
生成證書申請(.csr)
將申請發送給CA
命令:
#(umask 077; openssl genrsa -out httpd.key 2048) 生成密鑰
#openssl req -new -key httpd.key -out httpd.csr 生成證書申請 證書簽署請求(.csr)
3.3 發證(CA端)
簽署證書
傳送給客戶端
命令:
#openssl ca -in httpd.csr -out httpd.crt -days 365 簽署證書(.crt)
3.4 PKI的實現
PKI: TLS/SSL: x509
第一種實現:互聯網著名的安全機制TLS/SSL使用的是x509證書
PKI: OpenGPG
第二種實現:這是PKI的另外一種實現,它們實現證書的管理的機制不同,CA的信認關系傳遞機制略有不同。在Linux 上OpenGPG也是一種證書管理機制,或者PKI的實現架構。
SSL: Secure Socket Layer是由Netscape公司開發的一套Internet數據安全協議,當前版本為3.0。
- NetScape 網景
- Secure Socket Layer
- SSLv2, SSLv3
TLS: Transport Layer Security 是國際標準化組織開發的一個通用性協議,當前版本為1.2。
- TLSv1
- http --> https
- ldap --> ldaps
- ftp --> ftps
- smtp --> smtps
- pop3 --> pop3s
- imap --> imaps
OpenSSL是SSL的開源實現 - libcrpto: 通用加密庫
- libssl: TLS/SSL的實現
- 基於會話的、實現了身份認證、數據機密性和會話完整性的TLS/SSL庫
- openssl: 多用途命令行工具,可以實現單向加密、對稱加密、非對稱加密、實現私有證書頒發機構
3.5 SSL通信原理:
SSL的握手過程為:
- (1) SSL客戶端通過Client Hello消息將它支持的SSL版本、加密算法、密鑰交換算法、MAC算法等信息發送給SSL服務器。
- (2) SSL服務器確定本次通信采用的SSL版本和加密套件,並通過Server Hello消息通知給SSL客戶端。如果SSL服務器允許SSL客戶端在以後的通信中重用本次會話,則SSL服務器會為本次會話分配會話ID,並通過Server Hello消息發送給SSL客戶端。
- (3) SSL服務器將攜帶自己公鑰信息的數字證書通過Certificate消息發送給SSL客戶端。
- (4) SSL服務器發送Server Hello Done消息,通知SSL客戶端版本和加密套件協商結束,開始進行密鑰交換。
- (5) SSL客戶端驗證SSL服務器的證書合法後,利用證書中的公鑰加密SSL客戶端隨機生成的premaster secret,並通過Client Key Exchange消息發送給SSL服務器。
- (6) SSL客戶端發送Change Cipher Spec消息,通知SSL服務器後續報文將采用協商好的密鑰和加密套件進行加密和MAC計算。
- (7) SSL客戶端計算已交互的握手消息(除Change Cipher Spec消息外所有已交互的消息)的Hash值,利用協商好的密鑰和加密套件處理Hash值(計算並添加MAC值、加密等),並通過Finished消息發送給SSL服務器。SSL服務器利用同樣的方法計算已交互的握手消息的Hash值,並與Finished消息的解密結果比較,如果二者相同,且MAC值驗證成功,則證明密鑰和加密套件協商成功。
- (8) 同樣地,SSL服務器發送Change Cipher Spec消息,通知SSL客戶端後續報文將采用協商好的密鑰和加密套件進行加密和MAC計算。
- (9) SSL服務器計算已交互的握手消息的Hash值,利用協商好的密鑰和加密套件處理Hash值(計算並添加MAC值、加密等),並通過Finished消息發送給SSL客戶端。SSL客戶端利用同樣的方法計算已交互的握手消息的Hash值,並與Finished消息的解密結果比較,如果二者相同,且MAC值驗證成功,則證明密鑰和加密套件協商成功。
3.6 互聯網應用安全通信必須要滿足以下特性
1、私密性
2、身份認證
3、完整性
openssl補充材料:
- openssl中有如下後綴名的文件
- .key格式:私有的密鑰
- .crt格式:證書文件,certificate的縮寫
- .csr格式:證書簽名請求(證書請求文件),含有公鑰信息,certificate signing request的縮寫
- .crl格式:證書吊銷列表,Certificate Revocation List的縮寫
-
.pem格式:用於導出,導入證書時候的證書的格式,有證書開頭,結尾的格式
- 常用證書協議
- x509v3: IETF的證書標準
- x.500:目錄的標準
- SCEP: 簡單證書申請協議,用http來進行申請,數據有PKCS#7封裝,數據其實格式也是PKCS#10的
- PKCS#7: 是封裝數據的標準,可以放置證書和一些請求信息
- PKCS#10: 用於離線證書申請的證書申請的數據格式,註意數據包是使用PKCS#7封裝這個數據
- PKCS#12: 用於一個單一文件中交換公共和私有對象,就是公鑰,私鑰和證書,這些信息進行打包,加密放在存儲目錄中,
- CISCO放在NVRAM中,用戶可以導出,以防證書服務器掛掉可以進行相應恢復。思科是.p12,微軟是.pfx
4、總結
算法分類總結
一、單向散列算法: 屬於摘要算法,不是一種加密算法,作用是把任意長的輸入消息串變化成固定長的輸出串的一種函數
- BASE64(嚴格地說,屬於編碼格式,而非加密算法)
- MD5(Message Digest algorithm 5,信息摘要算法)
- SHA(Secure Hash Algorithm,安全散列算法)
- HMAC(Hash Message Authentication Code,散列消息鑒別碼)
- CRC(Cyclical Redundancy Check,循環冗余碼校驗)
-
二、對稱加密算法: 加密密鑰與解密密鑰相同
- DES(Data Encryption Standard,數據加密標準算法)
- AES(Advanced Encryption Standard,高級加密標準)
- PBE(Password-based encryption,基於密碼驗證)
- RC5(參數可變的分組密碼算法 )
- BLOWFISH(對稱密鑰分組加密算法)
-
三、非對稱加密算法 :加密密鑰與解密密鑰不相同
- RSA(算法的名字以發明者的名字命名:Ron Rivest, AdiShamir 和Leonard Adleman)
- DH(Diffie-Hellman算法,密鑰一致協議)
- Elgamal(既能用於數據加密也能用於數字簽名)
- DSA(Digital Signature Algorithm,數字簽名)
- ECC(Elliptic Curves Cryptography,橢圓曲線算法)
- Merkle-Hellman(背包算法)
- Miller Rabin算法(素數測試算法)
??學習完加密及各種算法後日常最多用到的場景就是加密、驗簽、密鑰交換。非對稱加密算法比對稱加密算法的速度慢3個數量級,當我們需要加密大量的數據時,建議采用對稱加密算法,提高加解密速度。非對稱加密算法通常做簽名。對稱加密算法的鑰管理是一個復雜的過程,密鑰的管理直接決定著他的安全性,因此當數據量很小時,我們可以考慮采用非對稱加密算法。
??在業務使用中,我們通常采用的方式是:非對稱加密算法管理對稱算法的密鑰,然後用對稱加密算法加密數據,這樣就集成了兩種加密算法的優點,既有了加密速度快的優點,又有了安全方便管理密鑰的優點。RSA建議采用1024位的數字,ECC建議采用160位,AES采用128為即可。
加密解密及算法詳解