DES算法源代碼-JAVA_第1頁
DES算法源代碼-JAVA_第2頁
DES算法源代碼-JAVA_第3頁
DES算法源代碼-JAVA_第4頁
DES算法源代碼-JAVA_第5頁
已閱讀5頁,還剩4頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、DES算法提供 CBC, OFB, CFB, ECB 四種模式,MAC是基于ECB實現(xiàn)的。一、數(shù)據(jù)補位DES數(shù)據(jù)加解密就是將數(shù)據(jù)按照8個字節(jié)一段進行DES加密或解密得到一段 8個字節(jié)的密文或者明文,最后一段不足8個字節(jié),按照需求補足 8個字節(jié)(通常補 00或者FF,根據(jù)實際要求不同)進行計算,之后按照順序將計算所得的數(shù)據(jù)連在一起即可。這里有個問題就是為什么要進行數(shù)據(jù)補位?主要原因是DES算法加解密時要求數(shù)據(jù)必須為8個字節(jié)。二、ECB模式DES ECB (電子密本方式)其實非常簡單,就是將數(shù)據(jù)按照8個字節(jié)一段進行 DES加 密或解密得到一段 8個字節(jié)的密文或者明文,最后一段不足 8個字節(jié),按照需

2、求補足 8個 字節(jié)進行計算,之后按照順序將計算所得的數(shù)據(jù)連在一起即可,各段數(shù)據(jù)之間互不影響。三、CBC模式DES CBC (密文分組鏈接方式)有點麻煩,它的實現(xiàn)機制使加密的各段數(shù)據(jù)之間有了 聯(lián)系。其實現(xiàn)的機理如下:加密步驟如下:1) 首先將數(shù)據(jù)按照8個字節(jié)一組進行分組得到 D1D2.Dn (若數(shù)據(jù)不是8的整數(shù)倍, 用指定的PADDING數(shù)據(jù)補位)2) 第一組數(shù)據(jù)D1與初始化向量I異或后的結果進行 DES加密得到第一組密文 C1 (初 始化向量I為全零)3) 第二組數(shù)據(jù)D2與第一組的加密結果 C1異或以后的結果進行 DES加密,得到第二 組密文C24)之后的數(shù)據(jù)以此類推,得到 Cn5)按順序連為

