DES/3DES/AES 三種對稱加密演算法在 Java 中的實現
有兩句話是這麼說的:
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工具類)。
相關文章
- 對稱加密演算法----DES加密演算法加密演算法
- AES加密演算法的JAVA實現加密演算法Java
- JAVA和C# 3DES加密解密JavaC#3D加密解密
- java 實現 DES加密 解密演算法Java加密解密演算法
- Golang 裡的 AES、DES、3DES 加解密,支援 ECB、CBC 等多種模式組合Golang3D解密模式
- Golang實現ECB模式3DES演算法Golang模式3D演算法
- DES對稱資料加密加密
- java使用DES加密方式,實現對資料的加密解密Java加密解密
- 區塊鏈背後的資訊保安(2) DES、3DES加密演算法原理及其GO語言實現區塊鏈3D加密演算法Go
- [譯] 最佳安全實踐:在 Java 和 Android 中使用 AES 進行對稱加密JavaAndroid加密
- AES和DES程式碼實現
- golang 中,非對稱加密的實現Golang加密
- AES加密 – iOS與Java的同步實現加密iOSJava
- DES--------Golang對稱加密之模式問題實戰Golang加密模式
- golang 中,對稱加密的程式碼實現Golang加密
- Java 3DES 加解/密程式Java3D
- 前後端(PHP)使用AES對稱加密後端PHP加密
- java實現DES資料加密與解密Java加密解密
- 對稱加密演算法在C#中的踩坑日常加密演算法C#
- [譯]最佳安全實踐:在 Java 和 Android 中使用 AES 進行對稱加密:第2部分:AES-CBC + HMACJavaAndroid加密Mac
- JAVA中AES加密和解密Java加密解密
- 聊聊對稱/非對稱加密在HTTPS中的應用加密HTTP
- https中的對稱加密和非對稱加密HTTP加密
- 聊一聊非對稱加密在介面引數中的簡單實現加密
- 兄弟連區塊鏈教程區塊鏈背後的資訊保安2DES、3DES加密演算法原理二區塊鏈3D加密演算法
- 3DES加解密-EncryptAndDecryptFile3D解密
- Java實現AES和RSA演算法Java演算法
- 常用加密解密演算法【RSA、AES、DES、MD5】介紹和使用加密解密演算法
- 密碼學之DES/AES演算法密碼學演算法
- Java中Blowfish加密演算法實現Java加密演算法
- VB實現AES(Rijndael)加密的方法加密
- C語言實現DES加密C語言加密
- DES加密演算法在門禁系統中應用 (轉)加密演算法
- 用vb實現DES加解密演算法(二)--加密 (轉)解密演算法加密
- 20.3 OpenSSL 對稱AES加解密演算法解密演算法
- 非對稱加密演算法的思考加密演算法
- Java加密技術(七)——非對稱加密演算法最高階ECCJava加密演算法
- Java安全之對稱加密、非對稱加密、數字簽名Java加密