• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            逛奔的蝸牛

            我不聰明,但我會(huì)很努力

               ::  :: 新隨筆 ::  ::  :: 管理 ::
            From: http://blog.csdn.net/noliyo/article/details/9166365@import url(http://m.shnenglu.com/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);

            本文以使用DES對(duì)稱加密算法為例使用jdk對(duì)數(shù)據(jù)進(jìn)行加密解密。


            首先需要了解Provider類,它是jdk引入的密碼服務(wù)提供者概念,實(shí)現(xiàn)了Java安全性的一部分或者全部。Provider 可能實(shí)現(xiàn)的服務(wù)包括: 
            算法(如DES、RSA、MD5);密鑰的生成、轉(zhuǎn)換和管理。 
            通常java運(yùn)行時(shí)環(huán)境至少安裝了一個(gè)名字為“SUN”的預(yù)設(shè)Provider,如果查看本機(jī)支持的Provider類型可以通過以下代碼:
            1. for(Provider p : Security.getProviders()){  
            2.     System.out.println(p.getName()+":"+p.getInfo());    
            3. }  

            我本機(jī)運(yùn)行結(jié)果為:
            1. SUN:SUN (DSA key/parameter generation; DSA signing; SHA-1, MD5 digests; SecureRandom; X.509 certificates; JKS keystore; PKIX CertPathValidator; PKIX CertPathBuilder; LDAP, Collection CertStores, JavaPolicy Policy; JavaLoginConfig Configuration)  
            2. SunRsaSign:Sun RSA signature provider  
            3. SunJSSE:Sun JSSE provider(PKCS12, SunX509 key/trust factories, SSLv3, TLSv1)  
            4. SunJCE:SunJCE Provider (implements RSA, DES, Triple DES, AES, Blowfish, ARCFOUR, RC2, PBE, Diffie-Hellman, HMAC)  
            5. SunJGSS:Sun (Kerberos v5, SPNEGO)  
            6. SunSASL:Sun SASL provider(implements client mechanisms for: DIGEST-MD5, GSSAPI, EXTERNAL, PLAIN, CRAM-MD5; server mechanisms for: DIGEST-MD5, GSSAPI, CRAM-MD5)  
            7. XMLDSig:XMLDSig (DOM XMLSignatureFactory; DOM KeyInfoFactory)  
            8. SunPCSC:Sun PC/SC provider  
            9. SunMSCAPI:Sun's Microsoft Crypto API provider  
            從結(jié)果中可以看到名稱為“SunJCE”的Provider提供DES、Triple DES(即3DES), AES、RSA、Diffie-Hellman等算法的實(shí)現(xiàn),下面使用此Provider完成對(duì)稱加密。

            KeyGenerator類提供(對(duì)稱)密鑰生成器的功能,使用getInstance 類方法構(gòu)造,代碼如下:
            1. KeyGenerator kg = KeyGenerator.getInstance("DES","SunJCE");  

            SecretKey類是對(duì)稱密鑰的封裝類,它不包含方法或常量,其唯一目的是分組對(duì)稱密鑰(并為其提供類型安全),從kg中獲取 
            1. SecretKey key = kg.generateKey();  

            以上是產(chǎn)生密鑰的過程,真正實(shí)現(xiàn)對(duì)數(shù)據(jù)加解密功能的類是Cipher,此類為加密和解密提供密碼功能,它構(gòu)成了 Java Cryptographic Extension (JCE) 框架的核心。
            為創(chuàng)建 Cipher 對(duì)象,應(yīng)用程序調(diào)用 Cipher 的 getInstance 方法并將所請(qǐng)求“轉(zhuǎn)換”的名稱傳遞給它,還可以指定Provider的名稱,本文中采用“SunJCE”。
            “轉(zhuǎn)換”是一個(gè)字符串,它描述為產(chǎn)生某種輸出而在給定的輸入上執(zhí)行的操作(或一組操作)。轉(zhuǎn)換始終包括加密算法的名稱(例如,DES),后面可能跟有一個(gè)反饋模式和填充方案(反饋模式和填充方案可以理解為 加密前對(duì)數(shù)據(jù)的預(yù)處理)
            “轉(zhuǎn)換”具有以下兩種形式:“算法/模式/填充”或“算法”(這種情況,使用模式和填充方案特定于Provider的默認(rèn)值)。本例中采用以下有效的轉(zhuǎn)換:
            1. Cipher c = Cipher.getInstance("DES/CBC/PKCS5Padding","SunJCE");//DES加密算法,CBC的反饋模式,PKCS5Padding的填充方案  

            使用CBC反饋模式需要一個(gè)初始化向量,由類IvParameterSpec來完成,它需要是一個(gè)長(zhǎng)度為8的byte數(shù)組。


            Cipher的init方法負(fù)責(zé)初始化,初始化需要指定模式和密鑰,密鑰本文采用上面已經(jīng)生成的key,模式有四種ENCRYPT_MODE、DECRYPT_MODE、WRAP_MODE、UNWRAP_MODE分別表示加密、解密、密鑰包裝或密鑰解包。
            如果加密則采用方法init(Cipher.ENCRYPT_MODE, key);
            如果解密則采用方法init(Cipher.DECRYPT_MODE, key);
            WRAP_MODE、UNWRAP_MODE模式是用來實(shí)現(xiàn)數(shù)字信封用的,本文不作介紹。
            通常對(duì)數(shù)據(jù)進(jìn)行加解密,使用方法doFinal(byte[] input),傳入?yún)?shù)是byte數(shù)組。
            為了在http協(xié)議下快速傳輸數(shù)據(jù),且某些系統(tǒng)中只能使用ASCII字符,通常采用Base64編碼。Base64就是用來將非ASCII字符的數(shù)據(jù)轉(zhuǎn)換成ASCII字符的一種方法。還可以提高可視性。

            通過以上分析可以得到以下代碼: 
            1. import java.io.IOException;  
            2. import java.io.UnsupportedEncodingException;  
            3. import java.security.InvalidAlgorithmParameterException;  
            4. import java.security.InvalidKeyException;  
            5. import java.security.NoSuchAlgorithmException;  
            6. import java.security.NoSuchProviderException;  
            7. import javax.crypto.BadPaddingException;  
            8. import javax.crypto.Cipher;  
            9. import javax.crypto.IllegalBlockSizeException;  
            10. import javax.crypto.KeyGenerator;  
            11. import javax.crypto.NoSuchPaddingException;  
            12. import javax.crypto.SecretKey;  
            13. import javax.crypto.spec.IvParameterSpec;  
            14. import sun.misc.BASE64Decoder;  
            15. import sun.misc.BASE64Encoder;  
            16.   
            17. public class SecurityTest {  
            18.   
            19.     //密鑰生成器  
            20.     private KeyGenerator kg;   
            21.       
            22.     //對(duì)稱密鑰    
            23.     private SecretKey key;    
            24.       
            25.     //加解密時(shí)的初始化向量must be 8 bytes long  
            26.     private IvParameterSpec iv;  
            27.       
            28.     //Cipher,加解密主體實(shí)例  
            29.     private Cipher c;    
            30.       
            31.     //該構(gòu)造方法初始化DES密鑰和Cipher    
            32.     public SecurityTest() throws NoSuchAlgorithmException, NoSuchProviderException, NoSuchPaddingException, UnsupportedEncodingException{  
            33.         kg = KeyGenerator.getInstance("DES","SunJCE");    
            34.         key = kg.generateKey();  
            35.         iv = new IvParameterSpec("12345678".getBytes("UTF-8"));  
            36.         c = Cipher.getInstance("DES/CBC/PKCS5Padding","SunJCE");//DES加密算法,CBC的反饋模式,PKCS5Padding的填充方案 ,SunJCE:Provider  
            37.     }    
            38.         
            39.     /**  
            40.      * DES加密 
            41.      */    
            42.     public String encrypt(String src) throws InvalidKeyException, IllegalBlockSizeException, BadPaddingException, InvalidAlgorithmParameterException{    
            43.         //初始化-- ENCRYPT_MODE:加密模式, key:密鑰,iv:初始化向量  
            44.         c.init(Cipher.ENCRYPT_MODE, key, iv);    
            45.         byte[] srcByte = src.getBytes();    
            46.         //加密  
            47.         byte[] targetByte = c.doFinal(srcByte);   
            48.         //Base64編碼  
            49.         String targetString = new BASE64Encoder().encode(targetByte);  
            50.         return targetString;    
            51.     }    
            52.     
            53.     /**  
            54.      * DES解密  
            55.      */    
            56.     public String decrypt(String srcString) throws InvalidKeyException, IllegalBlockSizeException, BadPaddingException, IOException, InvalidAlgorithmParameterException {    
            57.         //初始化-- DECRYPT_MODE:解密模式, key:密鑰,iv:初始化向量  
            58.         c.init(Cipher.DECRYPT_MODE, key, iv);   
            59.         //Base64解碼  
            60.         byte[] srcByte = new BASE64Decoder().decodeBuffer(srcString);  
            61.         //解密  
            62.         byte[] targetByte = c.doFinal(srcByte);    
            63.         return new String(targetByte);    
            64.     }    
            65.     
            66.     public static void main(String[] args) throws Exception {    
            67.         SecurityTest test = new SecurityTest();    
            68.         String src = "使用JKD進(jìn)行加解密--DES算法測(cè)試!__小印";    
            69.         System.out.println("原文:" + src);  
            70.         String secret = test.encrypt(src);      
            71.         System.out.println("密文:" + secret);   
            72.         String target = test.decrypt(secret);  
            73.         System.out.println("解密得到原文:" + target);    
            74.     }   

            我本機(jī)運(yùn)行結(jié)果為:

            1. 原文:使用JKD進(jìn)行加解密--DES算法測(cè)試!__小印  
            2. 密文:P8Xi4Jfvq9Eus0c1OTE32wK60rjHwPxZ8tRiElxOd5m69+vI37IGtw==  
            3. 解密得到原文:使用JKD進(jìn)行加解密--DES算法測(cè)試!__小印  

            注意:本文采用的是隨機(jī)密鑰,所以每次運(yùn)行得到的密文是不一樣的,jdk也提供自定義的密鑰 ^_^
            posted on 2013-06-27 08:05 逛奔的蝸牛 閱讀(3410) 評(píng)論(0)  編輯 收藏 引用 所屬分類: Java
            国产综合免费精品久久久| 久久夜色精品国产噜噜噜亚洲AV| 久久人人爽人人爽人人片AV不| 伊人久久无码中文字幕| 久久精品人人槡人妻人人玩AV| 久久精品国产亚洲AV无码偷窥| 国产精品久久久久一区二区三区| 色偷偷91久久综合噜噜噜噜| 国内精品久久久久影院薰衣草| 91精品国产乱码久久久久久| 久久免费观看视频| 91精品国产乱码久久久久久| 中文精品99久久国产| 久久精品中文字幕久久| 久久精品日日躁夜夜躁欧美| 91久久国产视频| 久久精品中文字幕无码绿巨人| 久久综合五月丁香久久激情| 国产精品久久免费| 久久丝袜精品中文字幕| 国产一区二区精品久久| 久久亚洲AV成人无码国产 | 久久久精品国产亚洲成人满18免费网站| 久久精品中文字幕第23页| 69SEX久久精品国产麻豆| 色偷偷偷久久伊人大杳蕉| 久久久黄色大片| 日韩亚洲国产综合久久久| 国产精品九九久久免费视频| 久久国产精品久久国产精品| 久久精品国产99久久久| 亚洲AV无码成人网站久久精品大| 久久久久久久综合狠狠综合| 久久久久久久91精品免费观看| 亚洲国产精品无码久久青草| 欧美一级久久久久久久大| 欧美性猛交xxxx免费看久久久| 日韩欧美亚洲国产精品字幕久久久 | 亚洲国产成人久久精品99| 久久久久黑人强伦姧人妻| 国产精品久久久久乳精品爆 |