- 論壇徽章:
- 0
|
Java加密擴展基礎(chǔ)——轉(zhuǎn)
實現(xiàn)細節(jié)
JCE API由很多類和接口組成。它們具有若干種算法和安全特性。本文首先討論常用的對稱算法數(shù)據(jù)加密標準DES(Data Encryption Standard)。
產(chǎn)生密鑰
程序清單D 說明了如何初始化KeyGenerator和產(chǎn)生密鑰。
為了生成密鑰,我們首先得獲得KeyGenerator的一個實例。這可以由調(diào)用KeyGenerator類的靜態(tài)方法getInstance完成。我們用普通的、不帶模式或者方案的DES算法?蛇x地,你可以如下所示傳遞參數(shù):
DES/ECB/PKCS5Padding
這樣就提供了帶ECB(電子密碼本)模式和PKCS#5補充風格的DES算法。你還可以傳遞第2個字符串參數(shù)指定要使用的供應(yīng)者實現(xiàn),不過這并不是必需的:
KeyGenerator kg = KeyGenerator.getInstance("DES" ;
獲得自己的KeyGenerator,之后就可以調(diào)用generateKey方法獲得我們的密鑰:
Key key = kg.generateKey();
產(chǎn)生密碼
我們采用生成密鑰相同的方式生成一個密碼。我們必須調(diào)用Cipher類的靜態(tài)方法getInstance。該方法的參數(shù)同KeyGenerator完全一樣:
Cipher cipher = Cipher.getInstance(“DES”);
程序清單E 顯示了有關(guān)的操作程序。
數(shù)據(jù)加密和解密
加密是在字節(jié)級別上進行的,所以數(shù)據(jù)的各個方面一個不落全都會被加密。一旦獲得了密鑰和密碼,你就可以對數(shù)據(jù)進行安全操作了。值得注意的是密鑰和密碼必須采用同類算法。你不能用DESede初始化密鑰卻用DES初始化密碼。Cipher對象采用同樣的方法對數(shù)據(jù)加密和解密,所以你必須首先對其初始化以便它知道對數(shù)據(jù)進行怎樣的操作:
cipher.init(Cipher.ENCRYPT_MODE, key);
以上方法調(diào)用對Cipher對象初始化以準備加密數(shù)據(jù)。加密數(shù)據(jù)的最簡單辦法就是調(diào)用 Cipher對象的doFinal方法,同時傳遞字節(jié)數(shù)組:
byte[] data = “Hello World!”.getBytes();
byte[] result = cipher.doFinal(data);
result現(xiàn)在包含傳遞數(shù)據(jù)的加密形式。對同一數(shù)據(jù)解密也很容易。但在解密之前,我們必須重新初始化Cipher對象以便其準備解密:
cipher.init(Cipher.DECRYPT_MODE, key);
之后即可解密:
byte[] original = cipher.doFinal(result);
現(xiàn)在original應(yīng)該和data.完全相同。程序清單F所示為全部源代碼。
小結(jié)
JCE是一種強大的API,它可以實施多種類型的加密和其他涉及安全的任務(wù)。我們已經(jīng)知道了如何以靜態(tài)和動態(tài)方式安裝JCE,以及采用對稱加密算法對簡單消息加密和解密。在本系列的第2部分,我還會利用以上的這些知識運用到真實環(huán)境下來,教你如何編寫簡單的封裝類以結(jié)合套接字加密應(yīng)用程序的所有網(wǎng)絡(luò)流量。
|
|