看完秒懂對稱加密、非對稱加密、數字簽名

對稱加密算法

對稱加密(也叫私鑰加密)指加密和解密使用相同密鑰的加密算法。有時又叫傳統密碼算法,就是加密密鑰能夠從解密密鑰中推算出來,同時解密密鑰也可以從加密密鑰中推算出來。而在大多數的對稱算法中,加密密鑰和解密密鑰是相同的,所以也稱這種加密算法爲祕密密鑰算法或單密鑰算法。它要求發送方和接收方在安全通信之前,商定一個密鑰。對稱算法的安全性依賴於密鑰,泄漏密鑰就意味着任何人都可以對他們發送或接收的消息解密,所以密鑰的保密性對通信的安全性至關重要。

對稱加密算法的特點是算法公開、計算量小、加密速度快、加密效率高。

不足之處是,交易雙方都使用同樣鑰匙,安全性得不到保證。此外,每對用戶每次使用對稱加密算法時,都需要使用其他人不知道的惟一鑰匙,這會使得發收信雙方所擁有的鑰匙數量呈幾何級數增長,密鑰管理成爲用戶的負擔。對稱加密算法在分佈式網絡系統上使用較爲困難,主要是因爲密鑰管理困難,使用成本較高。而與公開密鑰加密算法比起來,對稱加密算法能夠提供加密和認證卻缺乏了簽名功能,使得使用範圍有所縮小。在計算機專網系統中廣泛使用的對稱加密算法有DES和IDEA等。美國國家標準局倡導的AES即將作爲新標準取代DES。

常用加密算法有 DES算法,3DES算法,TDEA算法,Blowfish算法,RC5算法,IDEA算法等等。

在java中,生成祕鑰類爲 KeyGenerator,祕鑰對象類爲 SecretKey,首先定義祕鑰算法:
public static final StringKEY_ALGORITHM ="AES";

然後生成一個祕鑰,代碼爲:
看完秒懂對稱加密、非對稱加密、數字簽名

生成祕鑰測試代碼爲:
看完秒懂對稱加密、非對稱加密、數字簽名

執行結果爲:
看完秒懂對稱加密、非對稱加密、數字簽名

可以看到生成祕鑰java中已經有對應方法,使用非常簡單。

非對稱加密模式有兩種,ECB和CBC。ECB模式是分組的模式,CBC是分塊加密後,每塊與前一塊的加密結果異或後再加密。
首先定義兩種模式:

public static final String ECB_CIPHER_ALGORITHM ="AES/ECB/PKCS5Padding";
public static final String CBC_CIPHER_ALGORITHM ="AES/CBC/PKCS5Padding";

ECB模式的加密解密代碼如下:
看完秒懂對稱加密、非對稱加密、數字簽名

測試代碼爲:
看完秒懂對稱加密、非對稱加密、數字簽名

運行結果爲:

看完秒懂對稱加密、非對稱加密、數字簽名

CBC模式需要一個IV(Initialization Value)初始值,對於CBC模式來說,它必須是隨機選取並且需要保密的,而且它的長度和密碼分組相同(比如:對於AES 128爲128位,即長度爲16的byte類型數組),定義如下:

public static final byte[]IVPARAMETERS =new byte[] {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 };

CBC模式加密解密代碼爲:
看完秒懂對稱加密、非對稱加密、數字簽名

測試代碼爲:

看完秒懂對稱加密、非對稱加密、數字簽名

運行結果爲:
看完秒懂對稱加密、非對稱加密、數字簽名

可以看到,對稱加密的使用非常簡單。以上就是對稱加密的簡單使用。

項目代碼:https://github.com/guoyb1990/btc-demo.git
非對稱加密算法

非對稱加密算法是一種密鑰的保密方法。

