首頁  >  文章  >  Java  >  DES/3DES/AES 三種對稱加密演算法在 Java 中的實現

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

巴扎黑
巴扎黑原創
2017-04-30 10:07:281421瀏覽

  有兩句話是這麼說的:

  1)演算法和資料結構就是程式設計的重要部分,你若失去了演算法和資料結構,你就把一切都失去了。

  2)程式設計就是演算法和資料結構,演算法和資料結構是程式設計的靈魂。

注意,這可不是我說的,是無數程式設計師總結的,話說的很實在也很精闢,若想長久可持續發展,多研究演算法還是有必要的,今天我給大家說說加密演算法中的對稱加密演算法,並且這裡將教導大家對稱加密演算法的程式使用。包含DES、3DES和AES三種對稱加密演算法的程式使用,乾貨滿滿。

#  1.對稱密碼演算法

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

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

  (1)加解密通訊模型

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

#   (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工具類)。

以上是DES/3DES/AES 三種對稱加密演算法在 Java 中的實現的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn