首頁»Java WEB»DES/3DES/AES 三種對稱加密算法在 Java 中的實現

DES/3DES/AES 三種對稱加密算法在 Java 中的實現

來源:郭朝的博客 發布時間:2017-01-31 閱讀次數:

  有兩句話是這么說的:

  1)算法和數據結構就是編程的一個重要部分,你若失掉了算法和數據結構,你就把一切都失掉了。

  2)編程就是算法和數據結構,算法和數據結構是編程的靈魂。

  注意,這可不是我說的,是無數程序員總結的,話說的很實在也很精辟,若想長久可持續發展,多研究算法還是很有必要的,今天我給大家說說加密算法中的對稱加密算法,并且這里將教會大家對稱加密算法的編程使用。包含DES、3DES和AES三種對稱加密算法的編程使用,干貨滿滿。

 1.對稱密碼算法

  對稱密碼算法是當今應用范圍最廣,使用頻率最高的加密算法。它不僅應用于軟件行業,在硬件行業同樣流行。各種基礎設施凡是涉及到安全需求,都會優先考慮對稱加密算法。

  對稱密碼算法的加密密鑰和解密密鑰相同,對于大多數對稱密碼算法,加解密過程互逆。

  (1)加解密通信模型

加解密通信模型

  (2)特點:算法公開、計算量小、加密速度快、加密效率高

  (3)弱點:雙方都使用同樣密鑰,安全性得不到保證

  對稱密碼有流密碼和分組密碼兩種,但是現在普遍使用的是分組密碼:

  (4)分組密碼工作模式

  • 1)ECB:電子密碼本(最常用的,每次加密均產生獨立的密文分組,并且對其他的密文分組不會產生影響,也就是相同的明文加密后產生相同的密文)
  • 2)CBC:密文鏈接(常用的,明文加密前需要先和前面的密文進行異或運算,也就是相同的明文加密后產生不同的密文)
  • 3)CFB:密文反饋
  • 4)OFB:輸出反饋
  • 5)CTR:計數器

  這五種工作模式主要是密碼學中算法在進行推導演算的時候所應用到的。

  6.分組密碼填充方式

  • 1)NoPadding:無填充
  • 2)PKCS5Padding:
  • 3)ISO10126Padding:

  7.常用對稱密碼:

  • 1)DES(Data Encryption Standard,數據加密標準)
  • 2)3DES(Triple DES、DESede,進行了三重DES加密的算法)
  • 3)AES(Advanced Encryption Standard,高級數據加密標準,AES算法可以有效抵制針對DES的攻擊算法)

  先來看一下這三種算法的簡單對比:

 

算法 密鑰長度 默認密鑰長度 工作模式 填充方式
DES 56 56 ECB、CBC、PCBC、CTR、CTS、CFB、CFB8-CFB128、OFB、OFB8-OFB128 NoPadding、PKCS5Padding、ISO10126Padding
3DES 112、168 168 ECB、CBC、PCBC、CTR、CTS、CFB、CFB8-CFB128、OFB、OFB8-OFB128 NoPadding、PKCS5Padding、ISO10126Padding
AES 128、192、256 128 ECB、CBC、PCBC、CTR、CTS、CFB、CFB8-CFB128、OFB、OFB8-OFB128 NoPadding、PKCS5Padding、ISO10126Padding

  下面我們看如何使用 DES / 3DES / AES 三種算法實現 對稱加密:

 2.DES算法

  1.DES:數據加密標準,是對稱加密算法領域中的典型算法

  2.特點:密鑰偏短(56位)、生命周期短(避免被破解)

  3.Java實現

  1)生成密鑰

KeyGenerator keyGen = KeyGenerator.getInstance("DES");//密鑰生成器
keyGen.init(56);//初始化密鑰生成器
SecretKey secretKey = keyGen.generateKey();//生成密鑰
byte[] key = secretKey.getEncoded();//密鑰字節數組

  2)加密

SecretKey secretKey = new SecretKeySpec(key, "DES");//恢復密鑰
Cipher cipher = Cipher.getInstance("DES");//Cipher完成加密或解密工作類
cipher.init(Cipher.ENCRYPT_MODE, secretKey);//對Cipher初始化,加密模式
byte[] cipherByte = cipher.doFinal(data);//加密data

  3)解密

