DES 為 Data Encryption Standard (數據加密標準)的縮寫,是一種常見的對稱加密算法。有關對稱加密與非對稱加密的特點及其應用場景,本文就不描述了,讀者可以自行 google 。本文說明如何使用 Java 和 Python 兩種語言來實現 DES 的加解密。
最近碰到的應用場景是這樣的。我們需要對接一個系統 S,系統 S 已經對用戶的身份進行了驗證,新系統 N 也需要對用戶的身份進行驗證。采用的身份驗證方法是由舊系統 S 對用戶 ID 進行加密,然后新系統 N 對加密后的用戶 ID 進行解密,從而獲取用戶 ID 并進行身份驗證。
由于舊系統 S 是用 Java 實現的,新系統 N 使用 Python 實現。也就是說,需要使用 Python 語言來對 Java DES 加密的用戶 ID 進行解密。
這里貼出 Java 實現的 DES 加密的代碼。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
|
import javax.crypto.spec.IvParameterSpec; import javax.crypto.Cipher; import javax.crypto.SecretKey; import javax.crypto.SecretKeyFactory; import javax.crypto.spec.DESKeySpec; public class Main { public static void main(String[] args) { String content = "zx"; String key = "20171117"; System.out.println("加密前:" + content); byte[] encrypted = DES_CBC_Encrypt(content.getBytes(), key.getBytes()); System.out.println("加密后:" + byteToHexString(encrypted)); byte[] decrypted = DES_CBC_Decrypt(encrypted, key.getBytes()); System.out.println("解密后:" + new String(decrypted)); } public static byte[] DES_CBC_Encrypt(byte[] content, byte[] keyBytes) { try { DESKeySpec keySpec = new DESKeySpec(keyBytes); SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES"); SecretKey key = keyFactory.generateSecret(keySpec); Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding"); cipher.init(Cipher.ENCRYPT_MODE, key, new IvParameterSpec(keySpec.getKey())); byte[] result = cipher.doFinal(content); return result; } catch (Exception e) { System.out.println("exception:" + e.toString()); } return null; } private static byte[] DES_CBC_Decrypt(byte[] content, byte[] keyBytes) { try { DESKeySpec keySpec = new DESKeySpec(keyBytes); SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES"); SecretKey key = keyFactory.generateSecret(keySpec); Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding"); cipher.init(Cipher.DECRYPT_MODE, key, new IvParameterSpec(keyBytes)); byte[] result = cipher.doFinal(content); return result; } catch (Exception e) { System.out.println("exception:" + e.toString()); } return null; } private static String byteToHexString(byte[] bytes) { StringBuffer sb = new StringBuffer(bytes.length); String sTemp; for (int i = 0; i < bytes.length; i++) { sTemp = Integer.toHexString(0xFF & bytes[i]); if (sTemp.length() < 2) sb.append(0); sb.append(sTemp.toUpperCase()); } return sb.toString(); } } |
Java 代碼采用的 DES 加密采用 CBC 模式,采用 PKCS5Padding 的填充模式,使用的初始化向量是加密的密鑰。
執行以上 Java 代碼,輸出:
1
2
3
|
加密前:zx 加密后:1DBBD4E9246EBFFA 解密后:zx |
Python 利用 pyDes 對 Java 加密的字符串進行解密的代碼如下所示。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
import binascii from pyDes import des, CBC, PAD_PKCS5 def des_encrypt(s): """ DES 加密 :param s: 原始字符串 :return: 加密后字符串,16進制 """ secret_key = '20171117' iv = secret_key k = des(secret_key, CBC, iv, pad=None, padmode=PAD_PKCS5) en = k.encrypt(s, padmode=PAD_PKCS5) return binascii.b2a_hex(en) def des_descrypt(s): """ DES 解密 :param s: 加密后的字符串,16進制 :return: 解密后的字符串 """ secret_key = '20171117' iv = secret_key k = des(secret_key, CBC, iv, pad=None, padmode=PAD_PKCS5) de = k.decrypt(binascii.a2b_hex(s), padmode=PAD_PKCS5) return de str_en = des_encrypt('zx') print(str_en) str_de = des_descrypt(str_en) print(str_de) |
Python 語言采用 pyDes 作為 DES 加解密處理的包。DES 解密時采用 CBC 模式,并采用 PAD_PKCS5 作為填充模式,使用解密密鑰作為初始化向量。這些加密的設置跟 Java 語言使用的是一致的。
執行以上 Python 代碼,得到以下輸出:
1
2
|
1dbbd4e9246ebffa zx |
可以看到,同對 Java 語言加密后的字符串,Python 語言可以正常解密。
以上這篇Python和Java進行DES加密和解密的實例就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持服務器之家。
原文鏈接:http://blog.csdn.net/lihao21/article/details/78557461