- 密碼學原理與Java實現
- 朱文偉 李建英
- 2751字
- 2023-08-10 17:59:50
第1章 加解密和Java概述
1.1 密碼學基礎知識
1.1.1 密碼學概述
密碼學(cryptography)是一種將信息表述為不可讀的方式,并使用一種秘密的方法將信息恢復出來的科學。密碼學提供的最基本的服務是數據機密性服務,就是使通信雙方可以互相發送消息,并且避免他人竊取消息的內容。加密算法是密碼學的核心。
無論加密系統實現的算法如何不同、形式如何復雜,其基本組成部分是相同的,通常都包括四個部分:
(1)需要加密的初始消息,即明文M。
(2)用于加密或解密的鑰匙,即密鑰K。
(3)加密算法E或者解密算法D。
(4)加密后形成的消息,即密文C。
C=Ek(M)表示對明文M使用密鑰K加密后得到密文C;同樣,M=Dk(C)表示對密文C解密后得到明文M,加解密過程如圖1-1所示。

圖1-1
1.1.2 對稱密鑰加密技術
對稱密鑰加密技術又稱為傳統密鑰加密技術,它是指在一個加密系統中通信雙方使用同一密鑰,或者能夠通過一方的密鑰推導出另一方的密鑰的加密體制。對稱密鑰加密技術的模型如圖1-2所示。

圖1-2
在使用對稱密鑰加密時,信息交互的雙方必須使用同一個密鑰,并且這個密鑰還要防止被他人竊取。另外,還要經常對所使用的密鑰進行更新,以減少攻擊者獲取密鑰的概率。因此,對稱密鑰加密技術的安全性依賴于密鑰分配技術。
對稱密鑰加密技術的特點在于效率高、算法簡單、易于實現、計算開銷小,適合于對大量數據進行加密。它的最大缺點是密鑰的安全性得不到保證,易被攻擊。所以,密鑰分發、密鑰保存、密鑰管理都是對稱密鑰加密的缺點。在實際應用中,常用的對稱密鑰加密技術有DES算法、AES算法等。
DES算法:數據加密標準(Data Encryption Standard),是由IBM公司研制的一種加密算法。DES是一個分組加密算法,以64位為分組對數據加密。加密和解密使用的是同一個密鑰。它的密鑰長度是56位。64位的明文從算法的一端輸入,經過左右部分的迭代和密鑰的異或、置換等一系列操作,從另一端輸出。
AES算法:高級加密標準(Advanced Encryption Standard),是由美國國家標準技術協會(NIST)在2001年發布的。AES也是一種分組密碼,用以取代DES。AES作為新一代的安全加密標準,集合了強安全性、高性能、高效率、易用和靈活等優點,其分組長度為128位,密鑰長度為128位、192位或256位。
1.1.3 公開密鑰加密技術
公開密鑰加密技術又稱為非對稱密鑰加密技術,與對稱密鑰加密技術不同,它使用一對密鑰分別進行加密和解密操作,其中一個是公開密鑰(Public-Key),另一個是由用戶自己保存(不能公開)的私有密鑰(Private-Key),發送方用公鑰或私鑰進行加密,接收方使用私鑰或公鑰進行解密。公鑰加密的模型如圖1-3所示。

