背景
对方系统java des 加密, 我们用 php 解密
模式基本介绍
ECB模式:电子密本方式,JAVA封装的DES算法的默认模式,就是将数据按照8个字节一段进行DES加密或解密得到一段8个字节的密文或者明文,最后一段不足8个字节,则补足8个字节
CBC模式:密文分组链接方式,NET封装的DES算法的默认模式,复杂,加密步骤百度就有
java 代码
import cn.hutool.crypto.SecureUtil; import cn.hutool.crypto.symmetric.DES; import javax.crypto.SecretKey; import cn.hutool.crypto.symmetric.SymmetricAlgorithm; public class Hello { public static void main(String[] args) { String appSecret = "HgQX9h6XD9fVq__eojuMcfuSmnwC3FqIpxz_YOl38rI"; String value = "待加密字符"; SecretKey secretKey = SecureUtil.generateDESKey(SymmetricAlgorithm.DES.getValue(),appSecret.getBytes()); //构建 DES des = SecureUtil.des(secretKey.getEncoded()); //加密 String encryptHexField = des.encryptHex(value); String base = des.encryptBase64(value); System.out.println("16进制密文:" + encryptHexField); System.out.println("base64密文:" + base); } }
分析
- java DES (默认
DES/ECB/PKCS5Padding
) - php des-ecb ,加密算法列表 openssl_get_cipher_methods()
php 代码
/** * 16进制转字符串 * @param string $hex * @return string */ public function hexToStr(string $hex) { $string = ""; for ($i = 0; $i < strlen($hex) - 1; $i += 2) $string .= chr(hexdec($hex[$i] . $hex[$i + 1])); return $string; } /** * 解密 * @param string $str * @param string $key * @return string */ public function desDecrypt(string $str, string $key) { $base64 = base64_encode($this->hexToStr($str)); return openssl_decrypt($base64, 'des-ecb', $key); }
备注:
openssl_decrypt函数 options 参数官文文档有漏: 0(默认),OPENSSL_RAW_DATA, OPENSSL_ZERO_PADDING, OPENSSL_NO_PADDING,看源码还有一些值没有列出, 暂时没用到
测试工具 http://tool.chacuo.net/cryptdes
参考文档 https://www.php.net/manual/zh/function.openssl-decrypt.php
参考文档 https://www.javajike.com/book/hutool/chapter8/c376fd86c904a3c20175464e2fb6bbec.html
参考文档 https://www.cnblogs.com/jingxiaoniu/p/12217789.html