Python和Java進(jìn)行DES加密和解密的實(shí)例
DES 為 Data Encryption Standard (數(shù)據(jù)加密標(biāo)準(zhǔn))的縮寫,是一種常見的對(duì)稱加密算法。有關(guān)對(duì)稱加密與非對(duì)稱加密的特點(diǎn)及其應(yīng)用場(chǎng)景,本文就不描述了,讀者可以自行 google 。本文說明如何使用 Java 和 Python 兩種語言來實(shí)現(xiàn) DES 的加解密。
最近碰到的應(yīng)用場(chǎng)景是這樣的。我們需要對(duì)接一個(gè)系統(tǒng) S,系統(tǒng) S 已經(jīng)對(duì)用戶的身份進(jìn)行了驗(yàn)證,新系統(tǒng) N 也需要對(duì)用戶的身份進(jìn)行驗(yàn)證。采用的身份驗(yàn)證方法是由舊系統(tǒng) S 對(duì)用戶 ID 進(jìn)行加密,然后新系統(tǒng) N 對(duì)加密后的用戶 ID 進(jìn)行解密,從而獲取用戶 ID 并進(jìn)行身份驗(yàn)證。
由于舊系統(tǒng) S 是用 Java 實(shí)現(xiàn)的,新系統(tǒng) N 使用 Python 實(shí)現(xiàn)。也就是說,需要使用 Python 語言來對(duì) Java DES 加密的用戶 ID 進(jìn)行解密。
這里貼出 Java 實(shí)現(xiàn)的 DES 加密的代碼。
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 的填充模式,使用的初始化向量是加密的密鑰。
執(zhí)行以上 Java 代碼,輸出:
加密前:zx 加密后:1DBBD4E9246EBFFA 解密后:zx
Python 利用 pyDes 對(duì) Java 加密的字符串進(jìn)行解密的代碼如下所示。
import binascii
from pyDes import des, CBC, PAD_PKCS5
def des_encrypt(s):
"""
DES 加密
:param s: 原始字符串
:return: 加密后字符串,16進(jìn)制
"""
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進(jìn)制
: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 解密時(shí)采用 CBC 模式,并采用 PAD_PKCS5 作為填充模式,使用解密密鑰作為初始化向量。這些加密的設(shè)置跟 Java 語言使用的是一致的。
執(zhí)行以上 Python 代碼,得到以下輸出:
1dbbd4e9246ebffa zx
可以看到,同對(duì) Java 語言加密后的字符串,Python 語言可以正常解密。
以上這篇Python和Java進(jìn)行DES加密和解密的實(shí)例就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- java 實(shí)現(xiàn)DES 加密解密的示例
- Java實(shí)現(xiàn)的3des加密解密工具類示例
- Java實(shí)現(xiàn)的DES加密解密工具類實(shí)例
- Java使用Hutool實(shí)現(xiàn)AES、DES加密解密的方法
- java基于Des對(duì)稱加密算法實(shí)現(xiàn)的加密與解密功能詳解
- Java實(shí)現(xiàn)DES加密與解密,md5加密以及Java實(shí)現(xiàn)MD5加密解密類
- PHP、Java des加密解密實(shí)例
- java中DES加密解密
- java使用des加密解密示例分享
- [J2SE]Java中3DES加密解密調(diào)用示例
- plsql實(shí)現(xiàn)DES對(duì)稱加密 Java解密
相關(guān)文章
Python實(shí)現(xiàn)視頻目標(biāo)檢測(cè)與軌跡跟蹤流程詳解
通過閱讀相關(guān)文獻(xiàn)及測(cè)試,找到了一種基于多模板匹配的改進(jìn)方法,可以對(duì)遙感視頻衛(wèi)星中的移動(dòng)目標(biāo)進(jìn)行探測(cè),并繪制其軌跡。根據(jù)實(shí)驗(yàn)結(jié)果發(fā)現(xiàn),可以比較有效的對(duì)運(yùn)動(dòng)目標(biāo)進(jìn)行跟蹤2023-01-01
Django框架視圖層URL映射與反向解析實(shí)例分析
這篇文章主要介紹了Django框架視圖層URL映射與反向解析,結(jié)合實(shí)例形式分析了Django框架普通url映射、命名URL參數(shù)映射、分布式URL映射、反向解析等相關(guān)操作技巧,需要的朋友可以參考下2019-07-07
Python?NLP開發(fā)之實(shí)現(xiàn)聊天機(jī)器人
這篇文章主要為大家介紹了Python如何實(shí)現(xiàn)聊天機(jī)器人,即使用自然語言處理?(NLP)?來幫助用戶通過文本、圖形或語音與?Web?服務(wù)或應(yīng)用進(jìn)行交互,感興趣的可以了解一下2023-05-05
python基礎(chǔ)知識(shí)小結(jié)之集合
本文給大家小結(jié)了一下Python中集合的基礎(chǔ)知識(shí),非常的簡單易懂,有需要的小伙伴可以參考下。2015-11-11
python字典dict中常用內(nèi)置函數(shù)的使用
本文主要介紹了python字典dict中常用內(nèi)置函數(shù)的使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04

