最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解DES加密算法的原理與Java實現

 更新時間:2022年10月28日 08:51:37   作者:鴨血粉絲Tang  
DES 加密,是對稱加密。對稱加密,顧名思義,加密和解密的運算全都是使用的同樣的秘鑰。這篇文章主要為大家講講DES加密算法的原理與Java實現,需要的可以參考一下

前面阿粉說了關于 MD5 加密算法,還有 RSA 加密算法的實現,以及他們的前世今生,今天阿粉在來說一下這個關于 DES 加密算法,又是怎么實現的。

DES加密算法

DES 加密,是對稱加密,之前阿粉也已經說了這個對稱加密和非對稱加密都是代表了什么意思,對稱加密,顧名思義,加密和解密的運算全都是使用的同樣的秘鑰。

DES加密算法原始思想可以參照二戰(zhàn)德國的恩格瑪機,其基本思想大致相同。傳統(tǒng)的密碼加密都是由古代的循環(huán)移位思想而來,恩格瑪機在這個基礎之上進行了擴散模糊。但是本質原理都是一樣的。現代DES在二進制級別做著同樣的事:替代模糊,增加分析的難度。

DES概述圖

DES加密原理

DES 使用一個 56 位的密鑰以及附加的 8 位奇偶校驗位,產生最大 64 位的分組大小。

這是一個迭代的分組密碼,使用稱為 Feistel 的技術,其中將加密的文本塊分成兩半。

使用子密鑰對其中一半應用循環(huán)功能,然后將輸出與另一半進行“異或”運算;接著交換這兩半,這一過程會繼續(xù)下去,但最后一個循環(huán)不交換。

DES 使用 16 個循環(huán),使用異或,置換,代換,移位操作四種基本運算。

雖然現在 DES 加密已經被破解,但是如果保密級別不是很高的話,依然是可以使用的。

既然我們已經知道DES 加密的過程是從明文64位開始,然后到初始置換IP,之后生成子秘鑰,然后在秘鑰控制下進行16輪加密轉換,再做一次交換左右32比特,最后進行逆初始置換IP,最后返回密文的64位。

就像下面的圖:

具體的算法,阿粉暫時不說,直接開始我們的 Java 代碼實現。

DES 加密算法Java實現

