日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

对称加密算法-DES以及DESede算法

發(fā)布時間:2025/3/15 编程问答 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 对称加密算法-DES以及DESede算法 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一、簡述

? 對稱加密算法就是能將數(shù)據(jù)加解密。加密的時候用密鑰對數(shù)據(jù)進行加密,解密的時候使用同樣的密鑰對數(shù)據(jù)進行解密。

? DES是美國國家標準研究所提出的算法。因為加解密的數(shù)據(jù)安全性和密鑰長度成正比。des的56位的密鑰已經(jīng)形成安全隱患,在1998年之后就很少被采用。但是一些老舊的系統(tǒng)還在使用。因為這個des算法并沒有被美國標準委員會公布全部算法,大家一致懷疑被留了后門。所以慢慢就被淘汰掉了。

? 后來針對des算法進行了改進,有了三重des算法(DESede)。針對des算法的密鑰長度較短以及迭代次數(shù)偏少問題做了相應改進,提高了安全強度。不過desede算法處理速度較慢,密鑰計算時間較長,加密效率不高問題使得對稱加密算法的發(fā)展不容樂觀。

二、交互模型

1、消息傳遞雙方約定密鑰,通常由消息發(fā)送方(甲方)構建密鑰通知消息接收方(乙方)

2、甲方使用密鑰對數(shù)據(jù)記性加密,然后將加密后的數(shù)據(jù)通過網(wǎng)絡傳送給乙方

3、乙方接收到數(shù)據(jù),然后使用約定的密鑰對數(shù)據(jù)進行解密

?

整個模型很像hmac的數(shù)據(jù)交互過程,都是一個密鑰的概念,而且密鑰都是雙方知道的。但是hmac算法是信息摘要的獲取。這邊是對數(shù)據(jù)進行加解密

?

三、java6和bouncycastle針對des算法的數(shù)據(jù)加密支持還是不同的。體現(xiàn)在密鑰長度,工作模式以及填充方式上。這里bouncycastle的密鑰長度是64位。不過在DESede算法上bouncy castle也是密鑰長度比java6的密鑰長度要長。

