<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆 - 64  文章 - 9  trackbacks - 0
    <2009年12月>
    293012345
    6789101112
    13141516171819
    20212223242526
    272829303112
    3456789

    常用鏈接

    留言簿(6)

    我參與的團隊

    隨筆分類(88)

    隨筆檔案(92)

    文章分類(142)

    文章檔案(182)

    天基成員

    學習園

    我的海角

    搜索

    •  

    積分與排名

    • 積分 - 182443
    • 排名 - 319

    最新評論

      加密解密,曾經(jīng)是我一個畢業(yè)設計的重要組件。在工作了多年以后回想當時那個加密、解密算法,實在是太單純了。
        言歸正傳,這里我們主要描述Java已經(jīng)實現(xiàn)的一些加密解密算法,最后介紹數(shù)字證書。
        如基本的單向加密算法:
        ●  BASE64 嚴格地說,屬于編碼格式,而非加密算法
        ●  MD5(Message Digest algorithm 5,信息摘要算法)
        ●  SHA(Secure Hash Algorithm,安全散列算法)
        ●  HMAC(Hash Message Authentication Code,散列消息鑒別碼)
        復雜的對稱加密(DES、PBE)、非對稱加密算法:
        ●  DES(Data Encryption Standard,數(shù)據(jù)加密算法)
        ●  PBE(Password-based encryption,基于密碼驗證)
        ●  RSA(算法的名字以發(fā)明者的名字命名:Ron Rivest, AdiShamir 和Leonard Adleman)
        ●  DH(Diffie-Hellman算法,密鑰一致協(xié)議)
        ●  DSA(Digital Signature Algorithm,數(shù)字簽名)
        ●  ECC(Elliptic Curves Cryptography,橢圓曲線密碼編碼學)
        本篇內(nèi)容簡要介紹BASE64、MD5、SHA、HMAC幾種方法。
        MD5、SHA、HMAC這三種加密算法,可謂是非可逆加密,就是不可解密的加密方法。我們通常只把他們作為加密的基礎。單純的以上三種的加密并不可靠。
        BASE64
        按照RFC2045的定義,Base64被定義為:Base64內(nèi)容傳送編碼被設計用來把任意序列的8位字節(jié)描述為一種不易被人直接識別的形式。(The Base64 Content-Transfer-Encoding is designed to represent arbitrary sequences of octets in a form that need not be humanly readable.)
        常見于郵件、http加密,截取http信息,你就會發(fā)現(xiàn)登錄操作的用戶名、密碼字段通過BASE64加密的。
        通過java代碼實現(xiàn)如下:
    /**  
     * BASE64解密  http://www.bt285.cn http://www.5a520.cn
     *   
     * @param key  
     * @return  
     * @throws Exception  
     */  
    public static byte[] decryptBASE64(String key) throws Exception {   
        return (new BASE64Decoder()).decodeBuffer(key);   
    }   
      
    /**  
     * BASE64加密  
     *   
     * @param key  
     * @return  
     * @throws Exception  
     */  
    public static String encryptBASE64(byte[] key) throws Exception {   
        return (new BASE64Encoder()).encodeBuffer(key);   
    }
        主要就是BASE64Encoder、BASE64Decoder兩個類,我們只需要知道使用對應的方法即可。另,BASE加密后產(chǎn)生的字節(jié)位數(shù)是8的倍數(shù),如果不夠位數(shù)以=符號填充。
        MD5
        MD5 —— message-digest algorithm 5 (信息-摘要算法)縮寫,廣泛用于加密和解密技術,常用于文件校驗。校驗?不管文件多大,經(jīng)過MD5后都能生成唯一的MD5值。好比現(xiàn)在的ISO校驗,都是MD5校驗。怎么用?當然是把ISO經(jīng)過MD5后產(chǎn)生MD5的值。一般下載linux-ISO的朋友都見過下載鏈接旁邊放著MD5的串。就是用來驗證文件是否一致的。
        通過java代碼實現(xiàn)如下:
    /**  
     * MD5加密 http://www.bt285.cn http://www.5a520.cn  
     *   
     * @param data  
     * @return  
     * @throws Exception  
     */  
    public static byte[] encryptMD5(byte[] data) throws Exception {   
      
        MessageDigest md5 = MessageDigest.getInstance(KEY_MD5);   
        md5.update(data);   
      
        return md5.digest();   
      
    }
        通常我們不直接使用上述MD5加密。通常將MD5產(chǎn)生的字節(jié)數(shù)組交給BASE64再加密一把,得到相應的字符串。
        SHA
        SHA(Secure Hash Algorithm,安全散列算法),數(shù)字簽名等密碼學應用中重要的工具,被廣泛地應用于電子商務等信息安全領域。雖然,SHA與MD5通過碰撞法都被破解了, 但是SHA仍然是公認的安全加密算法,較之MD5更為安全。
        通過java代碼實現(xiàn)如下:
     /**  
         * SHA加密 http://www.5a520.cn http://www.bt285.cn 
         *   
         * @param data  
         * @return  
         * @throws Exception  
         */  
        public static byte[] encryptSHA(byte[] data) throws Exception {   
      
            MessageDigest sha = MessageDigest.getInstance(KEY_SHA);   
            sha.update(data);   
      
            return sha.digest();   
      
        }   
    }

     HMAC

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

        通過java代碼實現(xiàn)如下:

    /**  
     * 初始化HMAC密鑰  
    http://www.guihua.org  http://www.feng123.com
     *   
     * 
    @return  
     * 
    @throws Exception  
     
    */
      
    public static String initMacKey() throws Exception {   
        KeyGenerator keyGenerator 
    = KeyGenerator.getInstance(KEY_MAC);   
      
        SecretKey secretKey 
    = keyGenerator.generateKey();   
        
    return encryptBASE64(secretKey.getEncoded());   
    }
       
      
    /**  
     * HMAC加密  
     *   
     * 
    @param data  
     * 
    @param key  
     * 
    @return  
     * 
    @throws Exception  
     
    */
      
    public static byte[] encryptHMAC(byte[] data, String key) throws Exception {   
      
        SecretKey secretKey 
    = new SecretKeySpec(decryptBASE64(key), KEY_MAC);   
        Mac mac 
    = Mac.getInstance(secretKey.getAlgorithm());   
        mac.init(secretKey);   
      
        
    return mac.doFinal(data);   
      
    }
     

        給出一個完整類,如下:

    import java.security.MessageDigest;   
      
    import javax.crypto.KeyGenerator;   
    import javax.crypto.Mac;   
    import javax.crypto.SecretKey;   
      
    import sun.misc.BASE64Decoder;   
    import sun.misc.BASE64Encoder;   
      
    /**  
     * 基礎加密組件  
    http://www.bt285.cn http://www.feng123.com
     *   
     * 
    @author 梁棟  
     * 
    @version 1.0  
     * 
    @since 1.0  
     
    */
      
    public abstract class Coder {   
        
    public static final String KEY_SHA = "SHA";   
        
    public static final String KEY_MD5 = "MD5";   
      
        
    /**  
         * MAC算法可選以下多種算法  
         *   
         * <pre>  
         * HmacMD5   
         * HmacSHA1   
         * HmacSHA256   
         * HmacSHA384   
         * HmacSHA512  
         * </pre>  
         
    */
      
        
    public static final String KEY_MAC = "HmacMD5";   
      
        
    /**  
         * BASE64解密  
         *   
         * 
    @param key  
         * 
    @return  
         * 
    @throws Exception  
         
    */
      
        
    public static byte[] decryptBASE64(String key) throws Exception {   
            
    return (new BASE64Decoder()).decodeBuffer(key);   
        }
       
      
        
    /**  
         * BASE64加密  
         *   
         * 
    @param key  
         * 
    @return  
         * 
    @throws Exception  
         
    */
      
        
    public static String encryptBASE64(byte[] key) throws Exception {   
            
    return (new BASE64Encoder()).encodeBuffer(key);   
        }
       
      
        
    /**  
         * MD5加密  
         *   
         * 
    @param data  
         * 
    @return  
         * 
    @throws Exception  
         
    */
      
        
    public static byte[] encryptMD5(byte[] data) throws Exception {   
      
            MessageDigest md5 
    = MessageDigest.getInstance(KEY_MD5);   
            md5.update(data);   
      
            
    return md5.digest();   
      
        }
       
      
        
    /**  
         * SHA加密  
         *   
         * 
    @param data  
         * 
    @return  
         * 
    @throws Exception  
         
    */
      
        
    public static byte[] encryptSHA(byte[] data) throws Exception {   
      
            MessageDigest sha 
    = MessageDigest.getInstance(KEY_SHA);   
            sha.update(data);   
      
            
    return sha.digest();   
      
        }
       
      
        
    /**  
         * 初始化HMAC密鑰  
         *   
         * 
    @return  
         * 
    @throws Exception  
         
    */
      
        
    public static String initMacKey() throws Exception {   
            KeyGenerator keyGenerator 
    = KeyGenerator.getInstance(KEY_MAC);   
      
            SecretKey secretKey 
    = keyGenerator.generateKey();   
            
    return encryptBASE64(secretKey.getEncoded());   
        }
       
      
        
    /**  
         * HMAC加密  
         *   
         * 
    @param data  
         * 
    @param key  
         * 
    @return  
         * 
    @throws Exception  
         
    */
      
        
    public static byte[] encryptHMAC(byte[] data, String key) throws Exception {   
      
            SecretKey secretKey 
    = new SecretKeySpec(decryptBASE64(key), KEY_MAC);   
            Mac mac 
    = Mac.getInstance(secretKey.getAlgorithm());   
            mac.init(secretKey);   
      
            
    return mac.doFinal(data);   
      
        }
       
    }

        再給出一個測試類:

    import static org.junit.Assert.*;

    import org.junit.Test;

    /**
     *
     * @author 梁棟  http://www.feng123.com
     * @version 1.0
     * @since 1.0
     */
    public class CoderTest {

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

            byte[] inputData = inputStr.getBytes();
            String code = Coder.encryptBASE64(inputData);

            System.err.println("BASE64加密后:\n" + code);

            byte[] output = Coder.decryptBASE64(code);

            String outputStr = new String(output);

            System.err.println("BASE64解密后:\n" + outputStr);

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

            // 驗證MD5對于同一內(nèi)容加密是否一致
            assertArrayEquals(Coder.encryptMD5(inputData), Coder
                    .encryptMD5(inputData));

            // 驗證SHA對于同一內(nèi)容加密是否一致
            assertArrayEquals(Coder.encryptSHA(inputData), Coder
                    .encryptSHA(inputData));

            String key = Coder.initMacKey();
            System.err.println("Mac密鑰:\n" + key);

            // 驗證HMAC對于同一內(nèi)容,同一密鑰加密是否一致
            assertArrayEquals(Coder.encryptHMAC(inputData, key), Coder.encryptHMAC(
                    inputData, key));

            BigInteger md5 = new BigInteger(Coder.encryptMD5(inputData));
            System.err.println("MD5:\n" + md5.toString(16));

            BigInteger sha = new BigInteger(Coder.encryptSHA(inputData));
            System.err.println("SHA:\n" + sha.toString(32));

            BigInteger mac = new BigInteger(Coder.encryptHMAC(inputData, inputStr));
            System.err.println("HMAC:\n" + mac.toString(16));
        }

    posted on 2009-12-18 11:38 鵬凌 閱讀(310) 評論(0)  編輯  收藏

    只有注冊用戶登錄后才能發(fā)表評論。


    網(wǎng)站導航:
     
    主站蜘蛛池模板: 国产亚洲AV夜间福利香蕉149| 亚洲国产成人资源在线软件| 欧美日韩亚洲精品| 99视频免费播放| 亚洲中文字幕丝袜制服一区| 午夜在线a亚洲v天堂网2019| 免费国产污网站在线观看| 免费a级黄色毛片| 最新亚洲精品国偷自产在线| 99热在线观看免费| 中文字幕亚洲一区二区va在线| 亚洲狠狠婷婷综合久久| 日本阿v免费费视频完整版| 亚洲AV无码专区国产乱码电影 | 国产精品偷伦视频免费观看了 | 亚洲精品乱码久久久久久V| 777爽死你无码免费看一二区| 亚洲精品自产拍在线观看| 日本高清免费中文在线看| 无码一区二区三区AV免费| 91亚洲国产成人久久精品网站| 成人免费av一区二区三区| www国产亚洲精品久久久日本| 亚洲日韩精品无码AV海量| 成年人网站免费视频| 亚洲天堂一区二区| 久久国产精品免费观看| 国产亚洲真人做受在线观看| 永久免费无码日韩视频| 亚洲第一区精品观看| 免费国产在线精品一区| 免费日本黄色网址| 国产精品亚洲а∨天堂2021| 午夜毛片不卡免费观看视频| 在线观看亚洲AV日韩AV| 最近最新MV在线观看免费高清| 亚洲国产中文在线视频| 四虎免费影院ww4164h| 亚洲最大视频网站| 四虎在线免费视频| 亚洲成a人片在线观看精品|