Java加解密與數字簽名
Java加解密與數字簽名
2016-08-30 蕊蕊 java編程
**
Java加解密
**
實現方式:JDK實現,CC,BC
JDK提供比較基礎的底層的實現;CC提供一些簡化的操作;BC提供補充
一、Base64加密
非常簡單,加密解密就一個函數。
代碼如下:
二、消息摘要算法加密————主要用於驗證數據完整性。
MD(消息摘要):
SHA(安全散列)
JDK實現和MD一樣。
BC實現如下:(Digest類)
CC實現最簡單(就是一個DigestUtils的靜態方法):
MAC(消息認證碼)——含有密鑰的散列函數算法
兼容MD和SHA的特性,但加入了密鑰。
主要JDK和Bouncy Castle實現。
JDK實現:獲取或定義密鑰(byte[]數組),Mac類 實例化、初始化、執行。
BC實現:Hmac類 實例化、初始化、執行。
三、對稱加解密
對稱加密指加密和解密使用相同密鑰的加密算法。這裏將介紹DES、3重DES、AES和PBE幾種常見的對稱加密算法在Java中的實現。
DES、3DES、AES(密鑰)、PBE(口令和鹽)
DES:
JDK實現:生成並轉換Key;Cipher類的實例化(getInstance)、初始化(init選擇模式與Key);執行(doFinal)加解密。
推薦BC實現方式:Security.addProvider(new BouncyCastleProvider());
然後剩下的代碼就可以和JDK實現代碼基本一樣了。
3DES、AES實現基本一樣,所以就不一一介紹。。。
PBE(基於口令的加密)
特點:通過 salt + 口令
實現:初始化鹽;生成口令;Cipher類加解密。
四、非對稱加解密
非對稱加密算法是一種基於密鑰的保密方法,需要公開密鑰和私有密鑰,在文件加密、尤其是網銀中應用廣泛。這裏主要介紹非對稱加密算法的實現過程,DH、RSA和ELGamal等幾種常見的非對稱加密算法的在Java中的應用。
概念:公鑰、私鑰;
DH(密鑰交換算法):
代碼實現有些麻煩
——初始化發送方密鑰
-KeyPairGenerator :能產生KeyPair
-KeyPair :常用的密鑰載體,稱為密鑰對,分為公鑰PublicKey與私鑰PrivateKey。
-PublicKey
——初始化接收方密鑰
-KeyFactory :密鑰工廠,生成密鑰,通過某種密鑰的規範來還原密鑰
-X509EncodedKeySpec :根據ASN.1進行密鑰編碼
-DHPublicKey :
-DHParameterSpec :遵從DH算法發參數的集合
-KeyPairGenerator :
-PrivateKey :
——雙發根據公布的對方的PublicKey構建本地密鑰,
——構建出來的本地密鑰是一致的
-KeyAgreement :用來提供密鑰一致性協議
-SecretKey :秘密密鑰,對稱
-KeyFactory -X509EncodedKeySpec -PublicKey
——加密、解密(利用本地密鑰)
-Cipher :為加密和解密提供密碼功能的類
解釋:
首先,發送方產生密鑰對,並公開 公鑰;接收方根據這個公鑰產生密鑰對,然後也公開自己的 公鑰。
然後,發送方根據接收方的 公鑰 產生自己本地的密鑰(本地密鑰一般是采用對稱密鑰),接收方也根據發送方的 公鑰 產生自己本地的密鑰。其實,這樣雙方產生的本地密鑰是相同的。
最後,雙方就可以利用本地密鑰進行加解密了。
RSA(基於因子分解):代碼實現較為簡單
初始化密鑰(包含公鑰、密鑰)。
可以利用公鑰加密,私鑰解密;也可以私鑰加密,公鑰解密
使用過程:雙方分別掌握公鑰與私鑰中的一種,然後就可以加密並傳輸數據了。
EIGamal(基於離散因數)
JDK沒有實現,只能利用BC實現。
首先,Security.addProvider(new BouncyCastleProvider());
之後實現類似於RSA。
五.Java實現數字簽名
數字簽名用於鑒別數字信息,公鑰和私鑰,私鑰對數據簽名,公鑰用於檢驗。
過程為:首先初始化一個密鑰對,在密鑰對的基礎上進行簽名與驗證。
1、RSA:既可以加解密,也可以數字簽名。
初始化密鑰對:KeyPairGenerator、KeyPair、RSAPublic、PSAPrivate;
執行簽名;Signature類
驗證簽名;Signature類
2、DSA(數字簽名算法)
初始化密鑰對,公鑰、私鑰;
執行簽名,用私鑰簽名;
驗證簽名,用公鑰驗證;
3、ECDSA
微軟序列號便是采用的ECDSA算法進行的簽名。速度快,強度高,簽名短。
初始化密鑰對;
執行簽名;
驗證簽名
Java加解密與數字簽名