??? 不過所有的對稱加密算法的實現(xiàn)還是類似的??梢詤⒖慈缦碌拇a:

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;??
  • /**?
  • ?*?DES對稱加密算法?
  • ?*?@author?kongqz?
  • ?*?*/??
  • public?class?DESCoder?{??
  • ????/**?
  • ?????*?密鑰算法?
  • ?????*?java支持56位密鑰,bouncycastle支持64位?
  • ?????*?*/??
  • ????public?static?final?String?KEY_ALGORITHM="DES";??
  • ??????
  • ????/**?
  • ?????*?加密/解密算法/工作模式/填充方式?
  • ?????*?*/??
  • ????public?static?final?String?CIPHER_ALGORITHM="DES/ECB/PKCS5Padding";??
  • ??????
  • ????/**?
  • ?????*??
  • ?????*?生成密鑰,java6只支持56位密鑰,bouncycastle支持64位密鑰?
  • ?????*?@return?byte[]?二進制密鑰?
  • ?????*?*/??
  • ????public?static?byte[]?initkey()?throws?Exception{??
  • ??????????
  • ????????//實例化密鑰生成器??
  • ????????KeyGenerator?kg=KeyGenerator.getInstance(KEY_ALGORITHM);??
  • ????????//初始化密鑰生成器??
  • ????????kg.init(56);??
  • ????????//生成密鑰??
  • ????????SecretKey?secretKey=kg.generateKey();??
  • ????????//獲取二進制密鑰編碼形式??
  • ????????return?secretKey.getEncoded();??
  • ????}??
  • ????/**?
  • ?????*?轉(zhuǎn)換密鑰?
  • ?????*?@param?key?二進制密鑰?
  • ?????*?@return?Key?密鑰?
  • ?????*?*/??
  • ????public?static?Key?toKey(byte[]?key)?throws?Exception{??
  • ????????//實例化Des密鑰??
  • ????????DESKeySpec?dks=new?DESKeySpec(key);??
  • ????????//實例化密鑰工廠??
  • ????????SecretKeyFactory?keyFactory=SecretKeyFactory.getInstance(KEY_ALGORITHM);??
  • ????????//生成密鑰??
  • ????????SecretKey?secretKey=keyFactory.generateSecret(dks);??
  • ????????return?secretKey;??
  • ????}??
  • ??????
  • ????/**?
  • ?????*?加密數(shù)據(jù)?
  • ?????*?@param?data?待加密數(shù)據(jù)?
  • ?????*?@param?key?密鑰?
  • ?????*?@return?byte[]?加密后的數(shù)據(jù)?
  • ?????*?*/??
  • ????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);??
  • ????????//執(zhí)行操作??
  • ????????return?cipher.doFinal(data);??
  • ????}??
  • ????/**?
  • ?????*?解密數(shù)據(jù)?
  • ?????*?@param?data?待解密數(shù)據(jù)?
  • ?????*?@param?key?密鑰?
  • ?????*?@return?byte[]?解密后的數(shù)據(jù)?
  • ?????*?*/??
  • ????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);??
  • ????????//執(zhí)行操作??
  • ????????return?cipher.doFinal(data);??
  • ????}??
  • ????/**?
  • ?????*?@param?args?
  • ?????*?@throws?Exception??
  • ?????*/??
  • ????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));??
  • ????????//加密數(shù)據(jù)??
  • ????????byte[]?data=DESCoder.encrypt(str.getBytes(),?key);??
  • ????????System.out.println("加密后:"+Base64.encodeBase64String(data));??
  • ????????//解密數(shù)據(jù)??
  • ????????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;??
  • /**?
  • ?*?DESede對稱加密算法演示?
  • ?*?@author?kongqz?
  • ?*?*/??
  • public?class?DESedeCoder?{??
  • ????/**?
  • ?????*?密鑰算法?
  • ?????*?*/??
  • ????public?static?final?String?KEY_ALGORITHM="DESede";??
  • ??????
  • ????/**?
  • ?????*?加密/解密算法/工作模式/填充方式?
  • ?????*?*/??
  • ????public?static?final?String?CIPHER_ALGORITHM="DESede/ECB/PKCS5Padding";??
  • ??????
  • ????/**?
  • ?????*??
  • ?????*?生成密鑰?
  • ?????*?@return?byte[]?二進制密鑰?
  • ?????*?*/??
  • ????public?static?byte[]?initkey()?throws?Exception{??
  • ??????????
  • ????????//實例化密鑰生成器??
  • ????????KeyGenerator?kg=KeyGenerator.getInstance(KEY_ALGORITHM);??
  • ????????//初始化密鑰生成器??
  • ????????kg.init(168);??
  • ????????//生成密鑰??
  • ????????SecretKey?secretKey=kg.generateKey();??
  • ????????//獲取二進制密鑰編碼形式??
  • ????????return?secretKey.getEncoded();??
  • ????}??
  • ????/**?
  • ?????*?轉(zhuǎn)換密鑰?
  • ?????*?@param?key?二進制密鑰?
  • ?????*?@return?Key?密鑰?
  • ?????*?*/??
  • ????public?static?Key?toKey(byte[]?key)?throws?Exception{??
  • ????????//實例化Des密鑰??
  • ????????DESedeKeySpec?dks=new?DESedeKeySpec(key);??
  • ????????//實例化密鑰工廠??
  • ????????SecretKeyFactory?keyFactory=SecretKeyFactory.getInstance(KEY_ALGORITHM);??
  • ????????//生成密鑰??
  • ????????SecretKey?secretKey=keyFactory.generateSecret(dks);??
  • ????????return?secretKey;??
  • ????}??
  • ??????
  • ????/**?
  • ?????*?加密數(shù)據(jù)?
  • ?????*?@param?data?待加密數(shù)據(jù)?
  • ?????*?@param?key?密鑰?
  • ?????*?@return?byte[]?加密后的數(shù)據(jù)?
  • ?????*?*/??
  • ????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);??
  • ????????//執(zhí)行操作??
  • ????????return?cipher.doFinal(data);??
  • ????}??
  • ????/**?
  • ?????*?解密數(shù)據(jù)?
  • ?????*?@param?data?待解密數(shù)據(jù)?
  • ?????*?@param?key?密鑰?
  • ?????*?@return?byte[]?解密后的數(shù)據(jù)?
  • ?????*?*/??
  • ????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);??
  • ????????//執(zhí)行操作??
  • ????????return?cipher.doFinal(data);??
  • ????}??
  • ????/**?
  • ?????*?進行加解密的測試?
  • ?????*?@throws?Exception??
  • ?????*/??
  • ????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));??
  • ????????//加密數(shù)據(jù)??
  • ????????byte[]?data=DESedeCoder.encrypt(str.getBytes(),?key);??
  • ????????System.out.println("加密后:/t"+Base64.encodeBase64String(data));??
  • ????????//解密數(shù)據(jù)??
  • ????????data=DESedeCoder.decrypt(data,?key);??
  • ????????System.out.println("解密后:/t"+new?String(data));??
  • ????}??
  • }??
  • 控制臺輸出結果:??
  • 原文:?DESede??
  • 密鑰:?BBDmwTjBsF7IwTIyGWt1bmFntRyUgMQL??
  • 加密后:????FM/DsEv3KgM=??
  • 解密后:????DESede??
  • 四、總結

    1、主要看設定密鑰的長度的變化。同時,bouncycastle支持更多的填充模式,在相同算法上比java6實現(xiàn)的版本的密鑰長度要長

    2、java的api中僅僅提供了DES,DESede和PBE 3三種對稱加密算法密鑰材料實現(xiàn)類

    總結

    以上是生活随笔為你收集整理的对称加密算法-DES以及DESede算法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。