熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java高級技術 >> 正文

漫談Java加密技術(二)

2013-11-23 19:53:16  來源: Java高級技術 

  接下來我們介紹對稱加密算法最常用的莫過於DES數據加密算法

  DES

  DESData Encryption Standard即數據加密算法是IBM公司於年研究成功並公開發表的DES算法的入口參數有三個KeyDataMode其中Key為個字節共是DES算法的工作密鑰Data也為個字節是要被加密或被解密的數據Mode為DES的工作方式有兩種加密或解密

  DES算法把位的明文輸入塊變為位的密文輸出塊它所使用的密鑰也是

  通過java代碼實現如下

   import javasecurityKey;   
import javasecuritySecureRandom;   
  
import javaxcryptoCipher;   
import javaxcryptoKeyGenerator;   
import javaxcryptoSecretKey;   
import javaxcryptoSecretKeyFactory;   
import javaxcryptospecDESKeySpec;   
  
  
/** *//**  
 * DES安全編碼組件  author by ;
 *   
 * <pre>  
 * 支持 DESDESede(TripleDES就是DES)AESBlowfishRCRC(ARCFOUR)  
 * DES                  key size must be equal to   
 * DESede(TripleDES)    key size must be equal to  or   
 * AES                  key size must be equal to   or but  and  bits may not be available  
 * Blowfish             key size must be multiple of  and can only range from  to  (inclusive)  
 * RC                  key size must be between  and  bits  
 * RC(ARCFOUR)         key size must be between  and  bits  
 * 具體內容 需要關注 JDK Document&///docs/technotes/guides/security/l  
 * </pre>  
 *   
 * @author 梁棟  
 * @version   
 * @since   
 */  
public abstract class DESCoder extends Coder {   
    /** *//**  
     * ALGORITHM 算法 <br>  
     * 可替換為以下任意一種算法同時key值的size相應改變  
     *   
     * <pre>  
     * DES                  key size must be equal to   
     * DESede(TripleDES)    key size must be equal to  or   
     * AES                  key size must be equal to   or but  and  bits may not be available  
     * Blowfish             key size must be multiple of  and can only range from  to  (inclusive)  
     * RC                  key size must be between  and  bits  
     * RC(ARCFOUR)         key size must be between  and  bits  
     * </pre>  
     *   
     * 在Key toKey(byte[] key)方法中使用下述代碼  
     * <code>SecretKey secretKey = new SecretKeySpec(key ALGORITHM);</code> 替換  
     * <code>  
     * DESKeySpec dks = new DESKeySpec(key);  
     * SecretKeyFactory keyFactory = SecretKeyFactorygetInstance(ALGORITHM);  
     * SecretKey secretKey = keyFactorygenerateSecret(dks);  
     * </code>  
     */  
    public static final String ALGORITHM = DES;   
  
    /** *//**  
     * 轉換密鑰<br>  
     *   
     * @param key  
     * @return  
     * @throws Exception  
     */  
    private static Key toKey(byte[] key) throws Exception {   
        DESKeySpec dks = new DESKeySpec(key);   
        SecretKeyFactory keyFactory = SecretKeyFactorygetInstance(ALGORITHM);   
        SecretKey secretKey = keyFactorygenerateSecret(dks);   
  
        // 當使用其他對稱加密算法時如AESBlowfish等算法時用下述代碼替換上述三行代碼   
        // SecretKey secretKey = new SecretKeySpec(key ALGORITHM);   
  
        return secretKey;   
    }   
  
    /** *//**  
     * 解密  
     *   
     * @param data  
     * @param key  
     * @return  
     * @throws Exception  
     */  
    public static byte[] decrypt(byte[] data String key) throws Exception {   
        Key k = toKey(decryptBASE(key));   
  
        Cipher cipher = CiphergetInstance(ALGORITHM);   
        cipherinit(CipherDECRYPT_MODE k);   
  
        return cipherdoFinal(data);   
    }   
  
    /** *//**  
     * 加密  
     *   
     * @param data  
     * @param key  
     * @return  
     * @throws Exception  
     */  
    public static byte[] encrypt(byte[] data String key) throws Exception {   
        Key k = toKey(decryptBASE(key));   
        Cipher cipher = CiphergetInstance(ALGORITHM);   
        cipherinit(CipherENCRYPT_MODE k);   
  
        return cipherdoFinal(data);   
    }   
  
    /** *//**  
     * 生成密鑰  
     *   
     * @return  
     * @throws Exception  
     */  
    public static String initKey() throws Exception {   
        return initKey(null);   
    }   
  
    /** *//**  
     * 生成密鑰  
     *   
     * @param seed  
     * @return  
     * @throws Exception  
     */  
    public static String initKey(String seed) throws Exception {   
        SecureRandom secureRandom = null;   
  
        if (seed != null) {   
            secureRandom = new SecureRandom(decryptBASE(seed));   
        } else {   
            secureRandom = new SecureRandom();   
        }   
  
        KeyGenerator kg = KeyGeneratorgetInstance(ALGORITHM);   
        kginit(secureRandom);   
  
        SecretKey secretKey = kggenerateKey();   
  
        return encryptBASE(secretKeygetEncoded());   
    }   
}

  延續上一個類的實現我們通過MD以及SHA對字符串加密生成密鑰這是比較常見的密鑰生成方式

  再給出一個測試類

   import static orgjunitAssert*;   
  
import orgjunitTest;   
  
/** *//**  
 *   
 * @author by ;;
 * @version   
 * @since   
 */  
public class DESCoderTest {   
  
    @Test  
    public void test() throws Exception {   
        String inputStr = DES;   
        String key = DESCoderinitKey();   
        Systemerrprintln(原文:\t + inputStr);   
  
        Systemerrprintln(密鑰:\t + key);   
  
        byte[] inputData = inputStrgetBytes();   
        inputData = DESCoderencrypt(inputData key);   
  
        Systemerrprintln(加密後:\t + DESCoderencryptBASE(inputData));   
  
        byte[] outputData = DESCoderdecrypt(inputData key);   
        String outputStr = new String(outputData);   
  
        Systemerrprintln(解密後:\t + outputStr);   
  
        assertEquals(inputStr outputStr);   
    }   
}

  得到的輸出內容如下

  原文 DES

  密鑰 fwEtRrVq=

  加密後    CqeoNIzRY=

  解密後    DES

  由控制台得到的輸出我們能夠比對加密解密後結果一致這是一種簡單的加密解密方式只有一個密鑰

  其實DES有很多同胞兄弟如DESede(TripleDES)AESBlowfishRCRC(ARCFOUR)這裡就不過多闡述了大同小異只要換掉ALGORITHM換成對應的值同時做一個代碼替換SecretKey secretKey = new SecretKeySpec(key ALGORITHM)就可以了此外就是密鑰長度不同了

  /**

    * DES          key size must be equal to
 * DESede(TripleDES) key size must be equal to or
 * AES          key size must be equal to or but and bits may not be available
 * Blowfish     key size must be multiple of and can only range from to (inclusive)
 * RC          key size must be between and bits
 * RC(ARCFOUR) key size must be between and bits
 **/


From:http://tw.wingwit.com/Article/program/Java/gj/201311/27624.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.