在Java中使用DES算法
發(fā)表時(shí)間:2024-06-17 來(lái)源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]注:這是從另一篇比較長(zhǎng)的文件中摘過來(lái)的。只是講述的基本用法。其中用到的類在jdk 1.4中都有,請(qǐng)參考api中的:javax.crypto,java.security 等包。如果是jdk 1.3請(qǐng)參考:http://java.sun.com/products/jce/三、加密、解密 Java加密擴(kuò)...
注:這是從另一篇比較長(zhǎng)的文件中摘過來(lái)的。只是講述的基本用法。
其中用到的類在jdk 1.4中都有,請(qǐng)參考api中的:javax.crypto,java.security 等包。
如果是jdk 1.3請(qǐng)參考:http://java.sun.com/products/jce/
三、加密、解密
Java加密擴(kuò)展即Java Cryptography Extension,簡(jiǎn)稱JCE。它是Sun的加密服務(wù)軟件,包含了加密和密匙生成功能。JCE是JCA(Java Cryptography Architecture)的一種擴(kuò)展。
JCE沒有規(guī)定具體的加密算法,但提供了一個(gè)框架,加密算法的具體實(shí)現(xiàn)可以作為服務(wù)提供者加入。除了JCE框架之外,JCE軟件包還包含了SunJCE服務(wù)提供者,其中包括許多有用的加密算法,比如DES(Data Encryption Standard)和Blowfish。
為簡(jiǎn)單計(jì),在本文中我們將用DES算法加密和解密字節(jié)碼。下面是用JCE加密和解密數(shù)據(jù)必須遵循的基本步驟:
步驟1:生成一個(gè)安全密匙。在加密或解密任何數(shù)據(jù)之前需要有一個(gè)密匙。密匙是隨同被加密的應(yīng)用一起發(fā)布的一小段數(shù)據(jù),Listing 3顯示了如何生成一個(gè)密匙。
【Listing 3:生成一個(gè)密匙】
// DES算法要求有一個(gè)可信任的隨機(jī)數(shù)源
SecureRandom sr = new SecureRandom();
// 為我們選擇的DES算法生成一個(gè)KeyGenerator對(duì)象
KeyGenerator kg = KeyGenerator.getInstance( "DES" );
kg.init( sr );
// 生成密匙
SecretKey key = kg.generateKey();
// 獲取密匙數(shù)據(jù)
byte rawKeyData[] = key.getEncoded();
/* 接下來(lái)就可以用密匙進(jìn)行加密或解密,或者把它保存
為文件供以后使用 */
doSomething( rawKeyData );
步驟2:加密數(shù)據(jù)。得到密匙之后,接下來(lái)就可以用它加密數(shù)據(jù)。除了解密的ClassLoader之外,一般還要有一個(gè)加密待發(fā)布應(yīng)用的獨(dú)立程序(見Listing 4)。
【Listing 4:用密匙加密原始數(shù)據(jù)】
// DES算法要求有一個(gè)可信任的隨機(jī)數(shù)源
SecureRandom sr = new SecureRandom();
byte rawKeyData[] = /* 用某種方法獲得密匙數(shù)據(jù) */;
// 從原始密匙數(shù)據(jù)創(chuàng)建DESKeySpec對(duì)象
DESKeySpec dks = new DESKeySpec( rawKeyData );
// 創(chuàng)建一個(gè)密匙工廠,然后用它把DESKeySpec轉(zhuǎn)換成
// 一個(gè)SecretKey對(duì)象
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance( "DES" );
SecretKey key = keyFactory.generateSecret( dks );
// Cipher對(duì)象實(shí)際完成加密操作
Cipher cipher = Cipher.getInstance( "DES" );
// 用密匙初始化Cipher對(duì)象
cipher.init( Cipher.ENCRYPT_MODE, key, sr );
// 現(xiàn)在,獲取數(shù)據(jù)并加密
byte data[] = /* 用某種方法獲取數(shù)據(jù) */
// 正式執(zhí)行加密操作
byte encryptedData[] = cipher.doFinal( data );
// 進(jìn)一步處理加密后的數(shù)據(jù)
doSomething( encryptedData );
步驟3:解密數(shù)據(jù)。運(yùn)行經(jīng)過加密的應(yīng)用時(shí),ClassLoader分析并解密類文件。操作步驟如Listing 5所示。
【Listing 5:用密匙解密數(shù)據(jù)】
// DES算法要求有一個(gè)可信任的隨機(jī)數(shù)源
SecureRandom sr = new SecureRandom();
byte rawKeyData[] = /* 用某種方法獲取原始密匙數(shù)據(jù) */;
// 從原始密匙數(shù)據(jù)創(chuàng)建一個(gè)DESKeySpec對(duì)象
DESKeySpec dks = new DESKeySpec( rawKeyData );
// 創(chuàng)建一個(gè)密匙工廠,然后用它把DESKeySpec對(duì)象轉(zhuǎn)換成
// 一個(gè)SecretKey對(duì)象
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance( "DES" );
SecretKey key = keyFactory.generateSecret( dks );
// Cipher對(duì)象實(shí)際完成解密操作
Cipher cipher = Cipher.getInstance( "DES" );
// 用密匙初始化Cipher對(duì)象
cipher.init( Cipher.DECRYPT_MODE, key, sr );
// 現(xiàn)在,獲取數(shù)據(jù)并解密
byte encryptedData[] = /* 獲得經(jīng)過加密的數(shù)據(jù) */
// 正式執(zhí)行解密操作
byte decryptedData[] = cipher.doFinal( encryptedData );
// 進(jìn)一步處理解密后的數(shù)據(jù)
doSomething( decryptedData );