3、 C1C2C3.Cn即為加密結果。解密是加密的逆過程,步驟如下:)首先將數(shù)據(jù)按照 8個字節(jié)一組進行分組得到 C1C2C3.Cn2)將第一組數(shù)據(jù)進行解密后與初始化向量I進行異或得到第一組明文 D1 (注意:一定是先解密再異或)D23)將第二組數(shù)據(jù)C2進行解密后與第一組密文數(shù)據(jù)進行異或得到第二組數(shù)據(jù)4)之后依此類推,得到 Dn5)按順序連為 D1D2D3.Dn即為解密結果。這里注意一點,解密的結果并不一定是我們原來的加密數(shù)據(jù),可能還含有你補得位,定要把補位去掉才是你的原來的數(shù)據(jù)。* DES算法*/public class DES (/* return DES算法密鑰*/public static

4、byte generateKey() (try (/ DES算法要求有一個可信任的隨機數(shù)源SecureRandom sr = new SecureRandom();/生成一個DES算法的KeyGenerator對象KeyGenerator kg = KeyGenerator.getInstance("DES");kg.init(sr);/生成密鑰SecretKey secretKey = kg.generateKey();/獲取密鑰數(shù)據(jù)byte key = secretKey.getEncoded();return key; catch (NoSuchAlgorithmEx

5、ception e) (System.err.println("DES 算法,生成密鑰出錯!”);e.printStackTrace();return null;/*加密函數(shù)* param data*加密數(shù)據(jù)* param key*密鑰* return返回加密后的數(shù)據(jù)*/public static byte encrypt(byte data, byte key) (try (/ DES算法要求有一個可信任的隨機數(shù)源SecureRandom sr = new SecureRandom();/從原始密鑰數(shù)據(jù)創(chuàng)建DESKeySpec對象DESKeySpec dks = new DESKe

6、ySpec(key);/創(chuàng)建一個密匙工廠,然后用它把DESKeySpec轉換成/ 一個 SecretKey 對象SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");SecretKey secretKey = keyFactory.generateSecret(dks);/ using DES in ECB modeCipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");/用密匙初始化 Cipher對象cipher.

7、init(Cipher.ENCRYPT_MODE, secretKey, sr);/執(zhí)行加密操作byte encryptedData口 = cipher.doFinal(data);return encryptedData; catch (Exception e) System.err.println("DES 算法,加密數(shù)據(jù)出錯!");e.printStackTrace();return null;/*解密函數(shù)* param data*解密數(shù)據(jù)* param key*密鑰* return返回解密后的數(shù)據(jù)*/public static byte decrypt(byte d

8、ata, byte key) try (/ DES算法要求有一個可信任的隨機數(shù)源SecureRandom sr = new SecureRandom();/ byte rawKeyData口 = /*用某種方法獲取原始密匙數(shù)據(jù)*/;/從原始密匙數(shù)據(jù)創(chuàng)建一個DESKeySpec對象DESKeySpec dks = new DESKeySpec(key);/創(chuàng)建一個密匙工廠,然后用它把DESKeySpec對象轉換成/ 一個 SecretKey 對象SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");

9、SecretKey secretKey = keyFactory.generateSecret(dks);/ using DES in ECB modeCipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");/用密匙初始化 Cipher對象cipher.init(Cipher.DECRYPT_MODE, secretKey, sr);/正式執(zhí)行解密操作byte decryptedData口 = cipher.doFinal(data);return decryptedData; catch (Exception

10、e) (System.err.println("DES算法,解密出錯。");e.printStackTrace();return null;*加密函數(shù)* param data*加密數(shù)據(jù)* param key*密鑰* return返回加密后的數(shù)據(jù)*/public static byte CBCEncrypt(byte data, byte key, byte iv) (try (/從原始密鑰數(shù)據(jù)創(chuàng)建DESKeySpec對象DESKeySpec dks = new DESKeySpec(key);/創(chuàng)建一個密匙工廠,然后用它把DESKeySpec轉換成/ 一個 SecretKe

11、y 對象SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");SecretKey secretKey = keyFactory.generateSecret(dks);/ Cipher對象實際完成加密操作Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");/若采用NoPadding模式,data長度必須是8的倍數(shù)/ Cipher cipher = Cipher.getInstance("DES/CBC/

12、NoPadding");/用密匙初始化 Cipher對象IvParameterSpec param = new IvParameterSpec(iv);cipher.init(Cipher.ENCRYPT_MODE, secretKey, param);/執(zhí)行加密操作byte encryptedData = cipher.doFinal(data);return encryptedData; catch (Exception e) System.err.println("DES 算法,加密數(shù)據(jù)出錯!");e.printStackTrace();return nul

13、l;/*解密函數(shù)* param data*解密數(shù)據(jù)* param key*密鑰* return返回解密后的數(shù)據(jù)*/public static byte CBCDecrypt(byte data, byte key, byte iv) try /從原始密匙數(shù)據(jù)創(chuàng)建一個DESKeySpec對象DESKeySpec dks = new DESKeySpec(key);/創(chuàng)建一個密匙工廠,然后用它把DESKeySpec對象轉換成/ 一個 SecretKey 對象SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES&qu

14、ot;);SecretKey secretKey = keyFactory.generateSecret(dks);/ using DES in CBC modeCipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");/若采用NoPadding模式,data長度必須是8的倍數(shù)/ Cipher cipher = Cipher.getInstance("DES/CBC/NoPadding");/用密匙初始化 Cipher對象IvParameterSpec param = new IvParamet

15、erSpec(iv);cipher.init(Cipher.DECRYPT_MODE, secretKey, param);/正式執(zhí)行解密操作byte decryptedData口 = cipher.doFinal(data);return decryptedData; catch (Exception e) System.err.println("DES算法,解密出錯。");e.printStackTrace();return null;public static void main(String args) try byte key = "11111111&q

16、uot;.getBytes();byte iv = "22222222”.getBytes();byte data = DES.encrypt("ebc mode test".getBytes(), key);System.out.print("EBC mode:");System.out.println(new String(DES.decrypt(data, key);System.out.print("CBC mode:");data = DES.CBCEncrypt("cbc mode test".getBytes(), key, iv);System.out.println(new String(DES.CBCDecrypt(data, key, iv); catch (Exception e) e.printStackTrace();DES的幾種填補方式DES是對64位數(shù)據(jù)的加密算法,如數(shù)據(jù)位數(shù)不足64位的倍數(shù),需要填充,補充到64位的倍數(shù)。NoPaddingAPI或算法本身不對數(shù)據(jù)進行處理,加密數(shù)據(jù)由加密雙方約定填補算法。例如若對字符串數(shù)據(jù)進行加解密,可以補充0或者空格,然后trimPKCS5Padding加密前

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論