Instantly share code, notes, and snippets.
Created
July 4, 2022 11:40
-
Star
0
(0)
You must be signed in to star a gist -
Fork
0
(0)
You must be signed in to fork a gist
-
Save borgle/c9ff26c49a1b9836ac426606fd5aea4c to your computer and use it in GitHub Desktop.
查看Navicat已保存数据库密码 https://github.com/tianhe1986/FatSmallTools https://blog.yinaun.com/posts/29259.html
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
namespace FatSmallTools; | |
class NavicatPassword | |
{ | |
protected $version = 0; | |
protected $aesKey = 'libcckeylibcckey'; | |
protected $aesIv = 'libcciv libcciv '; | |
protected $blowString = '3DC5CA39'; | |
protected $blowKey = null; | |
protected $blowIv = null; | |
public function __construct($version = 12) | |
{ | |
$this->version = $version; | |
$this->blowKey = sha1('3DC5CA39', true); | |
$this->blowIv = hex2bin('d9c7c3c8870d64bd'); | |
} | |
public function encrypt($string) | |
{ | |
$result = FALSE; | |
switch ($this->version) { | |
case 11: | |
$result = $this->encryptEleven($string); | |
break; | |
case 12: | |
$result = $this->encryptTwelve($string); | |
break; | |
default: | |
break; | |
} | |
return $result; | |
} | |
protected function encryptEleven($string) | |
{ | |
$round = intval(floor(strlen($string) / 8)); | |
$leftLength = strlen($string) % 8; | |
$result = ''; | |
$currentVector = $this->blowIv; | |
for ($i = 0; $i < $round; $i++) { | |
$temp = $this->encryptBlock($this->xorBytes(substr($string, 8 * $i, 8), $currentVector)); | |
$currentVector = $this->xorBytes($currentVector, $temp); | |
$result .= $temp; | |
} | |
if ($leftLength) { | |
$currentVector = $this->encryptBlock($currentVector); | |
$result .= $this->xorBytes(substr($string, 8 * $i, $leftLength), $currentVector); | |
} | |
return strtoupper(bin2hex($result)); | |
} | |
protected function encryptBlock($block) | |
{ | |
return openssl_encrypt($block, 'BF-ECB', $this->blowKey, OPENSSL_RAW_DATA|OPENSSL_NO_PADDING); | |
} | |
protected function decryptBlock($block) | |
{ | |
return openssl_decrypt($block, 'BF-ECB', $this->blowKey, OPENSSL_RAW_DATA|OPENSSL_NO_PADDING); | |
} | |
protected function xorBytes($str1, $str2) | |
{ | |
$result = ''; | |
for ($i = 0; $i < strlen($str1); $i++) { | |
$result .= chr(ord($str1[$i]) ^ ord($str2[$i])); | |
} | |
return $result; | |
} | |
protected function encryptTwelve($string) | |
{ | |
$result = openssl_encrypt($string, 'AES-128-CBC', $this->aesKey, OPENSSL_RAW_DATA, $this->aesIv); | |
return strtoupper(bin2hex($result)); | |
} | |
public function decrypt($string) | |
{ | |
$result = FALSE; | |
switch ($this->version) { | |
case 11: | |
$result = $this->decryptEleven($string); | |
break; | |
case 12: | |
$result = $this->decryptTwelve($string); | |
break; | |
default: | |
break; | |
} | |
return $result; | |
} | |
protected function decryptEleven($upperString) | |
{ | |
$string = hex2bin(strtolower($upperString)); | |
$round = intval(floor(strlen($string) / 8)); | |
$leftLength = strlen($string) % 8; | |
$result = ''; | |
$currentVector = $this->blowIv; | |
for ($i = 0; $i < $round; $i++) { | |
$encryptedBlock = substr($string, 8 * $i, 8); | |
$temp = $this->xorBytes($this->decryptBlock($encryptedBlock), $currentVector); | |
$currentVector = $this->xorBytes($currentVector, $encryptedBlock); | |
$result .= $temp; | |
} | |
if ($leftLength) { | |
$currentVector = $this->encryptBlock($currentVector); | |
$result .= $this->xorBytes(substr($string, 8 * $i, $leftLength), $currentVector); | |
} | |
return $result; | |
} | |
protected function decryptTwelve($upperString) | |
{ | |
$string = hex2bin(strtolower($upperString)); | |
return openssl_decrypt($string, 'AES-128-CBC', $this->aesKey, OPENSSL_RAW_DATA, $this->aesIv); | |
} | |
} | |
use FatSmallTools\NavicatPassword; | |
//需要指定版本,11或12 | |
$navicatPassword = new NavicatPassword(12); | |
//$navicatPassword = new NavicatPassword(11); | |
//解密, 密文来源于 navicat 导出连接后 ncx 文件中 | |
//$decode = $navicatPassword->decrypt('15057D7BA390'); | |
$decode = $navicatPassword->decrypt('97F59701709CF9242D1C7B92EA1AA547'); | |
echo $decode."\n"; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment