溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Python和Java進(jìn)行DES加密和解密的示例分析

發(fā)布時(shí)間:2021-07-23 13:52:11 來源:億速云 閱讀:305 作者:小新 欄目:開發(fā)技術(shù)

這篇文章給大家分享的是有關(guān)Python和Java進(jìn)行DES加密和解密的示例分析的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過來看看吧。

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 語言可以正常解密。

感謝各位的閱讀!關(guān)于“Python和Java進(jìn)行DES加密和解密的示例分析”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI