Java中的加密與解密

pucheung發表於2015-04-11

     Java中的加密與解密主要對資料的安全性提供保障,分為對稱和非對稱的,對稱表示加密金鑰和解密金鑰是同一個金鑰,因此也常常稱作私密金鑰或祕密金鑰,非對稱金鑰表示加密金鑰和解密為兩個不同的金鑰,一個為公共金鑰,另一個則為私密金鑰。對稱加密解密演算法有DES、AES等,非對稱加密解密演算法有RSA、DH等。對於資料的加密與解密我們通常通過生成金鑰,然後通過加密與解密操作類利用金鑰對資料進行加密與解密,接下來我們看看Java中如何實現對稱、非對稱加密與解密。

   對稱加密與解密:通過KeyGenerator(金鑰生成器)生成Key(金鑰),然後通過Cipher(加密解密操作類)進行對資料的加密與解密。

     例子:

            KeyGenerator kg=KeyGenerator.getInstance("DES");//獲得指定演算法的金鑰生成器
    kg.init(56);//金鑰生成器初始化,指定生成金鑰的長度
   Key key=kg.generateKey();//獲得金鑰

   Cipher cp=Cipher.getInstance("DES");//獲得指定演算法的加密解密操作類
   cp.init(Cipher.ENCRYPT_MODE, key);//通過金鑰對其進行初始化,初始化為加密操作類
   byte[] b=cp.doFinal("hello".getBytes());//對資料進行加密
   System.out.println(new String(b));
   
   cp.init(Cipher.DECRYPT_MODE, key);//通過金鑰對其進行初始化,初始化為解密操作類
   System.out.println(new String(cp.doFinal(b)));//對資料進行解密


   非對稱加密與解密:通過KeyPairGenerator(金鑰生成器)生成KeyPair(金鑰),然後通過KeyPair得到公共金鑰和私密金鑰,最後通過Cipher(加密解密操作類)利用公共金鑰和私密金鑰對資料的加密與解密。

       KeyPairGenerator kpg=KeyPairGenerator.getInstance("RSA");
    kpg.initialize(512);
        KeyPair kp=kpg.generateKeyPair();
        
        Cipher c=Cipher.getInstance("RSA");
        c.init(Cipher.ENCRYPT_MODE, kp.getPrivate());
        byte[] b=c.doFinal("zhangsan".getBytes());
        
        System.out.println(new String(b));
        
        c.init(Cipher.DECRYPT_MODE, kp.getPublic());
        System.out.println(new String(c.doFinal(b)));

     

   資料安全性得到保障但是對於資料的完整性又是如何保障的呢?對於提供了訊息摘要和數字簽名兩種方式來保障。訊息摘要就是通過資訊生成的雜湊值,例如A將資料傳送給B,A會將資訊和訊息摘要一起傳送過去,B接受到資訊之後,利用資訊生成訊息摘要,然後與接受到的訊息摘要相比是否一致。數字簽名既保證了資訊的完整性,也保證了資料的不可偽造性,同樣是利用訊息生成簽名,與訊息一起傳送過去,收到訊息與簽名之後,利用訊息來驗證簽名。

  訊息摘要:  

              MessageDigest md=MessageDigest.getInstance("MD5");
     md.update("zhangsan".getBytes());
    System.out.println(new String(md.digest()));//生成訊息摘要
   md.reset();//用於重置MessageDigest,其實當我們呼叫digest()方法之後就重置了Messagedigest
   System.out.println(new String(md.digest("zhangsan".getBytes())));

          /**
* MessageDigest用於產生訊息摘要,也稱為雜湊值、雜湊值,用於產生該摘要的演算法稱為雜湊函式、雜湊函式,主要用於保證
* 資料的完整性,在同一個雜湊函式情況下,只有相同的訊息才能產生相同的摘要,傳送發將訊息和摘要傳送個接收方,接受者接受
* 到訊息後使用傳送發相同的雜湊函式產生訊息摘要,並且與接收到的訊息摘要相比,對比是否相同。
*/

     數字簽名:與訊息摘要不同,數字簽名通過公共金鑰生成和驗證

                byte[] message="hello".getBytes();
KeyPairGenerator kpg=KeyPairGenerator.getInstance("DSA");
kpg.initialize(1024);
KeyPair kp=kpg.generateKeyPair();
Signature sign=Signature.getInstance(kpg.getAlgorithm());

               //通過私密金鑰生成簽名
sign.initSign(kp.getPrivate());
sign.update(message);
               byte[] s=sign.sign(); //生成簽名

             //通過公共金鑰驗證簽名
               sign.initVerify(kp.getPublic());
               sign.update(message);
               System.out.println(sign.verify(s));//驗證簽名


 我們在使用的過程中可能還會接觸到Provider(安全機制提供者),簡單的來理解就是提供加密解密演算法方,在生成私密金鑰生成器和公共金鑰生成器的時候可能會用到,Provider繼承Properties,因此可以向Properties一樣使用。Security(對提供者的操作類),用於對提供者進行管理(查詢、刪除、增加)。JDK內建很多提供者,通過以下的方法可以查詢出來

               Provider[] ps=Security.getProviders();
System.out.println(ps.length);
for(Provider p:ps)
{
   Set<Entry<Object, Object>> entry=p.entrySet();
   for(Entry<Object,Object> e:entry)
    System.out.println(e.getKey()+"  "+e.getValue());
}



     

相關文章