最近對接第三方的接口,需要DES解密java的DES加密數據
看了好久,研究java,還搭建了一個java環境
最終失敗。
仔細思量,發現是方向錯了, php本身也有DES解密,只是對照着解密就好了,管他什麼語言,做好php解密的事情就好了。
對方給的DES祕鑰格式: 12,23,34,45,56,67,78
加密數據:‘***************‘
<?php
/**
* openssl 實現的 DES 加密類,支持各種 PHP 版本
*/
class DES
{
/**
* @var string $method 加解密方法,可通過 openssl_get_cipher_methods() 獲得
*/
protected $method;
/**
* @var string $key 加解密的密鑰
*/
protected $key;
/**
* @var string $output 輸出格式 無、base64、hex
*/
protected $output;
/**
* @var string $iv 加解密的向量
*/
protected $iv;
/**
* @var string $options
*/
protected $options;
// output 的類型
const OUTPUT_NULL = '';
const OUTPUT_BASE64 = 'base64';
const OUTPUT_HEX = 'hex';
/**
* DES constructor.
* @param string $key
* @param string $method
* ECB DES-ECB、DES-EDE3 (爲 ECB 模式時,$iv 爲空即可)
* CBC DES-CBC、DES-EDE3-CBC、DESX-CBC
* CFB DES-CFB8、DES-EDE3-CFB8
* CTR
* OFB
*
* @param string $output
* base64、hex
*
* @param string $iv
* @param int $options
*/
public function __construct($key, $method = 'DES-ECB', $output = '', $iv = '', $options = OPENSSL_RAW_DATA | OPENSSL_NO_PADDING)
{
$this->key = $key;
$this->method = $method;
$this->output = $output;
$this->iv = $iv;
$this->options = $options;
}
/**
* 加密
*
* @param $str
* @return string
*/
public function encrypt($str)
{
$str = $this->pkcsPadding($str, 8);
$sign = openssl_encrypt($str, $this->method, $this->key, $this->options, $this->iv);
if ($this->output == self::OUTPUT_BASE64) {
$sign = base64_encode($sign);
} else if ($this->output == self::OUTPUT_HEX) {
$sign = bin2hex($sign);
}
return $sign;
}
/**
* 解密
*
* @param $encrypted
* @return string
*/
public function decrypt($encrypted)
{
if ($this->output == self::OUTPUT_BASE64) {
$encrypted = base64_decode($encrypted);
} else if ($this->output == self::OUTPUT_HEX) {
$encrypted = hex2bin($encrypted);
}
$sign = @openssl_decrypt($encrypted, $this->method, $this->key, $this->options, $this->iv);
$sign = $this->unPkcsPadding($sign);
$sign = rtrim($sign);
return $sign;
}
/**
* 填充
*
* @param $str
* @param $blocksize
* @return string
*/
private function pkcsPadding($str, $blocksize)
{
$pad = $blocksize - (strlen($str) % $blocksize);
return $str . str_repeat(chr($pad), $pad);
}
/**
* 去填充
*
* @param $str
* @return string
*/
private function unPkcsPadding($str)
{
$pad = ord($str{strlen($str) - 1});
if ($pad > strlen($str)) {
return false;
}
return substr($str, 0, -1 * $pad);
}
}
$key = '' ;
$bytes = [對方給的祕鑰];//需要將對方給的字節數組,轉換成字符
foreach($bytes as $ch) {
$key .= chr($ch);
}
$iv = '';
// DES ECB 加解密
$des = new DES($key, 'DES-ECB', DES::OUTPUT_BASE64);
$base64Sign = '加密數據';
echo "\n";
echo $des->decrypt($base64Sign);
最終才解出來,有時候,困擾自己的往往是自己的思維,不如放空一下,好好整理思路,繼續前行
飲水思源:方法轉自馬燕龍個人博客,感恩的心