加密與解密
- 對稱密碼體制的保密性主要取決于密鑰的保密性酷麦,與算法的保密性無關(guān)
- 非對稱加密算法與對稱加密算法的區(qū)別:
(1)原献、用于消息解密的密鑰值與用于消息加密的密鑰值不同;
(2)、非對稱加密算法比對稱加密算法慢數(shù)千倍蚜迅,但在保護通信安全方面敢艰,非對稱加密算法卻具有對稱密碼難以企及的優(yōu)勢诬乞。
對稱加密算法
又叫傳統(tǒng)密碼算法,也叫私鑰加密盖矫。在對稱加密體制中丽惭,存在的最重要的問題之一就是密鑰的分發(fā)問題,也就是如何將密鑰傳送給需要它們的用戶辈双。
- 特點:
- 優(yōu)點:算法公開责掏、計算量小、加密速度快湃望、加密效率高换衬。
- 缺點是:交易雙方都使用同樣密鑰痰驱,安全性得不到保證。此外瞳浦,每對用戶每次使用對稱加密算法時担映,都需要使用其他人不知道的惟一密鑰,這會使得發(fā)收信雙方所擁有的鑰匙數(shù)量呈幾何級數(shù)增長叫潦,密鑰管理成為用戶的負擔(dān)蝇完。
- 分類:
流加密算法和塊加密算法。 -
包括:
DES矗蕊、3DES短蜕、TDEA、Blowfish傻咖、RC5朋魔、IDEA、AES卿操、CAST警检、RC2、RC4害淤。
對稱密鑰加密和解密過程
流加密算法
流加密算法在當(dāng)今應(yīng)用不是很廣泛扇雕,比較著名的有RC4和A5算法。
流加密算法是將明文與一個密鑰流進行XOR(邏輯異或)運算生成密文筝家。將密文與相同的密鑰流進行XOR運算即可還原成明文洼裤。流加密是以二進制的單個位為單位進行數(shù)據(jù)加密。流加密算法的關(guān)鍵在于密鑰流必須是隨機的溪王,而且合法用戶可以很容易再生該密鑰流腮鞍。流加密算法的密鑰流是通過使用一個隨機位發(fā)生器和一個短的密鑰來產(chǎn)生密鑰流,這個密鑰由用戶記住莹菱。
塊加密算法
塊加密算法是加密算法中應(yīng)用最廣泛的類型移国。塊加密算法每次是對固定大小(如64位、128位道伟、256位等)的位塊進行加密迹缀。塊加密算法將明文分成m個塊,對每個塊進行相同的變換蜜徽,從而產(chǎn)生m個密文塊祝懂。塊的大小可以是任意數(shù)目,但一般都是2的N次方拘鞋。如果明文的大小不是塊大小的整數(shù)倍砚蓬,解決這一問題的常見的方法對位不足的塊用0進行填充,從而使得明文長度是塊大小的整數(shù)倍盆色。當(dāng)然灰蛙,這要求加密時能填充字符祟剔,解密時能夠檢測出填充字符。
非對稱加密算法
非對稱密碼體制將加密運算和解密運算分離摩梧,通信雙方無需事先交換密鑰就可以建立保密通信物延。并且該體制采用密鑰管理技術(shù),大大減少了多用戶通信所需的密鑰量仅父,節(jié)省了系統(tǒng)資源叛薯。
- 特點:
- 優(yōu)點:保密性比較好,它消除了最終用戶交換密鑰的需要笙纤。
- 缺點:算法強度復(fù)雜案训、安全性依賴于算法與密鑰,由于其算法復(fù)雜粪糙,加密解密速度沒有對稱加密解密的速度快。
-
包括:
RSA忿项、Elgamal蓉冈、背包算法、Rabin轩触、DH寞酿、ECC(橢圓曲線加密算法)、DSA脱柱。
非對稱加密和解密過程
摘要算法
消息摘要算法的主要特征是加密過程不需要密鑰伐弹,并且經(jīng)過加密的數(shù)據(jù)無法被解密,只有輸入相同的明文數(shù)據(jù)經(jīng)過相同的消息摘要算法才能得到相同的密文榨为。消息摘要算法不存在密鑰的管理與分發(fā)問題惨好,適合于分布式網(wǎng)絡(luò)相同上使用。現(xiàn)在随闺,消息摘要算法主要應(yīng)用在“數(shù)字簽名”領(lǐng)域日川,作為對明文的摘要算法。
- 特點:
- 單向性
- 抗弱碰撞
- 抗強碰撞
- 包括:
MD5矩乐、SHA-1龄句、SHA-2、SHA-256散罕、SHA-512等
MD5
Message Digest Algorithm 5分歇,流行度極高,但目前被發(fā)現(xiàn)存在碰撞沖突風(fēng)險欧漱; 任意長度輸出為128bit=16字節(jié)摘要
SHA1
SHA 指Security Hash Algorithm职抡,由美國國家安全局NSA設(shè)計的安全散列算法系列; SHA1 輸出長度為160bit=20字節(jié)摘要
SHA256
繼SHA1 出現(xiàn)的算法(屬于SHA-2類)硫椰,安全性較SHA1更高繁调; SHA256 輸出長度為256bit=32字節(jié)摘要萨蚕。
MAC(HMAC) 算法
MAC(Message Authentication Code,消息認證碼算法)是含有密鑰的散列函數(shù)算法蹄胰,兼容了MD和SHA算法的特性岳遥,并在此基礎(chǔ)上加入了密鑰。因次裕寨,我們也常把MAC稱為HMAC(keyed-Hash Message Authentication Code)浩蓉。
MAC算法主要集合了MD和SHA兩大系列消息摘要算法。MD系列的算法有HmacMD2宾袜、HmacMD4捻艳、HmacMD5三種算法;SHA系列的算法有HmacSHA1庆猫、HmacSHA224认轨、HmacSHA256、HmacSHA384月培、HmacSHA512五種算法嘁字。
經(jīng)過MAC算法得到的摘要值也可以使用十六進制編碼表示,其摘要值長度與參與實現(xiàn)的摘要值長度相同杉畜。例如纪蜒,HmacSHA1算法得到的摘要長度就是SHA1算法得到的摘要長度,都是160位二進制碼此叠,換算成十六進制編碼為40位纯续。
- HMAC和MAC在密碼學(xué)上的區(qū)別:
MAC是一個散列映射關(guān)系
HMAC是構(gòu)建MAC的一種方式
數(shù)字簽名
數(shù)字簽名的技術(shù)基礎(chǔ)是公鑰密碼技術(shù)。
數(shù)字簽名主要的功能是:
(1)灭袁、確認信息是由簽名者發(fā)送的猬错;(身份認證)
(2)、確認信息自簽名后到收到為止简卧,未被修改過兔魂;(完整性)
(3)、簽名者無法否認信息是由自己發(fā)送的举娩。(不可抵賴性)數(shù)字簽名技術(shù):
將摘要信息用發(fā)送者的私鑰加密析校,與原文一起傳送給接收者。接收者只有用發(fā)送的公鑰才能解密被加密的摘要信息铜涉,然后用Hash函數(shù)對收到的原文產(chǎn)生一個摘要信息智玻,與解密的摘要信息對比。如果相同芙代,則說明收到的信息是完整的吊奢,在傳輸過程中沒有被修改,否則說明信息被修改過纹烹,因此數(shù)字簽名能夠驗證信息的完整性页滚。一個數(shù)字簽名體制一般包含兩個組成部分:
簽名算法(signaturealgorithm)和驗證算法(verification algorithm)召边。簽名算法用于對消息產(chǎn)生數(shù)字簽名,它通常受一個簽名密鑰的控制裹驰,簽名算法或者簽名密鑰是保密的隧熙,由簽名者掌握;驗證算法用于對消息的數(shù)字簽名進行驗證幻林,根據(jù)簽名是否有效驗證算法能夠給出該簽名為“真”或者“假”的結(jié)論贞盯。驗證算法通常也受一個驗證密鑰的控制,但驗證算法和驗證密鑰應(yīng)當(dāng)是公開的沪饺,以便需要驗證簽名的人能夠方便的驗證-
數(shù)字簽名的實現(xiàn)方法:
無保密機制的RSA簽名過程
有保密機制的RSA簽名過程
數(shù)字證書
數(shù)字證書就是互聯(lián)網(wǎng)通訊中標(biāo)志通訊各方身份信息的一串?dāng)?shù)字躏敢,提供了一種在Internet上驗證通信實體身份的方式,是由一個由權(quán)威機構(gòu)----CA 機構(gòu)整葡,又稱為證書授權(quán)(Certificate Authority)中心發(fā)行的件余,人們可以在網(wǎng)上用來識別對方的身份。數(shù)字證書是一個經(jīng)證書授權(quán)中心數(shù)字簽名的包含公開密鑰擁有者信息以及公開密鑰的文件遭居。最簡單的證書包含一個公開密鑰蛾扇、名稱以及證書授權(quán)中心的數(shù)字簽名,此外魏滚,數(shù)字證書只在特定的時間段內(nèi)有效。
- 數(shù)字證書工作原理:
數(shù)字證書采用公鑰體制坟漱,即利用一對互相匹配的密鑰進行加密鼠次、解密。每個用戶自己設(shè)定一把特定的僅為本人所知的私有密鑰(私鑰)芋齿,用它進行解密和簽名腥寇;同時設(shè)定一把公共密鑰(公鑰)并由本人公開,為一組用戶所共享觅捆,用于加密和驗證簽名赦役。當(dāng)發(fā)送一份保密文件時,發(fā)送方使用接收方的公鑰對數(shù)據(jù)加密栅炒,而接收方則使用自己的私鑰解密,這樣信息就可以安全無誤地到達目的地了。通過數(shù)字的手段保證加密過程是一個不可逆過程膝蜈,即只有用私有密鑰才能解密储狭。在公開密鑰密碼體制中,常用的一種是RSA體制释移。其數(shù)學(xué)原理是將一個大數(shù)分解成兩個質(zhì)數(shù)的乘積叭披,加密和解密用的是兩個不同的密鑰。即使已知明文玩讳、密文和加密密鑰(公開密鑰)涩蜘,想要推導(dǎo)出解密密鑰(私密密鑰)嚼贡,在計算上是不可能的。
- 數(shù)字證書從應(yīng)用角度分類:
(1)同诫、服務(wù)器證書(SSL證書):被安裝于服務(wù)器設(shè)備上粤策,用來證明服務(wù)器的身份和進行通信加密。服務(wù)器證書可以用來防止欺詐釣魚站點剩辟。在服務(wù)器上安裝服務(wù)器證書后掐场,客戶端瀏覽器可以與服務(wù)器證書建立SSL連接,在SSL連接上傳輸?shù)娜魏螖?shù)據(jù)都會被加密贩猎。同時熊户,瀏覽器會自動驗證服務(wù)器證書是否有效,驗證所訪問的站點是否是假冒站點吭服,服務(wù)器證書保護的站點多被用來進行密碼登錄嚷堡、訂單處理、網(wǎng)上銀行交易等艇棕。SSL證書主要用于服務(wù)器(應(yīng)用)的數(shù)據(jù)傳輸鏈路加密和身份認證蝌戒,綁定網(wǎng)站域名,不同的產(chǎn)品對于不同價值的數(shù)據(jù)和要求不同的身份認證沼琉。
(2)北苟、電子郵件證書:可以用來證明電子郵件發(fā)件人的真實性。它并不證明數(shù)字證書上面CN一項所標(biāo)識的證書所有者姓名的真實性打瘪,它只證明郵件地址的真實性友鼻。收到具有有效電子簽名的電子郵件,我們除了能相信郵件確實由指定郵箱發(fā)出外闺骚,還可以確信該郵件從被發(fā)出后沒有被篡改過彩扔。另外,使用接收的郵件證書僻爽,我們還可以向接收方發(fā)送加密郵件虫碉。該加密郵件可以在非安全網(wǎng)絡(luò)傳輸,只有接收方的持有者才可能打開該郵件胸梆。
(3)敦捧、客戶端個人證書:主要被用來進行身份驗證和電子簽名。安全的客戶端證書被存儲于專用的usbkey中碰镜。存儲于key中的證書不能被導(dǎo)出或復(fù)制绞惦,且key使用時需要輸入key的保護密碼。使用該證書需要物理上獲得其存儲介質(zhì)usbkey洋措,且需要知道key的保護密碼济蝉,這也被稱為雙因子認證。這種認證手段是目前internet最安全的身份認證手段之一。key的種類有多種王滤,指紋識別贺嫂、第三鍵確認,語音報讀雁乡,以及帶顯示屏的專用usbkey和普通usbkey等第喳。
- 數(shù)字證書格式:目前普遍采用的是X.509V3國際標(biāo)準,一個標(biāo)準的X.509數(shù)字證書包含以下一些內(nèi)容:
(1)踱稍、證書的版本信息曲饱;
(2)、證書的序列號珠月,每個證書都有一個唯一的證書序列號扩淀;
(3)、證書所使用的簽名算法啤挎;
(4)驻谆、證書的發(fā)行機構(gòu)名稱,命名規(guī)則一般采用X.500格式庆聘;
(5)胜臊、證書的有效期,現(xiàn)在通用的證書一般采用UTC時間格式伙判,它的計時范圍為1950-2049象对;
(6)、證書所有人的名稱宴抚,命名規(guī)則一般采用X.500格式织盼;
(7)、證書所有人的公開密鑰酱塔;
(8)、證書發(fā)行者對證書的簽名危虱。
證書結(jié)構(gòu)
數(shù)字信封
數(shù)字信封(digital envelope)是將對稱密鑰通過非對稱加密(即有公鑰和私鑰兩個)的結(jié)果分發(fā)對稱密鑰的方法羊娃。
數(shù)字信封包含被加密的內(nèi)容和被加密的用于加密該內(nèi)容的密鑰。雖然經(jīng)常使用接收方的公鑰來加密“加密密鑰”埃跷,但這并不是必須的蕊玷,也可以使用發(fā)送方和接收方預(yù)共享的對稱密鑰來加密。當(dāng)接收方收到數(shù)字信封時弥雹,先用私鑰或預(yù)共享密鑰解密垃帅,得到“加密密鑰”,再用該密鑰解密密文剪勿,獲得原文贸诚。數(shù)字信封技術(shù)使用兩層加密體系。
數(shù)字信封是一種綜合利用了對稱加密技術(shù)和非對稱加密技術(shù)兩者的優(yōu)點進行信息安全傳輸?shù)囊环N技術(shù)。數(shù)字信封既發(fā)揮了對稱加密算法速度快酱固、安全性好的優(yōu)點械念,又發(fā)揮了非對稱加密算法密鑰管理方便的優(yōu)點。
數(shù)字信封是公鑰密碼體制在實際中的一個應(yīng)用运悲,是用加密技術(shù)來保證只有規(guī)定的特定收信人才能閱讀通信的內(nèi)容龄减。
編解碼算法
1. Hex 編碼
將二進制數(shù)據(jù)按16進制轉(zhuǎn)換為字符串,1字節(jié)=2個字符班眯,編碼后體積為2倍希停。
2. Base64
由MIME規(guī)范定義的編碼算法,其將3個字節(jié)(24位)編碼為4個字符署隘。 字符集包括64個宠能,可表示6二進制位的數(shù)據(jù),因此一個字符對應(yīng)一組6bit的數(shù)據(jù)定踱。 編碼后體積約為4/3倍棍潘,針對不足位數(shù)用=補齊。
協(xié)議
SSL
- 概念
安全套接字層(SSL, Secure Sockets Layer)是一種協(xié)議崖媚,支持服務(wù)通過網(wǎng)絡(luò)進行通信而不損害安全性亦歉。它在客戶端和服務(wù)器之間創(chuàng)建一個安全連接。然后通過該連接安全地發(fā)送任意數(shù)據(jù)量畅哑。 - 用途
主要用在Web領(lǐng)域肴楷,它是利用數(shù)據(jù)的加密技術(shù)保障數(shù)據(jù)在互聯(lián)網(wǎng)上安全傳輸?shù)模_保其傳輸過程中不至于被竊聽或截聽荠呐,甚至是即使在被竊聽或截聽的情況下數(shù)據(jù)也不會被破譯赛蔫。對于Web,SSL已被廣泛地運用泥张,保證Web瀏覽器與Web瀏覽器之間數(shù)據(jù)加密傳輸與身份認證等呵恢。 - 必要條件
安全套接字是用于服務(wù)器之上的一個加密系統(tǒng),它可以確保在客戶機與服務(wù)器之間傳輸?shù)臄?shù)據(jù)仍然是安全與隱秘的媚创。要使服務(wù)器和客戶機使用SSL進行安全的通信渗钉,服務(wù)器必須有兩樣?xùn)|西:密鑰對(Key pair)和證書(Certificate)。
工作過程
SSL使用安全握手來初始化客戶機與服務(wù)器之間的安全連接钞钙。在握手期間鳄橘,客戶機和服務(wù)器對它們將要為此會話使用的密鑰及加密方法達成一致∶⒘叮客戶機使用服務(wù)器證書驗證服務(wù)器瘫怜。握手之后,SSL被用來加密和解密HTTPS(組合SSL和HTTP的一個獨特協(xié)議)請求和服務(wù)器響應(yīng)中的所有信息本刽,包括:
(1)鲸湃、客戶機正在請求的URL赠涮;
(2)、提交的表單的內(nèi)容唤锉;
(3)世囊、訪問授權(quán)信息(比如用戶名和密碼);
(4)窿祥、所有在客戶機與服務(wù)器之間發(fā)送的數(shù)據(jù)株憾。
SSL及其繼任者傳輸層安全(TransportLayer Security, TLS)是為網(wǎng)絡(luò)通信提供安全及數(shù)據(jù)完整性的一種安全協(xié)議。TLS與SSL在傳輸層對網(wǎng)絡(luò)連接進行加密晒衩。SSL用以保障在Internet上數(shù)據(jù)傳輸之安全嗤瞎,利用數(shù)據(jù)加密(Encryption)技術(shù),可確保數(shù)據(jù)在網(wǎng)絡(luò)上傳輸過程中不會被截取及竊聽听系。
SSL協(xié)議位于TCP/IP協(xié)議與各種應(yīng)用層協(xié)議之間贝奇,為數(shù)據(jù)通訊提供安全支持,如圖1靠胜。SSL協(xié)議可分為兩層:(1)掉瞳、SSL記錄協(xié)議(SSLRecord Protocol):它建立在可靠的傳輸協(xié)議(如TCP)之上,為高層協(xié)議提供數(shù)據(jù)封裝浪漠、壓縮陕习、加密等基本功能的支持;(2)址愿、SSL握手協(xié)議(SSL Handshake Protocol):它建立在SSL記錄協(xié)議之上该镣,用于在實際的數(shù)據(jù)傳輸開始前,通訊雙方進行身份認證响谓、協(xié)商加密算法损合、交換加密密鑰等。
功能
(1)娘纷、SSL實際上是一種調(diào)和各種加密算法的策略嫁审,能調(diào)用各種加密算法的功能模塊,對傳輸?shù)恼鎸崝?shù)據(jù)進行加密赖晶,防止傳輸?shù)臄?shù)據(jù)被黑客截取律适,即使被截取,由于數(shù)據(jù)是被加密過的嬉探,所以也能保證數(shù)據(jù)在一定的時間內(nèi)很難被破譯,但是不能保證100%的安全棉圈,這是任何安全策略都不能做到的涩堤;
(2)、SSL還能提供保護數(shù)據(jù)完整性策略分瘾,確保在傳輸中數(shù)據(jù)不被非法篡改胎围,主要采用相關(guān)摘要算法來實現(xiàn)吁系;
(3)、SSL還具備認證功能白魂,主要是可以認證客戶端的合法性(相對于服務(wù)器而言)和服務(wù)器的合法性(相對于客戶端)汽纤,這種認證非常重要,很多的攻擊都是黑客偽裝成合法的對等方來攻擊的福荸,如中間人攻擊技術(shù)蕴坪。
(4)、SSL也支持數(shù)據(jù)傳輸前被壓縮功能敬锐,數(shù)據(jù)壓縮的目的是減少網(wǎng)絡(luò)傳輸負載背传。
TLS
安全傳輸層協(xié)議(TLS)用于在兩個通信應(yīng)用程序之間提供保密性和數(shù)據(jù)完整性。
該協(xié)議由兩層組成: TLS 記錄協(xié)議(TLS Record)和 TLS 握手協(xié)議台夺。
TLS握手過程
- 當(dāng)客戶端連接到支持TLS協(xié)議的服務(wù)器要求創(chuàng)建安全連接并列出了受支持的密碼組合(加密密碼算法和加密哈希函數(shù))径玖,握手開始。
- 服務(wù)器從該列表中決定加密和散列函數(shù)颤介,并通知客戶端梳星。
- 服務(wù)器發(fā)回其數(shù)字證書,此證書通常包含服務(wù)器的名稱滚朵、受信任的證書頒發(fā)機構(gòu)(CA)和服務(wù)器的公鑰冤灾。
- 客戶端確認其頒發(fā)的證書的有效性。
- 為了生成會話密鑰用于安全連接始绍,客戶端使用服務(wù)器的公鑰加密隨機生成的密鑰瞳购,并將其發(fā)送到服務(wù)器,只有服務(wù)器才能使用自己的私鑰解密亏推。
- 利用隨機數(shù)学赛,雙方生成用于加密和解密的對稱密鑰。這就是TLS協(xié)議的握手吞杭,握手完畢后的連接是安全的盏浇,直到連接(被)關(guān)閉。如果上述任何一個步驟失敗芽狗,TLS握手過程就會失敗绢掰,并且斷開所有的連接。
開源庫
OpenSSL
在計算機網(wǎng)絡(luò)上童擎,OpenSSL是一個開放源代碼的軟件庫包滴劲,應(yīng)用程序可以使用這個包來進行安全通信,避免竊聽顾复,同時確認另一端連線者的身份班挖。這個包廣泛被應(yīng)用在互聯(lián)網(wǎng)的網(wǎng)頁服務(wù)器上。
其主要庫是以C語言所寫成芯砸,實現(xiàn)了基本的加密功能萧芙,實現(xiàn)了SSL與TLS協(xié)議给梅。OpenSSL可以運行在OpenVMS、 Microsoft Windows以及絕大多數(shù)類Unix操作系統(tǒng)上双揪。
OpenSSL包含3個部分:密碼算法庫动羽、SSL協(xié)議庫、應(yīng)用程序渔期。
源代碼組成
(1)运吓、工具源碼庫,主要存放在/apps文件夾下擎场,如果默認編譯羽德,則只編譯成openssl(windows環(huán)境下編譯成openssl.exe)可執(zhí)行文件。其包含各種豐富的命令工具迅办,并且各個源碼可單獨進行編譯宅静;
(2)、范例源碼在/demos目錄下站欺;
(3)姨夹、測試源碼主要在/test下;
(4)矾策、SSL庫所有源代碼都在/ssl文件目錄下磷账,包括SSL系列源碼。各系列的版本基本都有客戶端函數(shù)源碼(_clnt.c)贾虽、服務(wù)端函數(shù)源碼(_srvr.c)逃糟、還有通用函數(shù)源碼(_both.c)以及底層包源碼(_pkt.c)、方法函數(shù)源碼(_meth.c)等協(xié)議相關(guān)的各種密鑰計算函數(shù)源碼(_enc.c)蓬豁;
(5)绰咽、crypto源代碼庫是OpenSSL庫最基礎(chǔ)的代碼庫,包括如下內(nèi)容:
A地粪、對稱算法與非對稱算法以及摘要算法封裝crypto/evp目錄下取募;
B、crypto/hmac目錄蟆技,實現(xiàn)基于對稱算法的MAC玩敏;
C、對稱算法(crypto/aes质礼、crypto/omp旺聚、crypto/bf、crypto/des和crypto/cast等目錄)眶蕉;
D砰粹、非對稱算法(crypto/dh、crypto/ec妻坝、crypto/ecdh和crypto/dsa)伸眶;
E、密鑰交換/認證算法(crypto/dh和crypto/krb5)以及摘要算法(crypto/md2刽宪、crypto/md4厘贼、crypto/md5和crypto/sha);
F圣拄、隊列(crypto/pqueue目錄)嘴秸,實現(xiàn)隊列數(shù)據(jù)結(jié)構(gòu),用于DTLS庇谆;
G岳掐、隨機數(shù)(crypto/rand目錄),實現(xiàn)偽隨機數(shù)生成饭耳,同時支持用戶自定義隨機數(shù)生成串述;
H、x509數(shù)字證書(crypto/x509v3和crypto/x509)寞肖,包含數(shù)字證書申請纲酗、數(shù)字證書以及CRL的構(gòu)造、解析和簽名驗證等功能新蟆;
I觅赊、asn.1 DER編碼解碼(crypto/asn1目錄),包含基本asn1對象的編解碼及數(shù)字證書請求琼稻、數(shù)字證書和CRL撤銷列表及PKCS8等基本的編解碼函數(shù)吮螺。這些函數(shù)是通過宏來實現(xiàn)的;
J帕翻、抽象IO接口(BIO, crypto/bio)鸠补,其目錄下的函數(shù)對各種輸入輸出進行抽象封裝,包括內(nèi)存熊咽、文件莫鸭、socket、標(biāo)準輸入輸出和SSL協(xié)議横殴;
K被因、hash表(crypto/lhash目錄),實現(xiàn)了散列表的數(shù)據(jù)結(jié)構(gòu)衫仑。OpenSSL中很多數(shù)據(jù)結(jié)構(gòu)都是以散列表來存放的梨与;
M、數(shù)字證書在線認證(crypto/ocsp目錄)文狱,實現(xiàn)了ocsp協(xié)議的編解碼以及證書有效性計算等功能粥鞋;
N、堆棧(crypto/stack目錄)瞄崇,實現(xiàn)了堆棧數(shù)據(jù)結(jié)構(gòu)呻粹;
O壕曼、pkcs7消息語法(crypto/pkcs7目錄),主要實現(xiàn)了構(gòu)造和解析PKCS7消息等浊;
P腮郊、文件數(shù)據(jù)庫(crypto/txt_db目錄);
Q筹燕、DSO(動態(tài)共享對象轧飞,crypto/dso目錄),本目錄下的文件主要抽象了各種平臺的動態(tài)庫加載函數(shù)撒踪,為用戶提供統(tǒng)一接口过咬;
R、硬件引擎(crypto/engine目錄)制妄,硬件引擎接口掸绞。用戶如果要寫自己的硬件引擎,必須實現(xiàn)它所規(guī)定的接口耕捞;
S集漾、PEM文件格式處理(crypto/pem),用于生成和讀取各種PEM格式文件砸脊,包括各種密鑰具篇、數(shù)字證書請求、數(shù)字證書凌埂、PKCS7消息和PKCS8消息等驱显;
T、pkcsl2個人證書格式(crypto/pckcsl2目錄)瞳抓,主要功能為實現(xiàn)證書的構(gòu)造和解析功能埃疫;
U、線程支持功能(crypto/threads)孩哑,OpenSSL支持多線程栓霜,但是用戶必須實現(xiàn)相關(guān)接口;
V横蜒、錯誤處理功能(crypto/err目錄)胳蛮,當(dāng)程序出現(xiàn)錯誤時,OpenSSL能以堆棧的形式顯示各個錯誤丛晌。本目錄下只有基本的錯誤處理接口仅炊,具體的錯誤信息由各個模塊提供;
W澎蛛、大數(shù)運算功能(crypto/bn目錄)抚垄,本目錄下的文件實現(xiàn)了各種大數(shù)運算。這些大數(shù)運算主要用于非對稱算法中密鑰生成以及各種加解密操作。另外還為用戶提供了大量輔助函數(shù)呆馁,比如內(nèi)存與大數(shù)之間的相互轉(zhuǎn)換桐经;
X、字符緩存操作功能(crypto/buffer目錄)浙滤,為字符操作提供內(nèi)存緩沖區(qū)次询;
Y、配置文件讀取(crypto/conf目錄)瓷叫,OpenSSL主要配置文件為OpenSSL.cnf。本目錄下的函數(shù)實現(xiàn)了對這種格式配置文件的讀取操作送巡。
SSL協(xié)議的實現(xiàn)源代碼位于OpenSSL的ssl目錄下摹菠。SSL的所有實現(xiàn)中,都有客戶端實現(xiàn)(_clnt.c)骗爆、服務(wù)端實現(xiàn)(_srvr.c)次氨、加密實現(xiàn)(_enc.c)、記錄協(xié)議實現(xiàn)(_pkt.c)摘投、METHOD方法(_meth.c)煮寡、客戶端服務(wù)端都用到的握手方法實現(xiàn)(_both.c),以及對外提供的函數(shù)實現(xiàn)(_lib.c)等犀呼。ssl.h文件幸撕,可以看到SSL的主要數(shù)據(jù)結(jié)構(gòu)。包括SSL_CTX外臂、SSL和SSL_SESSION坐儿。SSL_CTX主要功能為SSL握手階段的環(huán)境準備、準備SSL握手階段所需的證書宋光、私有密鑰貌矿、版本及其它選項。SSL的主要功能為準備SSL握手階段與傳送數(shù)據(jù)信息罪佳。SSL_SESSION數(shù)據(jù)結(jié)構(gòu)則為了保存主密鑰逛漫、會話ID、讀寫各種密鑰等赘艳。SSL_CTX數(shù)據(jù)結(jié)構(gòu)初始化在最先酌毡,緊接著是初始化SSL數(shù)據(jù)結(jié)構(gòu)。
SSL記錄層的實現(xiàn)
首先對明文數(shù)據(jù)進行分片蕾管,每片有固定大小阔馋,其次將每個分片單獨壓縮,而不是放在一起進行壓縮娇掏,然后對每一個壓縮包進行MAC計算呕寝,并產(chǎn)生一個MAC值,之后對這個壓縮包進行加密,最后將這個加密后的密文與MAC值放在一起用協(xié)議頭進行封裝下梢,如圖2客蹋。
SSL協(xié)議握手層實現(xiàn)
(1)、client端向server端發(fā)送的第一個開始信息是hello單詞以及SSL的版本號孽江、client端支持的加密算法讶坯、一個client端自動生成的偽隨機號等,向server端表示一個新會話連接的開始岗屏。
(2)辆琅、server端根據(jù)client端發(fā)過來的信息判斷是否接受這個新的會話,不需要就斷開連接这刷,client會繼續(xù)發(fā)送hello建立會話婉烟,直到server接收這個會話連接或到自己放棄這個會話連接。如果server答應(yīng)這個會話建立暇屋,則server在回應(yīng)對方信息時將含有未來數(shù)據(jù)加密所必須的任何數(shù)據(jù)似袁,如版本號、支持的加密算法咐刨、一個服務(wù)器端自動生成的偽隨機數(shù)等昙衅;
(3)、client端會依據(jù)收到的來自server端的數(shù)據(jù)產(chǎn)生主key定鸟,并使用server端的public key加密這個主key后而涉,將加密過的key傳給server,因為只有server有public key的另一把private key联予,所以只有真正的server能解密婴谱;
(4)、server解密成功后躯泰,返回給client一個用主key認證的數(shù)據(jù)谭羔,以此數(shù)據(jù)讓client端認證自己;
(5)麦向、如果是雙認證模式瘟裸,還要采取方式對另一邊也進行認證;
(6)诵竭、最后雙方都要發(fā)送done或over信息表示握手結(jié)束话告,如圖3。