public?class?DESUtil?{
?
????/**
?????*?偏移變量,固定占8位字節(jié)
?????*/
????private?final?static?String?IV_PARAMETER?=?"12345678";
????/**
?????*?密鑰算法
?????*/
????private?static?final?String?ALGORITHM?=?"DES";
????/**
?????*?加密/解密算法-工作模式-填充模式
?????*/
????private?static?final?String?CIPHER_ALGORITHM?=?"DES/CBC/PKCS5Padding";
????/**
?????*?默認編碼
?????*/
????private?static?final?String?CHARSET?=?"utf-8";
?
????/**
?????*?生成key
?????*
?????*?@param?password
?????*?@return
?????*?@throws?Exception
?????*/
????private?static?Key?generateKey(String?password)?throws?Exception?{
????????DESKeySpec?dks?=?new?DESKeySpec(password.getBytes(CHARSET));
????????SecretKeyFactory?keyFactory?=?SecretKeyFactory.getInstance(ALGORITHM);
????????return?keyFactory.generateSecret(dks);
????}
?
?
????/**
?????*?DES加密字符串
?????*
?????*?@param?password?加密密碼,長度不能夠小于8位
?????*?@param?data?待加密字符串
?????*?@return?加密后內容
?????*/
????public?static?String?encrypt(String?password,?String?data)?{
????????if?(password==?null?||?password.length()?<?8)?{
????????????throw?new?RuntimeException("加密失敗,key不能小于8位");
????????}
????????if?(data?==?null)
????????????return?null;
????????try?{
????????????Key?secretKey?=?generateKey(password);
????????????Cipher?cipher?=?Cipher.getInstance(CIPHER_ALGORITHM);
????????????IvParameterSpec?iv?=?new?IvParameterSpec(IV_PARAMETER.getBytes(CHARSET));
????????????cipher.init(Cipher.ENCRYPT_MODE,?secretKey,?iv);
????????????byte[]?bytes?=?cipher.doFinal(data.getBytes(CHARSET));
?
????????????//JDK1.8及以上可直接使用Base64,JDK1.7及以下可以使用BASE64Encoder
????????????//Android平臺可以使用android.util.Base64
????????????return?new?String(Base64.getEncoder().encode(bytes));
?
????????}?catch?(Exception?e)?{
????????????e.printStackTrace();
????????????return?data;
????????}
????}
?
????/**
?????*?DES解密字符串
?????*
?????*?@param?password?解密密碼,長度不能夠小于8位
?????*?@param?data?待解密字符串
?????*?@return?解密后內容
?????*/
????public?static?String?decrypt(String?password,?String?data)?{
????????if?(password==?null?||?password.length()?<?8)?{
????????????throw?new?RuntimeException("加密失敗,key不能小于8位");
????????}
????????if?(data?==?null)
????????????return?null;
????????try?{
????????????Key?secretKey?=?generateKey(password);
????????????Cipher?cipher?=?Cipher.getInstance(CIPHER_ALGORITHM);
????????????IvParameterSpec?iv?=?new?IvParameterSpec(IV_PARAMETER.getBytes(CHARSET));
????????????cipher.init(Cipher.DECRYPT_MODE,?secretKey,?iv);
????????????return?new?String(cipher.doFinal(Base64.getDecoder().decode(data.getBytes(CHARSET))),?CHARSET);
????????}?catch?(Exception?e)?{
????????????e.printStackTrace();
????????????return?data;
????????}
????}
?
????/**
?????*?DES加密文件
?????*
?????*?@param?srcFile??待加密的文件
?????*?@param?destFile?加密后存放的文件路徑
?????*?@return?加密后的文件路徑
?????*/
????public?static?String?encryptFile(String?password,?String?srcFile,?String?destFile)?{
?
????????if?(password==?null?||?password.length()?<?8)?{
????????????throw?new?RuntimeException("加密失敗,key不能小于8位");
????????}
????????try?{
????????????IvParameterSpec?iv?=?new?IvParameterSpec(IV_PARAMETER.getBytes(CHARSET));
????????????Cipher?cipher?=?Cipher.getInstance(CIPHER_ALGORITHM);
????????????cipher.init(Cipher.ENCRYPT_MODE,?generateKey(key),?iv);
????????????InputStream?is?=?new?FileInputStream(srcFile);
????????????OutputStream?out?=?new?FileOutputStream(destFile);
????????????CipherInputStream?cis?=?new?CipherInputStream(is,?cipher);
????????????byte[]?buffer?=?new?byte[1024];
????????????int?r;
????????????while?((r?=?cis.read(buffer))?>?0)?{
????????????????out.write(buffer,?0,?r);
????????????}
????????????cis.close();
????????????is.close();
????????????out.close();
????????????return?destFile;
????????}?catch?(Exception?ex)?{
????????????ex.printStackTrace();
????????}
????????return?null;
????}
?
????/**
?????*?DES解密文件
?????*
?????*?@param?srcFile??已加密的文件
?????*?@param?destFile?解密后存放的文件路徑
?????*?@return?解密后的文件路徑
?????*/
????public?static?String?decryptFile(String?password,?String?srcFile,?String?destFile)?{
????????if?(password==?null?||?password.length()?<?8)?{
????????????throw?new?RuntimeException("加密失敗,key不能小于8位");
????????}
????????try?{
????????????File?file?=?new?File(destFile);
????????????if?(!file.exists())?{
????????????????file.getParentFile().mkdirs();
????????????????file.createNewFile();
????????????}
????????????IvParameterSpec?iv?=?new?IvParameterSpec(IV_PARAMETER.getBytes(CHARSET));
????????????Cipher?cipher?=?Cipher.getInstance(CIPHER_ALGORITHM);
????????????cipher.init(Cipher.DECRYPT_MODE,?generateKey(key),?iv);
????????????InputStream?is?=?new?FileInputStream(srcFile);
????????????OutputStream?out?=?new?FileOutputStream(destFile);
????????????CipherOutputStream?cos?=?new?CipherOutputStream(out,?cipher);
????????????byte[]?buffer?=?new?byte[1024];
????????????int?r;
????????????while?((r?=?is.read(buffer))?>=?0)?{
????????????????cos.write(buffer,?0,?r);
????????????}
????????????cos.close();
????????????is.close();
????????????out.close();
????????????return?destFile;
????????}?catch?(Exception?ex)?{
????????????ex.printStackTrace();
????????}
????????return?null;
????}
}

