對(duì)稱加密與非對(duì)稱加密
按照密鑰的使用形式,加密算法可以分為對(duì)稱加密和非對(duì)稱加密(又叫公鑰加密)。對(duì)稱加密在加密和解密的過程中,使用相同的秘鑰;而非對(duì)稱加密在加密過程中使用公鑰進(jìn)行加密,解密使用私鑰。
對(duì)稱加密的加密和解密需要使用相同的密鑰,所以需要解決密鑰配送問題。
非對(duì)稱加密的處理速度遠(yuǎn)低于對(duì)稱密鑰
密鑰:一個(gè)加密算法中,輸入為明文和密鑰,輸出為密文。在加密算法中,密鑰通常是像238435639047397537493753453945379346236這樣的 一串非常大的數(shù)字。
對(duì)稱加密下的密鑰配送問題
發(fā)送者A想要發(fā)一封郵件給接受者B,但是不想被人看到其中的內(nèi)容。A決定使用對(duì)稱加密的方法。但是我們知道,對(duì)稱在對(duì)稱加密中,加密與解密需要使用同樣的密鑰。B想要看到接收到的內(nèi)容必須要有A的密鑰。也就是說,A需要把密鑰安全地送到B的手上。
那如果把加密后的密文和密鑰一同通過郵件發(fā)送給B行不行呢?答案是不行的。因?yàn)橐坏┍患用艿拿芪暮兔荑€同時(shí)落在竊聽者C的手中,C就可以用密鑰對(duì)密文進(jìn)行解密。
混合密碼系統(tǒng)
混合密碼系統(tǒng),是將對(duì)稱密碼和非對(duì)稱密碼的優(yōu)勢(shì)相結(jié)合的方法。混合密碼系統(tǒng)解決了對(duì)稱密碼的密鑰配送問題,又解決了非對(duì)稱密碼的加密與解密速度問題。
混合密碼系統(tǒng)中會(huì)先用快速的對(duì)稱密碼,對(duì)消息進(jìn)行加密,這樣消息就變?yōu)槊芪模WC消息機(jī)密性。然后,用非對(duì)稱加密對(duì)對(duì)稱密碼的密鑰進(jìn)行加密,因?yàn)槊荑€一般比要加密的信息短,加密和解密的速度就得到保證了。這樣,密碼配送問題就得到了解決。
單向散列函數(shù)
單向散列函數(shù)也稱為消息摘要函數(shù)(message digest function),哈希函數(shù),適用于檢查消息完整性的加密技術(shù)。
單向散列函數(shù)有一個(gè)輸入和一個(gè)輸出,其中輸入稱為信息,輸出稱為散列值。單向散列函數(shù)可以根據(jù)消息的內(nèi)容計(jì)算出散列值,篡改后的信息的散列值計(jì)算結(jié)果會(huì)不一樣,所以散列值可以被用來檢查消息的完整性 。
單向散列函數(shù)輸出的散列值也成為消息摘要,或者指紋。散列來源于英文”hash”一值,單向散列函數(shù)的作用,實(shí)際上就是將很長的消息剁碎,然后混合成固定長度的散列值。
無法解決的問題
使用單向散列函數(shù)可以實(shí)現(xiàn)完整性的檢查,但有些情況下即便能檢查完整性也是沒有意義的。
例如,主動(dòng)攻擊者D偽裝成發(fā)送者A發(fā)送消息和散列值給B。這時(shí),B能夠通過單向散列函數(shù)檢查消息的完整性,但這只是對(duì)D發(fā)送的信息進(jìn)行完整性檢查,而無法識(shí)別出D的偽裝。
辨別偽裝需要用到認(rèn)證,用于認(rèn)證的技術(shù)包括消息認(rèn)證碼和數(shù)字簽名,消息認(rèn)證碼可以保證信息沒有被篡改,而數(shù)字簽名還能向第三方做出保證。
消息認(rèn)證碼
消息認(rèn)證碼(MAC)是一種與密鑰相關(guān)聯(lián)的單向散列函數(shù)。
使用步驟
(1)發(fā)送者A與接收者B事先共享密鑰。
(2)發(fā)送者A根據(jù)請(qǐng)求信息,計(jì)算MAC值(使用共享密鑰)。
(3)發(fā)送者A將請(qǐng)求信息和MAC值發(fā)送給接收者B。
(4)接收者B根據(jù)接收到的信息,計(jì)算MAC值。
(5)接收者B將自己計(jì)算的MAC值與A發(fā)送過來的MAC值進(jìn)行對(duì)比。
(6)如果MAC值一致,則接收者B可以斷定請(qǐng)求來自發(fā)送者A。
依然存在密鑰配送問題
在消息認(rèn)證碼中,發(fā)送者A與接受者B共享密鑰,這個(gè)密鑰不可以被攻擊者獲取,如果攻擊者獲取到這個(gè)密鑰。則攻擊者也可以計(jì)算出MAC值,從而可以進(jìn)行偽裝攻擊。
因此,要解決密鑰配送問題,我們需要向?qū)ΨQ密碼一樣,使用一些共享密鑰的方法,如公鑰密碼,密鑰分配中心,或其他安全的方式發(fā)送密鑰。
MAC與對(duì)稱密碼認(rèn)證
MAC技術(shù)中,發(fā)送者與接受者需要使用相同的密鑰進(jìn)行加密;對(duì)稱加密中,密文只有使用和加密時(shí)相同的密鑰才能正確解密,否則將會(huì)產(chǎn)生看上去雜亂無章的“明文”。那么,是否可以用對(duì)稱密碼進(jìn)行認(rèn)證呢?
答案是不可以。假設(shè)我們要發(fā)送的明文就是一串隨機(jī)的比特序列,我們將明文用對(duì)稱密碼加密之后發(fā)送出去,當(dāng)接受者收到密文并進(jìn)行解密時(shí),看上去都是一串隨機(jī)的比特序列,那我們?cè)趺磁袛嘈畔⑹欠駚碜怨粽吣兀?div style="height:15px;">
更準(zhǔn)確地說,我們無法根據(jù)“是否雜亂無章”而判斷認(rèn)證是否通過,這不是一個(gè)可行的標(biāo)準(zhǔn)。而使用MAC則可以通過對(duì)比MAC碼,得到一個(gè)明確的結(jié)果。
MAC無法解決的問題
對(duì)第三方的證明
接收者B收到了來自A的信息后,想要想第三方驗(yàn)證者D證明這條信息確實(shí)是A發(fā)送的。但是MAC無法進(jìn)行這樣的證明。
對(duì)于驗(yàn)證著D來說,知道密鑰的人有A和B,只要知道密鑰,就可以計(jì)算出正確的MAC值。因此,D不可以斷定信息是由A發(fā)送的,因?yàn)橐灿锌赡苁荁自己偽造信息發(fā)送給自己的。
無法防止否認(rèn)
接受者B收到了A發(fā)送過來的信息,里面包含有B與A共享的密鑰計(jì)算出來的,因此B斷定這條信息來自A。
但是,A可以聲稱自己并沒有向B發(fā)送過這條信息。因?yàn)锳與B都擁有密鑰,A可以聲稱該信息的MAC值,是由B計(jì)算出來的,而不是自己。
數(shù)字簽名
數(shù)字簽名,就是只有信息的發(fā)送者才能產(chǎn)生的別人無法偽造的一段數(shù)字串,這段數(shù)字串同時(shí)也是對(duì)信息的發(fā)送者發(fā)送信息真實(shí)性的一個(gè)有效證明。
數(shù)字簽名是非對(duì)稱密鑰加密技術(shù)與數(shù)字摘要技術(shù)的應(yīng)用。
簽名的生成與驗(yàn)證
在數(shù)字簽名技術(shù)中,涉及到兩種行為:生成消息簽名和驗(yàn)證數(shù)字簽名。
生成消息簽名這一行為是由消息的發(fā)送者A來完成的,也稱為“對(duì)消息簽名”。生成簽名就是根據(jù)消息內(nèi)容計(jì)算數(shù)字簽名的值,這個(gè)行為意味著“我認(rèn)可改消息的內(nèi)容”。
驗(yàn)證數(shù)字簽名這一行為一般由消息的接受者B來完成,也可以由消息的驗(yàn)證者來完成。驗(yàn)證的結(jié)果可以是成功或者失敗,成功以為著消息屬于A,失敗則意味著消息不屬于A 。
數(shù)字簽名對(duì)簽名密鑰和驗(yàn)證密鑰進(jìn)行了區(qū)分,使用驗(yàn)證密鑰是無法生成簽名的。簽名密鑰只能有簽名者持有,而驗(yàn)證密鑰則是任何需要驗(yàn)證簽名的人都可以持有。
在公鑰密碼中,密鑰分為加密密鑰和解密密鑰,用加密密鑰無法進(jìn)行解密。解密密鑰只能有需要解密的人持有,而加密密鑰則是任何需要加密的人都可以持有??梢哉f,數(shù)字簽名就是將公鑰密碼“反過來用”來實(shí)現(xiàn)的。
數(shù)字簽名的流程
發(fā)送者A需要對(duì)消息簽名,而接受者B要對(duì)簽名進(jìn)行驗(yàn)證。那么,A需要事先生成一個(gè)包括公鑰和私鑰的密鑰對(duì),而需要驗(yàn)證簽名的B則需要得到A的公鑰。
簽名和驗(yàn)證的過程如下:
1. A用自己的私鑰對(duì)信息進(jìn)行加密。用私鑰加密得到的密文就是A對(duì)這條信息的簽名,由于只有A才持有自己的私鑰,因此除了A以外,其他人是無法生成相同的簽名的。
2. A將信息和簽名發(fā)送給B
3. B用A的公鑰對(duì)收到的簽名進(jìn)行解密。如果收到的簽名確實(shí)是用Alice的私鑰進(jìn)行加密得到的密文,那么用A的公鑰應(yīng)該能夠正確解密,反之,則不能正確解密。
4. B將解密得到的結(jié)余A發(fā)送的信息進(jìn)行對(duì)比,兩者一直,簽名驗(yàn)證成功。兩者不一致,則簽名驗(yàn)證失敗。
除了對(duì)消息進(jìn)行加密得到簽名,我們還可以對(duì)消息的散列值進(jìn)行加密,得到簽名。這樣無論消息有多長,我們對(duì)消息進(jìn)行加密和解密都是非??焖俚?。
與MAC相比下的優(yōu)勢(shì)
可以防止否認(rèn) 。還記得為什么MAC無法防止否認(rèn)嗎?正是因?yàn)槊荑€由通信的雙方共同持有,發(fā)送者A可以謊稱消息認(rèn)證碼是由接受者B生成的。而在數(shù)字簽名技術(shù)中,加密的私鑰只由一方持有,只有持有密鑰的一方才可以生成簽名。
第三方的證明 。同理,因?yàn)樗借€僅由單方面持有,簽名僅能由私鑰的持有者生成,所以可以實(shí)現(xiàn)第三方的證明。
證書
什么是證書
公鑰證書(Public-Key Certificate,PKC)由認(rèn)證機(jī)構(gòu)(CA)生成,用于確認(rèn)公鑰確實(shí)屬于此人。
認(rèn)證機(jī)構(gòu),就是能確認(rèn)“公鑰確實(shí)屬于此人”并能夠生成數(shù)字簽名的個(gè)人或者組織。
證書的使用場(chǎng)景
下面通過代表性的應(yīng)用場(chǎng)景來理解證書的作用。
我們用文字進(jìn)一步說明這些步驟都做了些什么。
1. B生成密鑰對(duì)
2. B在認(rèn)證機(jī)構(gòu)D注冊(cè)自己的公鑰
3. 認(rèn)證機(jī)構(gòu)D用自己的私鑰對(duì)B的公鑰施加簽名并生成證書
4. A得到帶認(rèn)證機(jī)構(gòu)D的數(shù)字簽名的B的公鑰
5. A使用認(rèn)證機(jī)構(gòu)D的公鑰驗(yàn)證數(shù)字簽名,確認(rèn)B的公鑰的合法性
6. A用B的公鑰加密信息并發(fā)送給B
7. B用自己的私鑰解密密文得到A的信息
各種密碼技術(shù)對(duì)比
對(duì)稱密碼與非對(duì)稱密碼
對(duì)稱密碼公鑰密碼
發(fā)送者用共享密鑰加密用公鑰加密
接受者用共享密鑰加密用私鑰解密
密鑰配送問題存在不存在
機(jī)密性可保證可保證
消息認(rèn)證碼與數(shù)字簽名
消息認(rèn)證碼數(shù)字簽名
發(fā)送者用共享密鑰計(jì)算MAC值用私鑰生成簽名
接受者用共享密鑰計(jì)算MAC值用公鑰驗(yàn)證簽名
密鑰配送問題存在不存在,但是公鑰需要另外驗(yàn)證
完整性可保證可保證
認(rèn)證可保證(僅限通信雙方)可保證(可使用與第三方)
防止否認(rèn)不可保證可保證
參考
《圖解密碼學(xué)》
出處:https://qiuzhenyuan.github.io/2017/09/24/常用密碼學(xué)技術(shù)/