生活随笔
收集整理的這篇文章主要介紹了
对称加密算法-DES以及DESede算法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、簡述
? 對稱加密算法就是能將數據加解密。加密的時候用密鑰對數據進行加密,解密的時候使用同樣的密鑰對數據進行解密。
? DES是美國國家標準研究所提出的算法。因為加解密的數據安全性和密鑰長度成正比。des的56位的密鑰已經形成安全隱患,在1998年之后就很少被采用。但是一些老舊的系統還在使用。因為這個des算法并沒有被美國標準委員會公布全部算法,大家一致懷疑被留了后門。所以慢慢就被淘汰掉了。
? 后來針對des算法進行了改進,有了三重des算法(DESede)。針對des算法的密鑰長度較短以及迭代次數偏少問題做了相應改進,提高了安全強度。不過desede算法處理速度較慢,密鑰計算時間較長,加密效率不高問題使得對稱加密算法的發展不容樂觀。
二、交互模型
1、消息傳遞雙方約定密鑰,通常由消息發送方(甲方)構建密鑰通知消息接收方(乙方)
2、甲方使用密鑰對數據記性加密,然后將加密后的數據通過網絡傳送給乙方
3、乙方接收到數據,然后使用約定的密鑰對數據進行解密
?
整個模型很像hmac的數據交互過程,都是一個密鑰的概念,而且密鑰都是雙方知道的。但是hmac算法是信息摘要的獲取。這邊是對數據進行加解密
?
三、java6和bouncycastle針對des算法的數據加密支持還是不同的。體現在密鑰長度,工作模式以及填充方式上。這里bouncycastle的密鑰長度是64位。不過在DESede算法上bouncy castle也是密鑰長度比java6的密鑰長度要長。
??? 不過所有的對稱加密算法的實現還是類似的。可以參看如下的代碼:
1、des算法
[java] view plaincopy
package?com.ca.test;??import?java.security.Key;??import?javax.crypto.Cipher;??import?javax.crypto.KeyGenerator;??import?javax.crypto.SecretKey;??import?javax.crypto.SecretKeyFactory;??import?javax.crypto.spec.DESKeySpec;??import?org.apache.commons.codec.binary.Base64;???????public?class?DESCoder?{???????????????public?static?final?String?KEY_ALGORITHM="DES";????????????????????public?static?final?String?CIPHER_ALGORITHM="DES/ECB/PKCS5Padding";??????????????????????public?static?byte[]?initkey()?throws?Exception{??????????????????????????????KeyGenerator?kg=KeyGenerator.getInstance(KEY_ALGORITHM);????????????????????kg.init(56);????????????????????SecretKey?secretKey=kg.generateKey();????????????????????return?secretKey.getEncoded();??????}????????????????public?static?Key?toKey(byte[]?key)?throws?Exception{????????????????????DESKeySpec?dks=new?DESKeySpec(key);????????????????????SecretKeyFactory?keyFactory=SecretKeyFactory.getInstance(KEY_ALGORITHM);????????????????????SecretKey?secretKey=keyFactory.generateSecret(dks);??????????return?secretKey;??????}???????????????????????public?static?byte[]?encrypt(byte[]?data,byte[]?key)?throws?Exception{????????????????????Key?k=toKey(key);????????????????????Cipher?cipher=Cipher.getInstance(CIPHER_ALGORITHM);????????????????????cipher.init(Cipher.ENCRYPT_MODE,?k);????????????????????return?cipher.doFinal(data);??????}?????????????????public?static?byte[]?decrypt(byte[]?data,byte[]?key)?throws?Exception{????????????????????Key?k?=toKey(key);????????????????????Cipher?cipher=Cipher.getInstance(CIPHER_ALGORITHM);????????????????????cipher.init(Cipher.DECRYPT_MODE,?k);????????????????????return?cipher.doFinal(data);??????}???????????????public?static?void?main(String[]?args)?throws?Exception?{??????????String?str="DES";??????????System.out.println("原文:"+str);????????????????????byte[]?key=DESCoder.initkey();??????????System.out.println("密鑰:"+Base64.encodeBase64String(key));????????????????????byte[]?data=DESCoder.encrypt(str.getBytes(),?key);??????????System.out.println("加密后:"+Base64.encodeBase64String(data));????????????????????data=DESCoder.decrypt(data,?key);??????????System.out.println("解密后:"+new?String(data));??????}??}??控制臺輸出結果:??原文:DES??密鑰:ocewbYVbtmE=??加密后:w6KsVSkLV3Q=??解密后:DES??
2、desede算法演示
[java] view plaincopy
package?com.ca.test;??import?java.security.Key;??import?javax.crypto.Cipher;??import?javax.crypto.KeyGenerator;??import?javax.crypto.SecretKey;??import?javax.crypto.SecretKeyFactory;??import?javax.crypto.spec.DESedeKeySpec;??import?org.apache.commons.codec.binary.Base64;???????public?class?DESedeCoder?{??????????????public?static?final?String?KEY_ALGORITHM="DESede";????????????????????public?static?final?String?CIPHER_ALGORITHM="DESede/ECB/PKCS5Padding";??????????????????????public?static?byte[]?initkey()?throws?Exception{??????????????????????????????KeyGenerator?kg=KeyGenerator.getInstance(KEY_ALGORITHM);????????????????????kg.init(168);????????????????????SecretKey?secretKey=kg.generateKey();????????????????????return?secretKey.getEncoded();??????}????????????????public?static?Key?toKey(byte[]?key)?throws?Exception{????????????????????DESedeKeySpec?dks=new?DESedeKeySpec(key);????????????????????SecretKeyFactory?keyFactory=SecretKeyFactory.getInstance(KEY_ALGORITHM);????????????????????SecretKey?secretKey=keyFactory.generateSecret(dks);??????????return?secretKey;??????}???????????????????????public?static?byte[]?encrypt(byte[]?data,byte[]?key)?throws?Exception{????????????????????Key?k=toKey(key);????????????????????Cipher?cipher=Cipher.getInstance(CIPHER_ALGORITHM);????????????????????cipher.init(Cipher.ENCRYPT_MODE,?k);????????????????????return?cipher.doFinal(data);??????}?????????????????public?static?byte[]?decrypt(byte[]?data,byte[]?key)?throws?Exception{????????????????????Key?k?=toKey(key);????????????????????Cipher?cipher=Cipher.getInstance(CIPHER_ALGORITHM);????????????????????cipher.init(Cipher.DECRYPT_MODE,?k);????????????????????return?cipher.doFinal(data);??????}???????????????public?static?void?main(String[]?args)?throws?Exception?{??????????String?str="DESede";??????????System.out.println("原文:/t"+str);????????????????????byte[]?key=DESedeCoder.initkey();??????????System.out.println("密鑰:/t"+Base64.encodeBase64String(key));????????????????????byte[]?data=DESedeCoder.encrypt(str.getBytes(),?key);??????????System.out.println("加密后:/t"+Base64.encodeBase64String(data));????????????????????data=DESedeCoder.decrypt(data,?key);??????????System.out.println("解密后:/t"+new?String(data));??????}??}??控制臺輸出結果:??原文:?DESede??密鑰:?BBDmwTjBsF7IwTIyGWt1bmFntRyUgMQL??加密后:????FM/DsEv3KgM=??解密后:????DESede??
四、總結
1、主要看設定密鑰的長度的變化。同時,bouncycastle支持更多的填充模式,在相同算法上比java6實現的版本的密鑰長度要長
2、java的api中僅僅提供了DES,DESede和PBE 3三種對稱加密算法密鑰材料實現類
總結
以上是生活随笔為你收集整理的对称加密算法-DES以及DESede算法的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。