SecretKey secretKey = new SecretKeySpec(key, "DES");//恢復密鑰
Cipher cipher = Cipher.getInstance("DES");//Cipher完成加密或解密工作類
cipher.init(Cipher.DECRYPT_MODE, secretKey);//對Cipher初始化,解密模式
byte[] cipherByte = cipher.doFinal(data);//解密data

我們可以發現,加密解密我們只是設置了不同的模式而已。

 3.3DES算法

  1.3DES:將密鑰長度增至112位或168位,通過增加迭代次數提高安全性

  2.缺點:處理速度較慢、密鑰計算時間較長、加密效率不高

  3.Java實現

  1)生成密鑰

KeyGenerator keyGen = KeyGenerator.getInstance("DESede");//密鑰生成器
keyGen.init(168);  //可指定密鑰長度為112或168,默認為168   
SecretKey secretKey = keyGen.generateKey();//生成密鑰
byte[] key = secretKey.getEncoded();//密鑰字節數組

  2)3DES加密

SecretKey secretKey = new SecretKeySpec(key, "DESede");//恢復密鑰
Cipher cipher = Cipher.getInstance("DESede");//Cipher完成加密或解密工作類
cipher.init(Cipher.ENCRYPT_MODE, secretKey);//對Cipher初始化,解密模式
byte[] cipherByte = cipher.doFinal(data);//加密data

  3)3DES解密

SecretKey secretKey = new SecretKeySpec(key, "DESede");//恢復密鑰
Cipher cipher = Cipher.getInstance("DESede");//Cipher完成加密或解密工作類
cipher.init(Cipher.DECRYPT_MODE, secretKey);//對Cipher初始化,解密模式
byte[] cipherByte = cipher.doFinal(data);//解密data

 4.AES算法(推薦使用)

  1.AES:高級數據加密標準,能夠有效抵御已知的針對DES算法的所有攻擊

  2.特點:密鑰建立時間短、靈敏性好、內存需求低、安全性高

  3.Java實現

  1)生成密鑰

KeyGenerator keyGen = KeyGenerator.getInstance("AES");//密鑰生成器
keygen.init(128);  //默認128,獲得無政策權限后可為192或256
SecretKey secretKey = keyGen.generateKey();//生成密鑰
byte[] key = secretKey.getEncoded();//密鑰字節數組

  2)AES加密

SecretKey secretKey = new SecretKeySpec(key, "AES");//恢復密鑰
Cipher cipher = Cipher.getInstance("AES");//Cipher完成加密或解密工作類
cipher.init(Cipher.ENCRYPT_MODE, secretKey);//對Cipher初始化,解密模式
byte[] cipherByte = cipher.doFinal(data);//加密data

  3)AES解密

SecretKey secretKey = new SecretKeySpec(key, "AES");//恢復密鑰
Cipher cipher = Cipher.getInstance("AES");//Cipher完成加密或解密工作類
cipher.init(Cipher.DECRYPT_MODE, secretKey);//對Cipher初始化,解密模式
byte[] cipherByte = cipher.doFinal(data);//解密data

  為了方便使用,我對DES / 3DES / AES 三種算法進行了工具類編寫,地址:https://github.com/smartbetter/Android-UtilsLibrary (新增DES/3DES/AES工具類)。

QQ群:WEB開發者官方群(515171538),驗證消息:10000
微信群:加小編微信 849023636 邀請您加入,驗證消息:10000
提示:更多精彩內容關注微信公眾號:全棧開發者中心(fsder-com)
網友評論(共0條評論) 正在載入評論......
理智評論文明上網,拒絕惡意謾罵 發表評論 / 共0條評論
登錄會員中心
大神带着买彩票 抚宁县| 昭觉县| 镇赉县| 莎车县| 阜南县| 沁水县| 包头市| 土默特左旗| 大荔县| 巨野县| 镇康县| 固安县| 龙岩市| 敦化市| 潞西市| 万山特区| 巴塘县| 贺州市| 延长县| 四会市| 老河口市| 蓝田县| 迁西县| 奉节县| 读书| 博野县| 如东县| 岗巴县| 瑞安市| 两当县| 万安县| 沂水县| 黔东| 盐城市| 郯城县| 蓝山县| 丰都县| 香港|