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