1、對稱加密演算法
前面幾講,介紹了不可逆加密演算法MD5、SHA和HMAC。使用不可逆加密演算法,可以將明文加密得到密文,但不可能從密文得到明文。
使用不可逆加密演算法,我們可以計算訊息摘要,進行完整性驗證,進行資料來源認證,也可以用於鑑權資訊的儲存。但由於無法從密文獲得明文,所以不可逆加密演算法不能用於計算機通訊中,被交換的資料本身。
為了使計算機通訊雙方可以進行安全的資料交換,我們必須使用可逆的加密演算法。
可逆的加密演算法,就是透過明文+金鑰可以生成密文,透過密文+金鑰也可以獲得明文。
可逆加密演算法分為兩種:對稱加密演算法、不對稱加密演算法。加密時使用的金鑰和解密時使用的金鑰相同的,叫對稱加密演算法;加密時使用的金鑰和解密時使用的金鑰不同的,叫不對稱加密演算法。
本講介紹DES演算法。
2、DES演算法簡介DES是英語Data Encryption Standard的縮寫,即“資料加密標準”。DES演算法由IBM公司設計和開發,1977被美國國家標準局選擇為對稱加密演算法的標準。
DES演算法的明文按64bit分組為塊進行加密,金鑰也為64bit,每個64bit的明文塊被加密為64bit的密文塊。
雖然DES演算法的金鑰有64bit,但其中有8bit是校驗位,所以DES演算法的有效長度只有56bit。
DES演算法的設計非常精妙,但由於金鑰的有效部分僅有56bit,隨著計算機計算能力不斷上升,為暴力破解提供了可能性。1998年,有人研製出DES暴力破解機,對DES演算法進行暴力破解,DES演算法被破解。
雖然DES演算法被破解了,但在計算機歷史上,DES演算法仍然是最經典的對稱加密演算法,並且由於DES演算法設計巧妙,該演算法還很容易被設計成加密機和解密機硬體。
3、DES演算法的使用在JDK中,提供了對DES演算法的支援,使用起來比較簡單。下面是我編寫的一個使用DES演算法的示例程式。完整原始碼如下:
package com.flying.des;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import javax.crypto.*;import javax.crypto.spec.DESKeySpec;import java.security.InvalidKeyException;import java.security.NoSuchAlgorithmException;import java.security.spec.InvalidKeySpecException;@SpringBootApplicationpublic class DesApplication { public static void main(String[] args) throws InvalidKeyException, NoSuchAlgorithmException, InvalidKeySpecException, NoSuchPaddingException , IllegalBlockSizeException, BadPaddingException { SpringApplication.run(DesApplication.class, args); byte[] keyBytes = new byte[8]; for (int i=0; i<8; i++){ keyBytes[i] = 0x33; } printBytes("Key of DES is ", keyBytes); DESKeySpec desKeySpec = new DESKeySpec(keyBytes); SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance("DES"); SecretKey secretKey = secretKeyFactory.generateSecret(desKeySpec); byte[] plainBytes = {1, 2, 3, 4, 5, 6, 7, 8}; printBytes("Plain text of DES is", plainBytes); Cipher cipher = Cipher.getInstance("DES"); cipher.init(Cipher.ENCRYPT_MODE, secretKey); byte[] encrytedBytes = cipher.doFinal(plainBytes); printBytes("Encryped text of DES is", encrytedBytes); cipher.init(Cipher.DECRYPT_MODE, secretKey); byte[] decryptedBytes = cipher.doFinal(encrytedBytes); printBytes("Decrypted text of DES is", decryptedBytes); } private static void printBytes(String prompt, byte[] bytes){ if (prompt == null || bytes == null){ return; } System.out.print(prompt + ":"); for (int i=0; i<bytes.length; i++){ System.out.printf(" %02X", bytes[i]); } System.out.println(); }}
4、程式解釋及執行結果上面的程式,金鑰是8個0x33位元組,明文是1,2,3,4,5,6,7,8,使用DES演算法對明文加密,得到密文,然後使用DES演算法對密文進行解密。
程式執行的結果如下圖所示:
可以看到,對1,2,3,4,5,6,7,8加密的結果是33 F2 78 42 89 46 76 15 F1 B0 8B AE DC 99 78 24,然後對33 F2 78 42 89 46 76 15 F1 B0 8B AE DC 99 78 24解密,得到1,2,3,4,5,6,7,8。
因此,上面的演算法成功執行。如果你對這段程式碼感興趣,也可以自己編寫試試。