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

漫談Java加密技術(一)

2013-11-23 19:51:18  來源: Java高級技術 

  加密解密曾經是我一個畢業設計的重要組件在工作了多年以後回想當時那個加密解密算法實在是太單純了

  言歸正傳這裡我們主要描述Java已經實現的一些加密解密算法最後介紹數字證書

  如基本的單向加密算法

  ●  BASE 嚴格地說屬於編碼格式而非加密算法
    ●  MD(Message Digest algorithm 信息摘要算法)
    ●  SHA(Secure Hash Algorithm安全散列算法)
    ●  HMAC(Hash Message Authentication Code散列消息鑒別碼)

  復雜的對稱加密(DESPBE)非對稱加密算法

  ●  DES(Data Encryption Standard數據加密算法)
    ●  PBE(Passwordbased encryption基於密碼驗證)
    ●  RSA(算法的名字以發明者的名字命名Ron Rivest AdiShamir 和Leonard Adleman)
    ●  DH(DiffieHellman算法密鑰一致協議)
    ●  DSA(Digital Signature Algorithm數字簽名)
    ●  ECC(Elliptic Curves Cryptography橢圓曲線密碼編碼學)

  本篇內容簡要介紹BASEMDSHAHMAC幾種方法

  MDSHAHMAC這三種加密算法可謂是非可逆加密就是不可解密的加密方法我們通常只把他們作為加密的基礎單純的以上三種的加密並不可靠

  BASE

  按照RFC的定義Base被定義為Base內容傳送編碼被設計用來把任意序列的位字節描述為一種不易被人直接識別的形式(The Base ContentTransferEncoding is designed to represent arbitrary sequences of octets in a form that need not be humanly readable

  常見於郵件http加密截取http信息你就會發現登錄操作的用戶名密碼字段通過BASE加密的

  通過java代碼實現如下

   /** *//**  
 * BASE解密  ;
 *   
 * @param key  
 * @return  
 * @throws Exception  
 */  
public static byte[] decryptBASE(String key) throws Exception {   
    return (new BASEDecoder())decodeBuffer(key);   
}   
  
/** *//**  
 * BASE加密  
 *   
 * @param key  
 * @return  
 * @throws Exception  
 */  
public static String encryptBASE(byte[] key) throws Exception {   
    return (new BASEEncoder())encodeBuffer(key);   
}

  主要就是BASEEncoderBASEDecoder兩個類我們只需要知道使用對應的方法即可BASE加密後產生的字節位數是的倍數如果不夠位數以=符號填充

  MD

  MD —— messagedigest algorithm (信息摘要算法)縮寫廣泛用於加密和解密技術常用於文件校驗校驗?不管文件多大經過MD後都能生成唯一的MD好比現在的ISO校驗都是MD校驗怎麼用?當然是把ISO經過MD後產生MD的值一般下載linuxISO的朋友都見過下載鏈接旁邊放著MD的串就是用來驗證文件是否一致的

  通過java代碼實現如下

   /** *//**  
 * MD加密 ;; 
 *   
 * @param data  
 * @return  
 * @throws Exception  
 */  
public static byte[] encryptMD(byte[] data) throws Exception {   
  
    MessageDigest md = MessageDigestgetInstance(KEY_MD);   
    mdupdate(data);   
  
    return mddigest();   
  
}

  通常我們不直接使用上述MD加密通常將MD產生的字節數組交給BASE再加密一把得到相應的字符串

  SHA

  SHA(Secure Hash Algorithm安全散列算法)數字簽名等密碼學應用中重要的工具被廣泛地應用於電子商務等信息安全領域雖然SHA與MD通過碰撞法都被破解了 但是SHA仍然是公認的安全加密算法較之MD更為安全

  通過java代碼實現如下

    /** *//**  
     * SHA加密 ;;
     *   
     * @param data  
     * @return  
     * @throws Exception  
     */  
    public static byte[] encryptSHA(byte[] data) throws Exception {   
  
        MessageDigest sha = MessageDigestgetInstance(KEY_SHA);   
        shaupdate(data);   
  
        return shadigest();   
  
    }   
}

  HMAC

  HMAC(Hash Message Authentication Code散列消息鑒別碼基於密鑰的Hash算法的認證協議消息鑒別碼實現鑒別的原理是用公開函數和密鑰產生一個固定長度的值作為認證標識用這個標識鑒別消息的完整性使用一個密鑰生成一個固定大小的小數據塊即MAC並將其加入到消息中然後傳輸接收方利用與發送方共享的密鑰進行鑒別認證等

  通過java代碼實現如下

   /** *//**  
 * 初始化HMAC密鑰  ; 
 *   
 * @return  
 * @throws Exception  
 */  
public static String initMacKey() throws Exception {   
    KeyGenerator keyGenerator = KeyGeneratorgetInstance(KEY_MAC);   
  
    SecretKey secretKey = keyGeneratorgenerateKey();   
    return encryptBASE(secretKeygetEncoded());   
}   
  
/** *//**  
 * HMAC加密  
 *   
 * @param data  
 * @param key  
 * @return  
 * @throws Exception  
 */  
public static byte[] encryptHMAC(byte[] data String key) throws Exception {   
  
    SecretKey secretKey = new SecretKeySpec(decryptBASE(key) KEY_MAC);   
    Mac mac = MacgetInstance(secretKeygetAlgorithm());   
    macinit(secretKey);   
  
    return macdoFinal(data);   
  

  給出一個完整類如下

   import javasecurityMessageDigest;   
  
import javaxcryptoKeyGenerator;   
import javaxcryptoMac;   
import javaxcryptoSecretKey;   
  
import sunmiscBASEDecoder;   
import sunmiscBASEEncoder;   
  
/** *//**  
 * 基礎加密組件  ;
 *   
 * @author 梁棟  
 * @version   
 * @since   
 */  
public abstract class Coder {   
    public static final String KEY_SHA = SHA;   
    public static final String KEY_MD = MD;   
  
    /** *//**  
     * MAC算法可選以下多種算法  
     *   
     * <pre>  
     * HmacMD   
     * HmacSHA   
     * HmacSHA   
     * HmacSHA   
     * HmacSHA  
     * </pre>  
     */  
    public static final String KEY_MAC = HmacMD;   
  
    /** *//**  
     * BASE解密  
     *   
     * @param key  
     * @return  
     * @throws Exception  
     */  
    public static byte[] decryptBASE(String key) throws Exception {   
        return (new BASEDecoder())decodeBuffer(key);   
    }   
  
    /** *//**  
     * BASE加密  
     *   
     * @param key  
     * @return  
     * @throws Exception  
     */  
    public static String encryptBASE(byte[] key) throws Exception {   
        return (new BASEEncoder())encodeBuffer(key);   
    }   
  
    /** *//**  
     * MD加密  
     *   
     * @param data  
     * @return  
     * @throws Exception  
     */  
    public static byte[] encryptMD(byte[] data) throws Exception {   
  
        MessageDigest md = MessageDigestgetInstance(KEY_MD);   
        mdupdate(data);   
  
        return mddigest();   
  
    }   
  
    /** *//**  
     * SHA加密  
     *   
     * @param data  
     * @return  
     * @throws Exception  
     */  
    public static byte[] encryptSHA(byte[] data) throws Exception {   
  
        MessageDigest sha = MessageDigestgetInstance(KEY_SHA);   
        shaupdate(data);   
  
        return shadigest();   
  
    }   
  
    /** *//**  
     * 初始化HMAC密鑰  
     *   
     * @return  
     * @throws Exception  
     */  
    public static String initMacKey() throws Exception {   
        KeyGenerator keyGenerator = KeyGeneratorgetInstance(KEY_MAC);   
  
        SecretKey secretKey = keyGeneratorgenerateKey();   
        return encryptBASE(secretKeygetEncoded());   
    }   
  
    /** *//**  
     * HMAC加密  
     *   
     * @param data  
     * @param key  
     * @return  
     * @throws Exception  
     */  
    public static byte[] encryptHMAC(byte[] data String key) throws Exception {   
  
        SecretKey secretKey = new SecretKeySpec(decryptBASE(key) KEY_MAC);   
        Mac mac = MacgetInstance(secretKeygetAlgorithm());   
        macinit(secretKey);   
  
        return macdoFinal(data);   
  
    }   
}

  再給出一個測試類

  

  import static orgjunitAssert*;

  import orgjunitTest;

  /**
 *
 * @author 梁棟 
 * @version
 * @since
 */
public class CoderTest {

  @Test
    public void test() throws Exception {
        String inputStr = 簡單加密;
        Systemerrprintln(原文:\n + inputStr);

  byte[] inputData = inputStrgetBytes();
        String code = CoderencryptBASE(inputData);

  Systemerrprintln(BASE加密後:\n + code);

  byte[] output = CoderdecryptBASE(code);

  String outputStr = new String(output);

  Systemerrprintln(BASE解密後:\n + outputStr);

  // 驗證BASE加密解密一致性
        assertEquals(inputStr outputStr);

  // 驗證MD對於同一內容加密是否一致
        assertArrayEquals(CoderencryptMD(inputData) Coder
                encryptMD(inputData));

  // 驗證SHA對於同一內容加密是否一致
        assertArrayEquals(CoderencryptSHA(inputData) Coder
                encryptSHA(inputData));

  String key = CoderinitMacKey();
        Systemerrprintln(Mac密鑰:\n + key);

  // 驗證HMAC對於同一內容同一密鑰加密是否一致
        assertArrayEquals(CoderencryptHMAC(inputData key) CoderencryptHMAC(
                inputData key));

  BigInteger md = new BigInteger(CoderencryptMD(inputData));
        Systemerrprintln(MD:\n + mdtoString());

  BigInteger sha = new BigInteger(CoderencryptSHA(inputData));
        Systemerrprintln(SHA:\n + shatoString());

  BigInteger mac = new BigInteger(CoderencryptHMAC(inputData inputStr));
        Systemerrprintln(HMAC:\n + mactoString());
    }


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