日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

密码学技术导论篇

發(fā)布時間:2024/1/8 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 密码学技术导论篇 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

密碼學(xué)技術(shù)

  • 前言
  • 基礎(chǔ)術(shù)語
    • 不要使用保密的密碼算法
    • 任何密碼總有一天都會被破解
  • 對稱密碼(共享秘鑰密碼)
    • AES
    • 總結(jié)
  • 公鑰密碼 --- 用公鑰加密,私鑰解密
    • 秘鑰配送問題
    • 公鑰密碼
    • 中間人攻擊
  • 認(rèn)證
    • 單向散列函數(shù)--- 消息的指紋
      • 單向散列函數(shù)的實際應(yīng)用
      • 單向散列函數(shù)無法解決的問題。
    • 消息認(rèn)證碼
      • 什么事消息認(rèn)證碼
      • 消息認(rèn)證碼無法解決的問題
        • 對第三方證明
        • 防止否認(rèn)
  • 密鑰
    • 什么是密鑰
    • 各種不同的密鑰
  • 隨機數(shù) --- 不可預(yù)測的源泉
    • 隨機數(shù)的性質(zhì)
      • 隨機性
      • 不可預(yù)測性
      • 不可重現(xiàn)性
    • 偽隨機數(shù)生成器
  • 密碼技術(shù)與實現(xiàn)社會
    • 密碼技術(shù)小結(jié)
      • 6中基本的密碼技術(shù)
      • 密碼技術(shù)與壓縮技術(shù)
    • 比特幣
      • 區(qū)塊鏈
      • 挖礦

前言

上一篇博客:計算機科學(xué)領(lǐng)域中里程牌式的算法中提到了兩處密碼學(xué)的算法。其中的序言,讓我認(rèn)識到我的專業(yè)是計算機科學(xué)與技術(shù),那么是否要科普或者說要專攻的方向是否應(yīng)該是這些方面的內(nèi)容呢?(而不是軟件工程中所學(xué)的內(nèi)容,個人理解,不喜互噴)

借著這個想法,為了更好的理解密碼學(xué),因此就看了一篇名為《圖解密碼學(xué)技術(shù)》的一本書,書的確講的很好。在看完之后,就想寫下一篇讀書筆記,記錄自己看完之后的一個總結(jié),同時該書有四百多頁,也是為了哪些不想看這么厚的書,這需要看一篇博客即可。