圖1-3
使用公鑰加密技術,通信雙方事先不需要通過通信信道進行密鑰交換,并且公鑰是公開的,因此密鑰的持有量得到了減少,密鑰保存量少,密鑰分配簡單,便于密鑰的分發與管理。常用的公開密鑰加密算法有RSA算法、DH算法等。
當前應用最為廣泛的公鑰系統RSA(Rivest、Shamir、Adleman三人名字的縮寫)是基于大數因子分解的復雜性來構造的,它是公鑰系統最典型的加密算法,大多數使用公鑰加密技術進行加密和數字簽名的實際應用都是使用的RSA算法。RSA算法如下:
(1)用戶選擇兩個足夠大的保密素數p、q。
(2)計算n=pq,n的歐拉函數為F(n)=(p-1)(q-1)。
(3)選擇一個相對比較大的整數e作為加密指數,使e與F(n)互素。
(4)解方程:ed=1modF(n),求出解密指數d。
(5)設M、C分別為要加密的明文和已被加密的密文;加密運算為C=Me mod n,解密運算為M=Cd mod n。
每個用戶都有一個密鑰(e,d,n),(e,n)是可以公開的密鑰PK,(d,n)是用戶保密的密鑰PR,e是加密指數,d是解密指數。RSA算法的兩個密鑰中的任何一個都可用來加密,另一個用來解密。
RSA算法的安全性基于數論中大數分解為質因子的困難性,從一個公開密鑰加密的密文和公鑰中推導出明文的難度,等價于分解兩個大素數的乘積??梢姺纸庠嚼щy,算法的安全性就越高。
DH(Diffie-Hellman)算法是最早的公鑰算法,實質上是一個通信雙方進行密鑰協定的協議,它的用途僅限于密鑰交換。DH算法的安全性依賴于計算離散對數的難度,離散對數的研究現狀表明所使用的DH密鑰至少需要1024位才能保證算法的安全性。
1.1.4 單向散列函數算法
單向散列函數算法也稱為報文摘要函數算法,使用單向的散列函數,其實現過程是從明文到密文不可逆的過程。其實就是只能加密而不能將其還原,即理論上無法通過反向運算得到原始數據內容。因此,單向散列函數算法通常只用來進行數據完整性驗證。
單向散列函數表達式為h=H(M),其中M是一個變長消息,H(M)是定長的散列值。消息正確時,將散列值附于發送方的消息后,接收方通過重新計算散列值認證該消息。散列函數必須具有下列性質:
(1)M可應用于任意大小的數據塊。
(2)H產生定長的輸出。
(3)對任意給定的M,計算H(M)比較容易,用硬件和軟件均可實現。
(4)對任意給定的散列碼h,找到滿足H(M)=h的M在計算上是不可行的,稱之為單向性。
(5)對任何給定的分組M,找到滿足N不等于M且H(M)=H(N)的N在計算上是不可行的,稱之為抗弱碰撞性。
(6)找到任何滿足H(M)=H(N)的(M,N)在計算上是不可行的,稱之為抗強碰撞性。
由于單向函數在速度上比對稱加密算法還快,因此它被廣泛應用,是數字簽名和消息驗證碼(MAC)的基礎,常用的單向散列函數算法有MD5和SHA-1等。
1.1.5 數字簽名基礎知識
數字簽名是指通過某種密碼運算生成一系列符號及代碼組成電子密碼進行簽名的過程。數字簽名是一種認證機制,以公鑰技術和單向散列函數為基礎,使得消息的產生都可以添加一個起簽名作用的標識。數字簽名是目前電子商務中應用最普遍、可操作性最強、技術最成熟的一種電子簽名方法,采用規范化的程序和科學的方法,用于鑒定簽名人的身份以及對一項電子簽名內容的認證。簽名保證了消息的來源和完整性,即數字簽名能驗證出數據在傳輸過程中有無改變,確保傳輸電子文件的完整性、真實性和不可替代性。數字簽名的過程如圖1-4所示。

圖1-4
數字簽名的實現有下列幾個步驟:
(1)發送方使用摘要函數(如MD5)對信息M生成消息摘要MD5(M)。
(2)發送方使用自己的私鑰,用某種數字簽名算法來簽名消息摘要(用私鑰對摘要進行加密),得到數字簽名。
(3)發送方把消息M和數字簽名一起發送給接收方。
(4)接收方通過使用與發送方同一個摘要函數對接收的消息生成新的摘要。與第一步中生成的摘要進行對比,如果一致,就說明收到的消息沒有被修改過;再使用發送方的公鑰對數字簽名解密來驗證發送方的簽名。
由數字簽名的過程可以看出,數字簽名很好地保證了如下幾個方面的安全性:
(1)完整性:摘要函數算法實現的是不可逆的過程,如果消息在傳輸過程中遭到破壞或被竊取,接收方根據接收到的報文還原出來的消息摘要不同于用公鑰解密得出來的摘要,這樣保證了數據在傳輸過程中的安全性。
(2)不可否認性:由于公鑰與私鑰是一一對應的關系,發送方的私鑰只有自己知道,因此它不能否認已發送的消息。
(3)認證:由于公鑰和私鑰是一一對應的關系,因此接收方用發送方的公鑰計算出來的摘要跟發送方生成的摘要是一致的,這樣就能證明消息一定是該發送方發送出來的。
- 數據科學實戰手冊(R+Python)
- Mastering NetBeans
- Android應用程序開發與典型案例
- CMDB分步構建指南
- Python從菜鳥到高手(第2版)
- C語言程序設計基礎與實驗指導
- 網店設計看這本就夠了
- Elasticsearch for Hadoop
- Mastering Apache Spark 2.x(Second Edition)
- Python面向對象編程:構建游戲和GUI
- Android Native Development Kit Cookbook
- Salesforce Reporting and Dashboards
- Programming with CodeIgniterMVC
- QGIS Python Programming Cookbook(Second Edition)
- Learning Hadoop 2