Java與PHP環(huán)境下DES加密解密互通,需要精確匹配密鑰和編碼方式,才能保證數(shù)據(jù)安全完整。本文將詳細講解如何實現(xiàn)Java DES加密字符串在PHP環(huán)境下的正確解密。
Java端采用secureutil.des(“加解密key”.getBytes())方法進行DES加密,未啟用初始向量(IV),即DES-ECB模式。此模式簡潔但安全性較低,因為相同明文加密結(jié)果相同。
Java加密流程:使用密鑰“加解密key”初始化DES加密對象,調(diào)用des.encryptHex(“待加密內(nèi)容”)方法加密字符串,返回十六進制密文。然而,原始Java代碼片段不完整,缺少將加密結(jié)果轉(zhuǎn)換為PHP可處理格式的關(guān)鍵步驟。PHP的openssl_decrypt函數(shù)通常需要Base64編碼的密文。因此,Java端需將加密后的字節(jié)數(shù)組Base64編碼。
完整的Java加密示例,包含Base64編碼:
立即學(xué)習(xí)“PHP免費學(xué)習(xí)筆記(深入)”;
final String key = "sg202303"; final String value = "> 本文參與了[segmentfault 思否面試闖關(guān)挑戰(zhàn)賽],歡迎正在閱讀的你也加入。"; final byte[] encrypt = SecureUtil.des(key.getBytes(StandardCharsets.UTF_8)).encrypt(value); final String encode = Base64.getEncoder().encodeToString(encrypt); System.out.println(encode);
此代碼使用Base64.getEncoder().encodeToString方法將加密字節(jié)數(shù)組轉(zhuǎn)換為Base64編碼字符串,輸出為Base64編碼密文。
對應(yīng)的PHP解密代碼:
$xxx = 'P+fEE0NngTu8Ak1E78zGGds3ozPA+M6h1u8v/FMih/Wi1k3YM/q+In+3wUgTv1XGhViBxCRYpqofV5ih0BN+vZTf2fnT4VbH59eRTAQoyl+4ePrKtVf1FngTbcBAT3CHNaYVUIXMbsAUpLwpcgMhJlqM6k4qbzqnEndrIMCzkkyk413alLIUy2/Fo97PvGdR'; $method = 'DES-ECB'; $key = 'sg202303'; var_dump(openssl_decrypt(base64_decode($xxx), $method, $key));
此PHP代碼使用openssl_decrypt函數(shù),指定DES-ECB模式和密鑰“sg202303”,對Base64解碼后的密文進行解密,輸出解密結(jié)果。 請注意:openssl_decrypt函數(shù)需要Base64編碼的密文。Java端需Base64編碼,PHP端需Base64解碼(代碼中雖然未顯式解碼,但openssl_decrypt會自動處理Base64編碼字符串)。 Java端未進行Base64編碼,PHP解密將失敗。 密鑰必須與Java端加密密鑰完全一致。