基礎(chǔ)術(shù)語

  • 加密之前的消息稱為明文,加密之后的消息稱為密文。
  • 從明文生成密文的步驟,也就是加密的步驟,稱為“加密算法”,而解密的步驟則稱為“解密算法”。加密、解密的算法結(jié)合在一塊統(tǒng)稱為密碼算法
  • 秘鑰:密碼算法中需要秘鑰。是一串很大的數(shù)字。無論是加密還是解密的時候,都需要知道秘鑰。
  • 依據(jù)秘鑰的使用方法,可以將密碼分為對稱密碼和公鑰密碼兩種。**對稱密碼:**是指在加密和解密時使用同一秘鑰的方式。非對稱密碼::也叫公鑰密碼。是指在加密和解密時使用不同秘鑰的方式。
  • 以下圖片是受威脅的特性與應(yīng)對的密碼技術(shù)

    不要使用保密的密碼算法

    主要原因有以下兩點:

  • 密碼算法的秘密早晚會公諸于眾:①從歷史上看,密碼算法的秘密最終無一例外地都會被暴露出來。1999 年, DVD 的密碼算法 被破解。2007 年,NXP 的非接觸式 1C 卡 MIFARE Classic 的密碼算法被破解。這些算法最初都是 保密的,然而研究者可以通過逆向工程的手段對其進行分析,并找到漏洞進行破解。RSA 公司開 發(fā)的 RC4 密碼算法曾經(jīng)也是保密的,但最終還是有一位匿名人士開發(fā)并公開了與其等效的程序。
    ②一旦密碼算法的詳細(xì)信息被暴露,依靠對密碼算法本身進行保密來確保機密性的密碼系統(tǒng) 也就土崩瓦解了。反之,那些公開的算法從一開始就沒有設(shè)想過要保密,因此算法的暴露絲毫 不會削弱它們的強度。

  • 開發(fā)高強度的密碼算法是非常困難的。①現(xiàn)在世界上公開的被認(rèn)為強度較高的密碼算法,幾乎都是經(jīng)過密碼破譯者長期嘗試破解未 果而存活下來的。因此,如果認(rèn)為 “公司自己開發(fā)的密碼系統(tǒng)比那些公開的密碼系統(tǒng)更強”,那只能說是過于高估自己公司的能力了。
    ② 試圖通過對密碼算法本身進行保密來確保安全性的行為,一般稱為隱蔽式安全性( securityby obscurity ), 這種行為是危險且愚蠢的。
    ③ 反過來說,將密碼算法的詳細(xì)信息以及程序源代碼全部交給專業(yè)密碼破譯者,并且為其提供大量的明文和密文樣本,如果在這樣的情況下破澤一段新的密文依然需要花上相當(dāng)長的時間, 就說明這是高強度的密碼。

  • 任何密碼總有一天都會被破解

    無論使用任何密碼算法所生成的密文,只要將所有可能的密鑰全部嘗試一遍,就總有一天 可以破譯出來。因此,破譯密文所需要花費的時間,與要保密的明文的價值之間的權(quán)衡就顯得 非常重要。

    嚴(yán)格來說,絕對不會被破解的密碼算法是存在的,這就是一次性密碼本,但它并不是一種實現(xiàn)可用的算法。還有一種技術(shù)被認(rèn)為可能造就完美的密碼技術(shù),那就是量子密碼

    對稱密碼(共享秘鑰密碼)

  • 共享秘鑰就說明這個秘鑰既可以加密有可用解密,也就是說這個操作是可以通過秘鑰還原的。而這,眾多的對稱密碼算法中,都是基于XOR操作實現(xiàn)的。因為兩次XOR操作相當(dāng)于沒有做過任何操作。
  • AES

    AES是取代前任標(biāo)準(zhǔn)(DES)而成為新標(biāo)準(zhǔn)的一種對稱密碼算法。全世界的企業(yè)和密碼學(xué)家提交了多個對稱密碼算法作為AES的候選,最終在2000年從這些候選算法中選出了一種名為“Rijndael”的對稱密碼算法,并將其確定為了AES。

  • 參加AES競選是有條件的,也就是被選為AES的密碼算法必須無條件地免費供全世界使用。
  • AES的選拔過程是對全世界公開的。像這樣通過競爭來實現(xiàn)標(biāo)準(zhǔn)化的方式,正是密碼算法選拔的正確方式。由世界最高水平的密碼學(xué)家共同嘗試破譯,依然未能找到弱點,只有這樣的事實才能證明一種密碼算法的強度。
  • 總結(jié)

  • 對稱密碼主要有DES,三重DES、AES。這幾個密碼算法,都只能將固定長度的分組進行加密。當(dāng)需要加密的明文長度超過分組長度的時候,就需要對密碼算法進行迭代了。
  • 使用一種秘鑰空間巨大,且在算法上沒有弱點的對稱密碼,就可以通過密文來確保明文的機密性。巨大的秘鑰空間能夠抵御暴力破解,算法上沒有弱點則可以抵御其他類型的攻擊。
  • 用對稱密碼進行通信時,還會出現(xiàn)秘鑰的配送問題,也就是我們?nèi)绾螌⒚罔€安全地發(fā)送給接受者。(這就需要公鑰密碼技術(shù)了)
  • 公鑰密碼 — 用公鑰加密,私鑰解密

    談?wù)勍稁偶奈锕瘛J紫?#xff0c;我們將物品放入寄物柜中。然后,投入硬幣并拔出鑰匙,就可以將寄物柜關(guān)閉了。關(guān)閉后的寄物柜,沒有鑰匙是無法打開的。也就是說,只要有硬幣,任何人都可以關(guān)閉寄物柜,但寄物柜一旦關(guān)閉,再怎么投幣也無法打開。打開寄物柜需要使用鑰匙,而不是硬幣了。
    這里,硬幣是關(guān)閉寄物柜的秘鑰(相當(dāng)于公鑰,任何人都可以知道),而鑰匙則是打開寄物柜的秘鑰(私鑰)。

    秘鑰配送問題

    首先想到的方法有如下幾種:

  • 通過事先共享秘鑰來解決。但是這個方法的局限性是比較大的。
  • 通過秘鑰分配中心來解決。該方法的局限性是,當(dāng)秘鑰增多,秘鑰分配中心的負(fù)荷也會隨之增加。同時如果秘鑰分配中心的計算機發(fā)生故障,則與之關(guān)聯(lián)的加密通信也會癱瘓。當(dāng)然,如果秘鑰分配中心被攻破的話,那么與之關(guān)聯(lián)的加密通信也會被破譯。
  • 通過迪菲-赫爾曼密鑰交換機制(Diffile-Hellman)來解決。較為具體介紹該算法是在計算機科學(xué)領(lǐng)域中里程牌式的算法這篇博客中。
  • 通過公鑰密碼來解決。
  • 公鑰密碼

    公鑰密碼中,秘鑰分為加密秘鑰和解密秘鑰兩種。發(fā)送者用機密秘鑰對消息進行加密,接收者用解密秘鑰對密文進行解密。該機制下:
    ①發(fā)送者只需要加密秘鑰。
    ②接受者只需要解密秘鑰。
    ③解密秘鑰不可以被竊聽者獲取。
    ④加密秘鑰被竊聽獲取也是沒有問題的。
    也就是說,解密秘鑰從一開始就是有接受者自己保管的,因此只需要加密秘鑰發(fā)給發(fā)送者就可以解決秘鑰配送問題了,因為這根本就不需要配送解密秘鑰。

    大概機制(RSA)可以參考這篇博客:計算機科學(xué)領(lǐng)域中里程牌式的算法](https://blog.csdn.net/qq_39838607/article/details/128757526)中的數(shù)字簽名部分,數(shù)字簽名與該算法都是RSA,只不過不一樣的是數(shù)字簽名是反過來使用了,也就是用私鑰加密,用公鑰解密。

  • 公鑰和私鑰是一一對應(yīng)的,一堆公鑰和私鑰統(tǒng)稱為密鑰對。由公鑰加密的密文,必須使用與該公鑰配對的私鑰才能解密。密鑰對中的兩個秘鑰之間有著非常密切的關(guān)系----數(shù)學(xué)上的關(guān)系-----因此公鑰和私鑰是不能分別單獨生成的。
  • 公鑰密碼的使用者需要生成一個包括公鑰和秘鑰的秘鑰對,其中公鑰會被發(fā)送給別人,而私鑰則僅供自己使用。具體流程如下圖
  • 公鑰密碼存在的問題主要有兩個:①我們需要判斷所得到的的公鑰是否正確合法,這個問題被稱之為公鑰認(rèn)證問題;②它的處理速度只要對稱密碼的幾百分之一。(一種方式就是混合使用兩種算法,使用公鑰密碼算法來傳輸對稱算法的共享公鑰(一般為會話密碼),對于明文則使用對稱算法來加密。該方式也稱為混合密碼系統(tǒng)
  • 中間人攻擊

    所謂中間人攻擊,就是主動攻擊者 Mallory 混人發(fā)送者和接收者的中間,對發(fā)送者偽裝成 接收者,對接收者偽裝成發(fā)送者的攻擊方式,在這里,Mallory就是 “中間人”

    如圖

    現(xiàn)在,發(fā)送者Alice準(zhǔn)備向接收者Bob發(fā)送一封郵件,為了解決密鑰配送問 題,他們使用了公鑰密碼。Mallory 位于通信路徑中,我們假設(shè)他能夠任意竊聽或篡改郵件的內(nèi) 容,也可以攔截郵件使對方無法接收到。

  • Alice向Bob發(fā)送郵件索取公鑰。
    “ To Bob : 請把你的公鑰發(fā)給我 D From Alice”
  • Mallory 通過竊聽發(fā)現(xiàn) Alice 在向 Bob 索取公鑰。
  • Bob 看到 Alice 的郵件,并將自己的公鑰發(fā)送給 Alice。
    “ To Alice: 這是我的公鑰。From Bob”
  • Mallory攔gBob的郵件,使其無法發(fā)送給A】iCe。然后,他悄悄地將Bob的公鑰保存
    起來,他稍 會用到Bob的公鑰。
  • Mallory 偽裝成 Bob,將自己的公鑰發(fā)送給 Alice。
    “ To Alice: 這是我的公鑰。From Bob”(其實是 Mallory )
  • Alice將自己的消息用Bob的公鑰(其實是Mallory的公鑰)進行加密。
    “ To Bob: 我愛你D From Alice”
    但是, Alice 所持有的并非 Bob 的公鑰而是 Mallory 的公鑰,因此 Alice 是用 Mallory 的 公鑰對郵件進行加密的。
  • Alice 將加密后的消息發(fā)送給 Bob。
  • Mallory 攔截 Alice 的加密郵件。這封加密郵件是用 Mallory 的公鑰進行加密的,因此
    Mallory 能夠?qū)ζ溥M行解密,于是 Mallory 就看到了 Alice 發(fā)給 Bob 的情書。
  • Mallory 偽裝成 Alice 寫一封假的郵件。
    “ To Bob: 我討厭你。From Alice”(其實是 Mallory ) 然后,他用4中保存下來的 Bob 的公鑰對這封假郵件進行加密,并發(fā)送給 Bob。
  • Bob 用自己的私鑰對收到的郵件進行解密,然后他看到消息的內(nèi)容是:
    “ To Bob : 我討厭你。From Alice” 他傷心極了。
  • 上述過程可以重復(fù)多次,Bob向Alice發(fā)送加密郵件時也可能收到同樣的攻擊,因此Bob即便要發(fā)送郵件給Alice以詢問她真正的想法,也能被修改。

    這種攻擊不僅針對RSA,而是可以針對任何公鑰密碼。在這個過程中,公鑰密碼并沒有被 破譯,所有的密碼算法也都正常工作并確保了機密性。然而,所謂的機密性并非在 Alice 和 Bob 之間,而是在 Alice 和 Mallory 之間,以及 Mallory 和 Bob 之間成立的。僅靠公鑰密碼本身,是無法抵御中間人攻擊的。我們還需要一種手段來確認(rèn)所收到的公鑰是否真的屬于Bob,這種手段被稱為認(rèn)證

    認(rèn)證

    單向散列函數(shù)— 消息的指紋

    單向散列函數(shù)有一個輸入和輸出,其中輸入消息稱為消息,輸出值稱為散列值。單向散列函數(shù)可以根據(jù)消息的內(nèi)容計算出散列值,而散列值就可以被用來檢驗消息的完整性。
    同時,散列值的長度和消息的長度無關(guān)。單向散列函數(shù)總是計算出固定長度的散列值。因此,散列值很容易處理和使用。

    單向散列值的性質(zhì)如下

  • 根據(jù)任意長度的消息計算出固定長度的散列值。
  • 能夠快速計算出散列值。
  • 消息不同散列值也不同。為了確認(rèn)完整性,消息中哪怕只有1比特的改變,也必須有很高的概率產(chǎn)生不同的散列值。兩個不同消息產(chǎn)生同一個散列值的情況稱為碰撞
  • 弱抗碰撞性指的是 要找到和該條消息具有相同散列值的另外一條消息是非常困難的。
  • 強抗碰撞性指的是 要找到散列值相同的兩條不同的消息是非常困難的。密碼技術(shù)中所使用的的單向散列函數(shù),不僅要具備弱抗碰撞性,還必須具備強抗碰撞性。
  • 具備單向性。指的是無法通過散列值反算出消息的性質(zhì)。
  • 單向散列函數(shù)的實際應(yīng)用

  • 基于口令的加密。單向散列函數(shù)也被用于基于口令的加密( Password Based Encryption , PBE )。
    PBE 的原理是將口令和鹽( salt, 通過偽隨機數(shù)生成器產(chǎn)生的隨機值 )混合后計算其散列 值,然后將這個散列值用作加密的密鑰。通過這樣的方法能夠防御針對口令的字典攻擊。
  • 消息認(rèn)證碼。使用單向散列函數(shù)可以構(gòu)造消息認(rèn)證碼。消息認(rèn)證碼是將 “發(fā)送者和接收者之間的共享密鑰” 和 “消息” 進行混合后計算出的散列 值。使用消息認(rèn)證碼可以檢測并防止通信過程中的錯誤、篡改以及偽裝。消息認(rèn)證碼在 SSL/TLS 中也得到了運用。
  • 數(shù)字簽名。在進行數(shù)字簽名時也會使用單向散列函數(shù)。
    數(shù)字簽名是現(xiàn)實社會中的簽名和蓋章這樣的行為在數(shù)字世界中的實現(xiàn)。數(shù)字簽名的處理過 程非常耗時,因此一般不會對整個消息內(nèi)容直接施加數(shù)字簽名,而是先通過單向散列函數(shù)計算 出消息的散列值,然后再對這個散列值施加數(shù)字簽名。
  • 偽隨機數(shù)生成器。使用單向散列函數(shù)可以構(gòu)造偽隨機數(shù)生成器。
    密碼技術(shù)中所使用的隨機數(shù)需要具備 “事實上不可能根據(jù)過去的隨機數(shù)列預(yù)測未來的隨機 | 數(shù)列” 這樣的性質(zhì)。為了保證不可預(yù)測性,可以利用單向散列函數(shù)的單向性。
  • —次性口令。使用單向散列函數(shù)可以構(gòu)造一次性口令(one-time password)0 一次性口令經(jīng)常被用于服務(wù) 器對客戶端的合法性認(rèn)證。在這種方式中,通過使用單向散列函數(shù)可以保證口令只在通信鏈路 上傳送一次( one-time ),因此即使竊聽者竊取了口令,也無法使用。
  • 單向散列函數(shù)無法解決的問題。

  • 使用單向散列函數(shù)可以實現(xiàn)完整性的檢查,但有些情況下即便能夠檢查完整性也是沒有意 義的。
  • 例如,假設(shè)主動攻擊者 Mallory 偽裝成 Alice, 向 Bob 同時發(fā)送了消息和散列值。這時 Bob 能夠通過單向散列函數(shù)檢查消息的完整性,但是這只是對 Mallory 發(fā)送的消息進行檢查,而無 法檢查出發(fā)送者的身份是否被 Mallory 進行了偽裝。也就是說,單向散列函數(shù)能夠辨別出 “篡 改”,但無法辨別出 "偽裝”。
  • 當(dāng)我們不僅需要確認(rèn)文件的完整性,同時還需要確認(rèn)這個文件是否真的屬于 Alice 時,僅靠完整性檢査是不夠的,我們還需要進行認(rèn)證。 用于認(rèn)證的技術(shù)包括消息驗證碼數(shù)字簽名。消息認(rèn)證碼能夠向通信對象保證消息沒有被篡改,而數(shù)字簽名不僅能夠向通信對象保證消息沒有被篡改,還能夠向所有第三方做出這樣的 保證。
  • 認(rèn)證需要使用密鑰,也就是通過對消息附加 Alice 的密鑰(只有 Alice 才知道的秘密信息 ) 來確保消息真的屬于 Alice。
  • 數(shù)字簽名的相關(guān)內(nèi)容,在我這篇博客中一致指向的博客中提到了。因此下邊主要提到的是消息認(rèn)證碼技術(shù)。

    消息認(rèn)證碼

    什么事消息認(rèn)證碼

  • 消息認(rèn)證碼(Message Authentication Code )是一種確認(rèn)完整性并進行認(rèn)證的技術(shù),取三個 單詞的首字母,簡稱為 MAC。
  • 消息認(rèn)證碼的輸人包括任意長度的消息和一個發(fā)送者與接收者之間共享的密鑰,它可以輸出固定長度的數(shù)據(jù),這個數(shù)據(jù)稱為 MAC 值。
  • 根據(jù)任意長度的消息輸出固定長度的數(shù)據(jù),這一點和單向散列函數(shù)很類似。但是單向散列 函數(shù)中計算散列值時不需要密鑰,相對地,消息認(rèn)證碼中則需要使用發(fā)送者與接收者之間共享 的密鑰。
  • 要計算 MAC 必須持有共享密鑰,沒有共享密鑰的人就無法計算 MAC 值,消息認(rèn)證碼正是 利用這一性質(zhì)來完成認(rèn)證的。此外,和單向散列函數(shù)的散列值一樣,哪怕消息中發(fā)生1比特的 變化,MAC 值也會產(chǎn)生變化,消息認(rèn)證碼正是利用這一性質(zhì)來確認(rèn)完整性的。當(dāng)然,消息認(rèn)證碼有很多種實現(xiàn)方法,不過可以暫且這樣理解:消息認(rèn)證碼是 一種與密鑰相關(guān)聯(lián)的單向散列函數(shù)

    消息認(rèn)證碼的使用步驟如下:
  • ①發(fā)送者與接受者事先共享秘鑰。(使用的方法如上述談到的,可以是公鑰密碼算法等)
    ②發(fā)送者根據(jù)消息計算MAC值(使用共享秘鑰)
    ③發(fā)送者將消息和MAC值發(fā)送給接受者。
    ④接受者根據(jù)收到的消息計算MAC值(使用共享秘鑰)
    ⑤接受者將自己計算的MAC值與從發(fā)送者的MAC值對比。
    ⑥如果兩個MAC值一致,則接受者可以斷定確實是發(fā)送者原始的消息(認(rèn)證成功);如果不一致,則就是認(rèn)證失敗。

    消息認(rèn)證碼無法解決的問題

    ??假設(shè)發(fā)送者 Alice 要向接收者 Bob 發(fā)送消息,如果使用了消息認(rèn)證碼,接收者 Bob 就能夠 斷定自己收到的消息與發(fā)送者 Alice 所發(fā)出的消息是一致的,這是因為消息中的 MAC 值只有用 Al1Ce 和 Bob 之間共享的密鑰才能夠計算出來,即便主動攻擊者 Mallory 篡改消息,或者偽裝成 Alice 發(fā)送消息,Bob 也能夠識別出消息的篡改和偽裝。

    ??但是,消息認(rèn)證碼也不能解決所有的問題,例如 “對第三方證明” 和 “防止否認(rèn)”,這兩個 問題就無法通過消息認(rèn)證碼來解決。下面我們來逐一解釋一下。

    對第三方證明

    ??假設(shè) Bob 在接收了來自 Alice 的消息之后,想要向第三方驗證者 Victor 證明這條消息的確 是 Alice 發(fā)送的,但是用消息認(rèn)證碼無法進行這樣的證明,這是為什么呢? ?’ ’
    ??首先,Victor 要校驗 MAC 值,就需要知道 Alice 和 Bob 之間共享的密鑰。
    ??假設(shè) Bob 相信 Victor,同意將密鑰告訴 Victor, 即便如此,Victor 也無法判斷這條消息是由 Alice 發(fā)送的,因為 Victor 可以認(rèn)為:“即使 MAC 值是正確的,發(fā)送這條消息的人也不一定是 Alice, 還有可能是 Bob。”
    ??能夠計算出正確MAC值的人只有Alice和Bob, 在他們兩個人之間進行通信時,可以斷定 是對方計算了 MAC 值,這是因為共享這個密鑰的雙方之中,有一方就是自己。然而,對于第
    ??三方Victor, Alice或Bob卻無法證明是對方計算了MAC值,而不是自己。 使用第 9 章中將要介紹的數(shù)字簽名就可以實現(xiàn)對第三方的證明。

    防止否認(rèn)

    ??假設(shè) Bob 收到了包含 MAC 值的消息,這個 MAC 值是用 Alice 和 Bob 共享的密鑰計算出來 的,因此 Bob 能夠判斷這條消息的確來自 Alice。
    ??但是,上面我們講過,Bob 無法向驗證者 Victor 證明這一點,也就是說,發(fā)送者 Alice 可以 向Victor聲稱:“我沒有向Bob發(fā)送過這條消息。” 這樣的行為就稱為否認(rèn)(repudiation)。
    ??Alice 可以說 “這條消息是 Bob 自己編的吧” “說不定 Bob 的密鑰被主動攻擊者 Mallory 給 盜取了,我的密鑰可是妥善保管著呢” 等。說白了,就是 Alice 和 Bob 吵起來了。
    ??即便 Bob 拿 MAC 值來舉證,Victor 也無法判斷 Alice 和 Bob 誰的主張才是正確的,也就是 說,用消息認(rèn)證碼無法防止否認(rèn)(nonrepudiation)。在這種情況下,就需要使用數(shù)字簽名就可以實現(xiàn)防止否認(rèn)了。

    通俗來說,消息認(rèn)證碼確保的是消息被正確轉(zhuǎn)送了沒有;數(shù)字簽名則是確認(rèn)消息到底是誰寫的。

    密鑰

    什么是密鑰

  • 密鑰就是一個巨大的數(shù)字。在使用對稱密碼、公開密碼、消息認(rèn)證碼、數(shù)字簽名等密碼技術(shù)使用,都需要一個稱為密鑰的巨大數(shù)字。
  • 然而,數(shù)字本身的大小并不重要,重要的是密鑰空間的大小,也就是可能出現(xiàn)的秘鑰的總數(shù)量,因為密鑰空間越大,進行暴力破解就越困難。密鑰空間的大小是由密鑰長度決定的。
  • 各種不同的密鑰

  • 對稱密碼的密鑰與公鑰密碼的密鑰。在對稱密碼中,加密和解密使用同一個密鑰。由于發(fā)送者和接受者之間需要共享密鑰,因此對稱密碼又稱為共享密鑰密碼。在公鑰密碼中,加密和解密使用的是不同的密鑰。用于加密的密鑰稱為公鑰,顧名思義它是可以被公開的;用于解密的密鑰稱為私鑰,只需要進行解密的接受者才持有私鑰。
  • 消息認(rèn)證碼的密鑰。在消息認(rèn)證碼中,發(fā)送者和接受者使用共享的密鑰來進行認(rèn)證。消息認(rèn)證碼只能由持有合法密鑰的人計算出來。將消息認(rèn)證碼附加在通信報文后面,就可以識別通信內(nèi)容是否被修改或偽裝。由于“持有合法的密鑰”就是發(fā)送者和接受者合法身份的證明,因此消息認(rèn)證碼的密鑰必須對發(fā)送者的接受者以外的人保密,否則就會產(chǎn)生修改和偽裝的風(fēng)險。
  • 數(shù)字簽名的密鑰。在數(shù)字簽名中,簽名的生成和驗證使用不同的密鑰。只有持有私鑰的本人才能夠生成簽名,但由于驗證簽名使用的是公鑰,因此任何人都能夠驗證簽名。
  • 對稱密碼和公鑰密碼的密鑰都是用于確保機密性的密鑰,如果不知道用于解密的合法密鑰,就無法得知明文的內(nèi)容
  • 消息認(rèn)證碼和數(shù)字簽名所使用的密鑰,則是用于認(rèn)證的密鑰。如果不知道合法的密鑰,就無法修改數(shù)據(jù),也無法偽裝本人的身份。
  • 會話密碼:每次通信只能使用一次的密鑰。
  • 生成密鑰主要有兩種方式:①用隨機數(shù)生成密鑰;②用口令生成密鑰。
  • 隨機數(shù) — 不可預(yù)測的源泉

    實際上,和對稱密碼、公鑰密碼、數(shù)字簽名等技術(shù)相比,生成隨機數(shù)的技術(shù)確實不是很引人注意,但是,隨機數(shù)在密碼技術(shù)中扮演者十分重要的角色。

    隨機數(shù)的性質(zhì)

    • 隨機性。不存在統(tǒng)計學(xué)的偏差,是完全雜亂的數(shù)列。
    • 不可預(yù)測性。不能從過去的數(shù)列推測出下一個數(shù)列。
    • 不可重現(xiàn)性。除非將數(shù)列本身保存下來,否則不能重現(xiàn)相同的數(shù)列。

    上面三個性質(zhì)中,越往下就越嚴(yán)格。隨機數(shù)就是依據(jù)這三個性質(zhì)的有無來進行分類的。如下圖

    隨機性

    ?? 所謂隨機性,簡單來說就是看上去雜亂無章的性質(zhì)。我們可以用偽隨機數(shù)生成器大量生成0到9范圍內(nèi)的整數(shù),然后看一看所生成的數(shù)列。如果數(shù)列是像0、1、2、3、4、5.6、7、8、 9 、0 、 1 、2…這樣不斷循環(huán)的,那肯定不是雜亂無章的。或者乍一看是雜亂無章的,但實際上 在數(shù)列中 0 —次都沒有出現(xiàn),或者整個數(shù)列中有一半都是 6, 這樣的數(shù)列也不能算是雜亂無 章的。
    ??如果偽隨機數(shù)列中不存在統(tǒng)計學(xué)偏差,則我們可以認(rèn)為這個偽隨機數(shù)列是隨機的。判斷一 個偽隨機數(shù)列是否隨機的方法稱為隨機數(shù)測試,隨機數(shù)測試的方法有很多種。
    ??一般在電腦游戲中使用的隨機數(shù)只要具備隨機性就可以了。此外,在計算機模擬中使用的 隨機數(shù)雖然需要根據(jù)目的來進行隨機數(shù)測試,但也是只要具備隨機性就可以了。然而,密碼技術(shù)中所使用的隨機數(shù),僅僅具備隨機性是不夠的。
    ??讓我們來回憶一下密碼技術(shù)中使用的隨機數(shù)需要具備怎樣的性質(zhì)。由’于隨機數(shù)會被用來生成密鑰,因此密鑰不能被攻擊者看穿。但是,雜亂無章并不代表不會被看穿

    不可預(yù)測性

    ??密碼中所使用的隨機數(shù)僅僅具備隨機性是不夠的,還需要具備避免被攻擊者看穿的不可預(yù) 測性。不可預(yù)測性在英語中叫作 unpredictability, 將這個單詞分解之后是這樣的:un( 否定 )-pre ( 之前 ) -diet ( 說 ) -ability ( 可能性 )。因此,unpredictability 就是一種 “不可能事先說中” 的性質(zhì),即不可預(yù)測性。
    ??所謂不可預(yù)測性,是指攻擊者在知道過去生成的偽隨機數(shù)列的前提下,依然無法預(yù)測出下—個生成出來的偽隨機數(shù)的性質(zhì)。其中,“在知道過去生成的偽隨機數(shù)列的前提下…” 是非常 重要的一點。
    ??現(xiàn)在我們假設(shè)攻擊者已經(jīng)知道偽隨機數(shù)生成器的算法。此外,正如攻擊者不知道密鑰一樣, 他也不知道偽隨機數(shù)的種子氣偽隨機數(shù)生成器的算法是公開的,但偽隨機數(shù)的種子是保密的。 在上述假設(shè)的前提下,即便攻擊者知道過去所生成的偽隨機數(shù)列,他也 預(yù)測出下一個生成 出來的偽隨機數(shù)— 這就是不可預(yù)測性。
    ??那么如何才能編寫出具備不可預(yù)測性的偽隨機數(shù)生成器呢?嗯,這是一個很有意思的問題。 其實,不可預(yù)測性是通過使用其他的密碼技術(shù)來實現(xiàn)的。例如,可以通過單向散列函數(shù)的單向 性和密碼的機密性來保證偽隨機數(shù)生成器的不可預(yù)測性。

    不可重現(xiàn)性

    ??所謂不可重現(xiàn)性,是指無法重現(xiàn)和某一隨機數(shù)列完全相同的數(shù)列的性質(zhì)。如果除了將隨機 數(shù)列本身保存下來以外,沒有其他方法能夠重現(xiàn)該數(shù)列,則我們就說該隨機數(shù)列具備不可重現(xiàn)性。
    ??僅靠軟件是無法生成出具備不可重現(xiàn)性的隨機數(shù)列的。軟件只能生成偽隨機數(shù)列,這是因 為運行軟件的計算機本身僅具備有限的內(nèi)部狀態(tài)。而在內(nèi)部狀態(tài)相同的條件下,軟件必然只能 生成相同的數(shù),因此軟件所生成的數(shù)列在某個時刻一定會出現(xiàn)重復(fù)。首次出現(xiàn)重復(fù)之前的數(shù)列 長度稱為周期,對于軟件所生成的數(shù)列,其周期必定是有限的。當(dāng)然,這個周期可能會很長, 但總歸還是有限的。凡是具有周期的數(shù)列,都不具備不可重現(xiàn)性。
    ??要生成具備不可重現(xiàn)性的隨機數(shù)列,需要從不可重現(xiàn)的物理現(xiàn)象中獲取信息,比如周圍的溫度和聲音的變化、用戶移動的鼠標(biāo)的位置信息、鍵盤輸入的實踐間隔等,根據(jù)從這些硬件中所獲取的信息而生成的數(shù)列,一般可以認(rèn)為是具備不可重現(xiàn)性的隨機數(shù)列。

    偽隨機數(shù)生成器

    ?隨機數(shù)可以通過硬件來生成,也可以通過軟件來生成。
    ?通過硬件生成的隨機數(shù)列,是根據(jù)傳感器收集的熱量、聲音的變化等事實上無法預(yù)測和重現(xiàn)的 自然現(xiàn)象信息來生成的。像這樣的硬件設(shè)備就稱為隨機數(shù)生成器(Random Number Generator, RNG )。
    ?而可以生成隨機數(shù)的軟件則稱為偽隨機數(shù)生成器(Pseudo Random Number Generator, PRNG)0 因為僅靠軟件無法生成真隨機數(shù),因此要加上一個 “偽” 字。

    偽隨機數(shù)生成器的結(jié)構(gòu)如下,偽隨機數(shù)生成器具有“內(nèi)部狀態(tài)”,并根據(jù)外部輸入的“種子”來生成偽隨機數(shù)列。

    偽隨機生成器的具體實現(xiàn)有主要有如下幾種

  • 雜亂的方法。不推薦
  • 線性同余法。該方法不具備不可預(yù)測性,因此不能用于密碼技術(shù)。但是很多偽隨機數(shù)生成器的庫函數(shù)都是采用該方法編寫的。例如c語言的庫函數(shù)rand,以及Java的java.util.Random類等。
  • 單向散列函數(shù)法。該方法中,單向散列函數(shù)的單向性是支撐偽隨機數(shù)生成器不可預(yù)測的基礎(chǔ)。
  • 密碼法。密碼的機密性是支撐偽隨機數(shù)生成器不可預(yù)測性的基礎(chǔ)。
  • 密碼技術(shù)與實現(xiàn)社會

    密碼技術(shù)小結(jié)

    6中基本的密碼技術(shù)

  • 對稱密碼是一種用相同的密鑰進行加密和解密的技術(shù),用于確保消息的機密性。在對稱密 碼的算法方面,目前主要使用的是 AES。盡管對稱密碼能夠確保消息的機密性,但需要解決將 解密密鑰配送給接收者的密鑰配送問題。
  • 公鑰密碼是一種用不同的密鑰進行加密和解密的技術(shù),和對稱密碼一樣用于確保消息的機 密性。使用最廣泛的一種公鑰密碼算法是 RSA, 除此之外還有 ElGamal 和 Rabin 等算法,以及 與其相關(guān) Diffie-Hellman 密鑰交換(DH )和橢圓曲線 Dffie-Hellman 密鑰交換(ECDH )等技術(shù)。 和對稱密碼相比,公鑰密碼的速度非常慢,因此一般都會和對稱密碼一起組成混合密碼系統(tǒng)來 使用。公鑰密碼能夠解決對稱密碼中的密鑰交換問題 , 但存在通過中間人攻擊被偽裝的風(fēng)險 , 因此需要對帶有數(shù)字簽名的公鑰迸行認(rèn)證。
  • 單向散列函數(shù)是一種將長消息轉(zhuǎn)換為短散列值的技術(shù),用于確保消息的完整性。在單向散 列函數(shù)的算法方面,SHA-1曾被廣泛使用,但由于人們已經(jīng)發(fā)現(xiàn)了一些針對該算法的理論上可 行的攻擊方式,因此該算法不應(yīng)再被用于新的用途。今后我們應(yīng)該主要使用的算法包括目前已 經(jīng)在廣泛使用的SHA-2(SHA-224、SHA-256、SHA-384、SHA-512),以及具有全新結(jié)構(gòu)的 SHA-3 ( Keccak )算法。單向散列函數(shù)可以單獨使用,也可以作為消息認(rèn)證碼、數(shù)字簽名以及 偽隨機數(shù)生成器等技術(shù)的組成元素來使用。
  • 消息認(rèn)證碼是一種能夠識別通信對象發(fā)送的消息是否被篡改的認(rèn)證技術(shù),用于驗證消息的完整性,以及對消息進行認(rèn)證。消息認(rèn)證碼的算法中,最常用的是利用單向散列函數(shù)的 HMAC。HMAC 的構(gòu)成不依賴于某一種具體的單向散列函數(shù)算法。消息認(rèn)證碼能夠?qū)νㄐ艑ο?進行認(rèn)證,但無法對第三方進行認(rèn)證。此外,它也無法防止否認(rèn)。消息認(rèn)證碼也可以用來實現(xiàn) 認(rèn)證加密。
  • 數(shù)字簽名是一種能夠?qū)Φ谌竭M行消息認(rèn)證,并能夠防止通信對象做出否認(rèn)的認(rèn)證技術(shù)。 數(shù)字簽名的算法包括 RSA、ElGamal、DSA、橢圓曲線 DSA ( ECDSA )、愛德華茲曲線 DSA( EDDSA)等。公鑰基礎(chǔ)設(shè)施(PKI)中使用的證書,就是對公鑰加上認(rèn)證機構(gòu)的數(shù)字簽名所構(gòu)成的。要驗證公鑰的數(shù)字簽名,需要通過某種途徑獲取認(rèn)證機構(gòu)自身的合法公鑰。
  • 偽隨機數(shù)生成器是一種能夠生成具備不可預(yù)測性的比特序列的技術(shù),由密碼和單向散列函數(shù)等技術(shù)構(gòu)成。偽隨機數(shù)生成器用于生成密鑰、初始化向量和 nonce 等。
    如下圖
  • 密碼技術(shù)與壓縮技術(shù)

    如下圖

    ??無論是對稱密碼還是公鑰密碼,密碼的作用都是確保機密性。由于確保較長的明文整體的 機密性很困難,因此我們用密碼將明文轉(zhuǎn)換成密文。這樣一來,我們就不必保護明文本身了。 相對地,我們則需要保護加密時所使用的密鑰。通過保護較短的密鑰來保護較長的明文,這樣 的做法可以稱為機密性的壓縮。
    ??單向散列函數(shù)是用于確認(rèn)完整性的。我們不必檢查較長的明文的完整性,只要檢查散列值 就能夠確認(rèn)完整性了。通過檢查較短的散列值來確認(rèn)較長的明文的完整性,這樣的做法可以稱為完整性的壓縮。
    ??消息認(rèn)證碼和數(shù)字簽名都是用于認(rèn)證的技術(shù) , 但我們并不是直接對較長的消息本身進行認(rèn) 證, 而是通過將較長的消息與密鑰結(jié)合起來,生成較短的比特序列(認(rèn)證符號 ),再通過認(rèn)證符 號進行認(rèn)證。在消息認(rèn)證碼中,MAC 值就是認(rèn)證符號;而在數(shù)字簽名中,簽名就是認(rèn)證符號。 通過較短的認(rèn)證符號來對較長的消息進行認(rèn)證,這樣的做法可以稱為認(rèn)證的壓縮
    ??那么偽隨機數(shù)生成器又是怎樣的呢?在偽隨機數(shù)生成器中,所生成數(shù)列的不可預(yù)測性是非常重要的。要大量生成具備不可預(yù)測性的隨機數(shù)列非常困難,于是我們通過將種子輸人偽隨機數(shù)生成器,生成具備不可預(yù)測性的偽隨機數(shù)列。也就是說,為了對偽隨機數(shù)列賦予不可預(yù)測性,我們使用了隨機數(shù)種子,這可以稱為不可預(yù)測性的壓縮。反過來說,偽隨機數(shù)生成器是將種子所具備的不可預(yù)測性進行了擴張

    這里的觀點很重要,因此我們從另一個角度來總結(jié)一下。
    ? 密鑰是機密性的精華
    ? 散列值是完整性的精華
    ? 認(rèn)證符號(MAC值和簽名)是認(rèn)證的精華
    ? 種子是不可預(yù)測性的精華
    如下表

    比特幣

    ?比特幣之 所以能夠成為一種流通的貨幣,完全依賴于全世界所有比特幣用戶組成的 P2P 網(wǎng)絡(luò) ( Peer to Peer Network)。也就是說,全世界所有比特幣用戶的計算機(node或者peer)共同保存、驗證 和使用支撐比特幣體系的所有必要信息。
    ?與其說比特幣是一種貨幣,不如說比特幣是一種基于 P2P 網(wǎng)絡(luò)的支付結(jié)算系統(tǒng),這樣更易 于人們理解其本質(zhì)。比特幣用戶通過使用比特幣這一支付結(jié)算系統(tǒng)實現(xiàn)了價值的轉(zhuǎn)移,因此比 特幣看上去才具備了貨幣的特征。

  • 比特幣交易是在比特幣地址之間完成的。流程如下:①商店生成地址B;②商店將地址B告訴購買者;③購買者生成地址A;④購買者從地址A向地址B支付貸款。比特幣中使用的地址是由公鑰的散列值生成的。
  • 區(qū)塊鏈

    區(qū)塊鏈就是保存比特幣全部交易記錄的公共賬簿。全世界使用比特幣進行的所有交易被記錄在一本公共賬簿中。顧名思義,區(qū)塊鏈即使將交易以區(qū)塊為單位組織起來的。

    區(qū)塊的添加。比特幣的首付款是以交易為單位來進行的,若干條交易會合并為一個區(qū)塊,并被添加到區(qū)塊鏈中。當(dāng)P2P網(wǎng)絡(luò)確認(rèn)區(qū)塊的添加后,相應(yīng)的交易也就成立了。如下圖:
    1. 一個區(qū)塊是由若干條交易以及一個區(qū)塊頭所組成的,區(qū)塊頭中保存了 “上一個區(qū)塊的區(qū)塊 頭的散列值”。以圖 15-4 中的區(qū)塊 2 為例,其中區(qū)塊頭 2 中保存的散列值 H2 就是根據(jù)它前面的 區(qū)塊 1 的區(qū)塊頭 1 計算出來的。
    2. 此外,區(qū)塊頭中還保存著 “本區(qū)塊所有交易的整體散列值” 例如,區(qū)塊頭2中的散列值 T2 就是根據(jù)區(qū)塊 2 中記錄的所有交易數(shù)據(jù)計算出的散列值。
    3. 區(qū)塊頭中還保存著一個名為 nonce 的任意數(shù)值,以及時間戳(圖中省略 )等信息。
    4. 假設(shè)區(qū)塊 2 中記錄的某一條交易中的 1 個比特被修改,那么散列值 T2 就需要重新計算,這 樣一來區(qū)塊頭2的內(nèi)容就會發(fā)生變化,因此區(qū)塊頭3中的散列值H3也需要重新計算。也就是 說,一旦對區(qū)塊鏈中的數(shù)據(jù)進行任何改動,都需要重建所改動的區(qū)塊之后的所有區(qū)塊的數(shù)據(jù)。 由此可見,區(qū)塊頭中的兩個散列值有效增加了篡改區(qū)塊鏈數(shù)據(jù)的難度。

    挖礦

    交易成立的前提是一方必須擁有一定量的比特幣。那么比特幣是如何擁有的呢?

  • 隨著全世界的比特幣交易不斷增加,區(qū)塊鏈也會隨之不斷增長,這就意味著 P2P 網(wǎng)絡(luò)中的“某個人” 在負(fù)責(zé)將新的區(qū)塊添加到區(qū)塊鏈。有趣的是,“將新的區(qū)塊添加到區(qū)塊鏈” 這一行為,正好就相當(dāng)于 “創(chuàng)造新的比特幣余額”。向區(qū)塊鏈中添加區(qū)塊就好像從金礦中挖出比特幣一樣, 因此稱為挖礦( mining ),而從事挖礦的人則稱為礦工(miner )。
  • 由于區(qū)塊鏈?zhǔn)且粭l單鏈,因此在某個特定的時間點只能向其中添加一個區(qū)塊。按照比特幣 協(xié)議的規(guī)定,成功將區(qū)塊添加到區(qū)塊鏈的礦工將獲得挖礦獎勵(reward )以及該區(qū)塊所有交易的 手續(xù)費(transactionfee)。2015年,每個區(qū)塊的挖礦獎勵25BTC(約75萬日元)
  • 為了防止比特幣被偽造,礦工必須證明自己確實完成了規(guī)定量的工作,這種證明稱為工作 量證明( Proof of Work, PoW )。工作量證明是通過散列值來實現(xiàn)的。
  • 要向區(qū)塊鏈添加新的區(qū)塊,礦工需要生成合法的區(qū)塊頭,而且區(qū)塊頭中 “前一區(qū)塊的散列 值” 的格式是有規(guī)定的,它的前面若干個比特必須為0。例如,如下的散列值H2可能是下面這樣的值。000000000000000007780B6F7817C431309EDED44F51223352D86A4436023913
  • 區(qū)塊頭中之所以需要一個稱為 nonce 的任意數(shù)值,就是為了湊出像上面這樣前面若干比特 都是0的散列值。也就是說,礦工需要不斷更換 nonce 進行嘗試,直到計算出符合要求的散列值為止。
  • 這個過程實際上和暴力破解單向散列函數(shù)十分相似。當(dāng)然,這只是為了證明某個礦工確實 投人了大量的計算資源來完成工作,而并不是真的為了去攻擊單向散列函數(shù)。比特幣系統(tǒng)中大 約每10分鐘會添加一個新的區(qū)塊,為了保持這樣的恒定速率,計算的難度(即所需的0的個數(shù) )會不斷地被調(diào)整。
  • 總結(jié)

    以上是生活随笔為你收集整理的密码学技术导论篇的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。