非對稱加密算法需要兩個密鑰:公開密鑰(publickey)和私有密鑰(privatekey)。公開密鑰與私有密鑰是一對,如果用公開密鑰對數據進行加密,只有用對應的私有密鑰才能解密;如果用私有密鑰對數據進行加密,那麼只有用對應的公開密鑰才能解密。因爲加密和解密使用的是兩個不同的密鑰,所以這種算法叫作非對稱加密算法。 非對稱加密算法實現機密信息交換的基本過程是:甲方生成一對密鑰並將其中的一把作爲公用密鑰向其它方公開;得到該公用密鑰的乙方使用該密鑰對機密信息進行加密後再發送給甲方;甲方再用自己保存的另一把專用密鑰對加密後的信息進行解密。
另一方面,甲方可以使用乙方的公鑰對機密信息進行簽名後再發送給乙方;乙方再用自己的私匙對數據進行驗籤。
甲方只能用其專用密鑰解密由其公用密鑰加密後的任何信息。 非對稱加密算法的保密性比較好,它消除了最終用戶交換密鑰的需要。

非對稱密碼體制的特點:算法強度複雜、安全性依賴於算法與密鑰但是由於其算法複雜,而使得加密解密速度沒有對稱加密解密的速度快。對稱密碼體制中只有一種密鑰,並且是非公開的,如果要解密就得讓對方知道密鑰。所以保證其安全性就是保證密鑰的安全,而非對稱密鑰體制有兩種密鑰,其中一個是公開的,這樣就可以不需要像對稱密碼那樣傳輸對方的密鑰了。這樣安全性就大了很多。

JDK6以上都支持非對稱加密算法,非對稱加密需要一對公私鑰,首先生成公私鑰對:

看完秒懂對稱加密、非對稱加密、數字簽名

測試代碼如下:

看完秒懂對稱加密、非對稱加密、數字簽名

執行可以看到,運行成功。

非對稱可以用私鑰加密,然後用公鑰解密,方法如下:

看完秒懂對稱加密、非對稱加密、數字簽名

測試方法如下:

看完秒懂對稱加密、非對稱加密、數字簽名

運行結果如下:
看完秒懂對稱加密、非對稱加密、數字簽名

非對稱還可以用公鑰加密,私鑰解密,如下:
看完秒懂對稱加密、非對稱加密、數字簽名

測試代碼如下:
看完秒懂對稱加密、非對稱加密、數字簽名

運行結果如下:

看完秒懂對稱加密、非對稱加密、數字簽名

可以看到,非對稱加密使用非常簡單。

項目代碼:https://github.com/guoyb1990/btc-demo.git
數字簽名

數字簽名(又稱公鑰數字簽名、電子簽章)是一種類似寫在紙上的普通的物理簽名,但是使用了公鑰加密領域的技術實現,用於鑑別數字信息的方法。一套數字簽名通常定義兩種互補的運算,一個用於簽名,另一個用於驗證。

數字簽名,就是隻有信息的發送者才能產生的別人無法僞造的一段數字串,這段數字串同時也是對信息的發送者發送信息真實性的一個有效證明。

數字簽名是非對稱密鑰加密技術與數字摘要技術的應用。

簡單說,非對稱加密可以防止數據被破解,數字簽名可以防止數據被篡改。

上一篇文章中,已經介紹的基本的非對稱加密解密。數字簽名算法,JDK只提供了MD2withRSA, MD5withRSA, SHA1withRSA,其他的算法需要第三方包才能支持。

首先看一下簽名和驗證簽名的方法:

看完秒懂對稱加密、非對稱加密、數字簽名

看完秒懂對稱加密、非對稱加密、數字簽名

在上一篇的非對稱加密中,加入下面兩個方法:

看完秒懂對稱加密、非對稱加密、數字簽名

然後在測試類中驗證數字簽名,首先建立兩套公鑰私鑰:

看完秒懂對稱加密、非對稱加密、數字簽名

然後用簽名的私鑰進行簽名,用加密的公鑰進行加密:

看完秒懂對稱加密、非對稱加密、數字簽名

最後進行解密和驗證:

看完秒懂對稱加密、非對稱加密、數字簽名

運行測試方法,結果如下:

看完秒懂對稱加密、非對稱加密、數字簽名

以上就是數字簽名的簡單運用。

我們不僅可以對原文進行加密和簽名,爲了傳輸方便,還可以用Base64進行編碼解碼,這樣中間過程的數據也可以進行處理。此處不再演示。

項目代碼:https://github.com/guoyb1990/btc-demo.git

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章