其實 DES 加密過程如果要是簡化出來的話,無非就是那么幾步。

第一步:明文根據IP置換,變成新的明文,得到一個亂序的64 bit 明文組。

將新得到的加密明文分成兩個部分,Lo和Ro。

第二步:子秘鑰生成,DES加密過程有16輪循環(huán)函數,其中需要用到16個密鑰,所以要將這56 bit密鑰擴展生成16個48 bit 的子密鑰。

第三步:得到16個子密鑰K

第四步:S盒代換數據

第五步:P盒代換,P為固定置換,將經過S盒變換得到的32 bit進行一個置換操作。至此,得到F函數的最終輸出。

第六步:循環(huán)16次

第七步:IP的逆置換

最后輸出64位的比特密文。

就這么簡單,如果你要是理解了的話,那就沒那么多問題了。

到此這篇關于詳解DES加密算法的原理與Java實現的文章就介紹到這了,更多相關Java DES加密算法內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Java Optional<Foo>轉換成List<Bar>的實例方法

    Java Optional<Foo>轉換成List<Bar>的實例方法

    在本篇內容里小編給大家整理的是一篇關于Java Optional<Foo>轉換成List<Bar>的實例方法,有需要的朋友們可以跟著學習下。
    2021-06-06
  • 關于@RequestLine的使用及配置

    關于@RequestLine的使用及配置

    這篇文章主要介紹了關于@RequestLine的使用及配置方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • 淺談java多線程wait,notify

    淺談java多線程wait,notify

    這篇文章主要介紹了java多線程wait,notify,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,下面小編和大家一起來學習一下吧
    2019-05-05
  • BeanUtils.copyProperties()所有的空值不復制問題

    BeanUtils.copyProperties()所有的空值不復制問題

    這篇文章主要介紹了BeanUtils.copyProperties()所有的空值不復制問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • SpringBoot定制JSON響應數據的實現

    SpringBoot定制JSON響應數據的實現

    本文主要介紹了SpringBoot定制JSON響應數據的實現,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2025-02-02
  • Java使用HttpClient實現文件下載

    Java使用HttpClient實現文件下載

    這篇文章主要為大家詳細介紹了Java使用HttpClient實現文件下載,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • 解決JDK21中用不了TimeUtild問題

    解決JDK21中用不了TimeUtild問題

    在使用TimeUtil時,可能因為IDE版本不兼容導致問題,升級IDEA到2023.2以上版本可解決此問題,詳細步驟可以通過評論區(qū)索取安裝包或直接從官網下載,分享個人經驗,希望對大家有幫助
    2024-10-10
  • java基本教程之join方法詳解 java多線程教程

    java基本教程之join方法詳解 java多線程教程

    本文對java Thread中join()方法進行介紹,join()的作用是讓“主線程”等待“子線程”結束之后才能繼續(xù)運行,大家參考使用吧
    2014-01-01
  • 只需兩步實現Eclipse+Maven快速構建第一個Spring Boot項目

    只需兩步實現Eclipse+Maven快速構建第一個Spring Boot項目

    這篇文章主要介紹了只需兩步實現Eclipse+Maven快速構建第一個Spring Boot項目,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-12-12
  • Java實現異步延遲隊列的方法詳解

    Java實現異步延遲隊列的方法詳解

    目前系統(tǒng)中有很多需要用到延時處理的功能,本文就為大家介紹了Java實現異步延遲隊列的方法,文中的示例代碼講解詳細,需要的可以參考一下
    2023-03-03

最新評論

龙江县| 和顺县| 西城区| 万全县| 个旧市| 贵港市| 视频| 英山县| 扎兰屯市| 鄂州市| 天长市| 屏东市| 颍上县| 郴州市| 横山县| 吴忠市| 五大连池市| 遵义市| 曲松县| 昭平县| 荆州市| 黑河市| 无锡市| 海淀区| 中宁县| 西峡县| 双城市| 南投市| 尉氏县| 达拉特旗| 通辽市| 房产| 米林县| 荆州市| 科技| 罗江县| 积石山| 太康县| 布拖县| 舒兰市| 长垣县|