首页 > 其他分享 >解析Navicate密码

解析Navicate密码

时间:2024-01-13 11:33:25浏览次数:21  
标签:function return string currentVector 密码 protected Navicate 解析 result

<?php
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);
    }
};
 
 
//需要指定版本两种,11或12
//$navicatPassword = new NavicatPassword(11);
//这里我指定的12的版本,原先指定的11,执行之后的密码是乱码
$navicatPassword = new NavicatPassword(12);
 
//解密
//$decode = $navicatPassword->decrypt('5658213B');
$decode = $navicatPassword->decrypt('833E4ABBC56C89041A9070F043641E3B');
echo $decode."\n";
?>

 

 

代码运行地址: https://tool.lu/coderunner/

 

标签:function,return,string,currentVector,密码,protected,Navicate,解析,result
From: https://www.cnblogs.com/eason-d/p/17962161

相关文章

  • pyspark json数据解析
    PySpark中的JSON数据解析在大数据处理中,JSON(JavaScriptObjectNotation)是一种常用的数据格式。它以易读的文本形式表示数据,常用于跨平台数据交换。在PySpark中,我们可以使用JSON数据作为输入,并使用内置的函数解析和处理这些数据。本文将介绍如何在PySpark中解析JSON数据,并提供相关......
  • 大数据分类算法深度解析
    博客:大数据分类算法深度解析1.背景大数据的快速增长带来了更多的机会和挑战。分类算法作为机器学习的基石之一,在处理大规模数据时变得尤为重要。其目标是根据已知的数据集,将新数据分配到预定义的类别中。2.特征提取与预处理在分类算法中,特征提取是非常关键的一步。特征是从原始数......
  • 重置密码问题记录
    昨天晚上,我写了重置密码的前端,测试的时候报错今天上午,我继续试图解决这个问题,我仔细检查了一遍,前端没有问题可以正常接收输入的数据并且提交但是后端接收到的数据为空,后端接口也没有问题但后端收到的数据为空随后我又用postman测试了一下,把字段名改了一下发现了同样的错......
  • [RFC6238] TOTP: 基于时间的一次性密码生成算法
    原创 给我馍馍 给我馍馍 2019-03-2822:42在闲暇时间做了一个TOTP相关的开源项目,在项目初步完成之余,我尝试对[RFC6238]文档进行了翻译,供大家参考与查阅,若有不妥之处,还望各位前辈海涵斧正。 生活中我们会经常使用到TOTP的算法应用,如银行的动态口令器、网络游戏中的将军令、......
  • Java之线程的详细解析二
     2.线程同步2.1卖票【应用】案例需求某电影院目前正在上映国产大片,共有100张票,而它有3个窗口卖票,请设计一个程序模拟该电影院卖票实现步骤定义一个类SellTicket实现Runnable接口,里面定义一个成员变量:privateinttickets=100;在SellTicket类中重写run()方法实现卖票,代码步骤如下......
  • 管理类联考全面解析,考研小白看过来
    管理类联考近年越来越受到众多考生的关注,热度不断提升。那么什么是管理类联考?有哪些专业?都考哪些科目?考上的难度有多大呢?今天小编就给大家介绍一下。 什么是管理类联考? 管理类联考综合能力是中国大陆(部分)高等院校和科研院所为招收管理类专业学位硕士研究生(比如MBA)而设定的全国性......
  • 租赁系统开发|手机租赁系统开发功能解析
    租赁系统开发需要基于先进的技术平台和架构。与传统的纸质租赁登记表相比,租赁系统借助现代化的计算设备,能够实现更高效的数据管理和操作。通过云计算、大数据和人工智能等技术的运用,租赁系统能够快速而准确地处理各类租赁需求,实现信息的全面掌握和准确分析,为企业提供决策支持和运营......
  • 几种数据库忘记密码的处理方法
    MySQL8.0分为rpm方式和tar.gz安装方式不同而不同需要修改/etc/my.conf配置文件.注意如果是rpm包的话就在这个路径下面修改增加内容skip-grant-tables注意修改完需要重启数据库rpm包安装的方式重启方法为:systemctlrestartmysqld然后可以无密码登录数据mysql-uro......
  • 武汉星河互娱:手游行业新趋势与盈利模式的深度解析
    随着科技的飞速发展,手游行业正以前所未有的速度在成长壮大。近日,业内专家针对手游行业的趋势和盈利模式进行了深入解析,为我们揭示了这个行业的最新动态。首先,手游行业的发展趋势正在向多元化和个性化转变。传统的游戏模式已不能满足玩家的需求,他们更加注重游戏的体验感和个性化设置......
  • 深度解析Java中的ReadWriteLock:高效处理并发读写操作
    第1章:引言大家好,我是小黑,今天咱们聊聊读写锁。当多个线程同时对同一数据进行读写操作时,如果没有合理的管理,那数据就乱套了。就好比小黑在写日记,突然来了一帮朋友,大家都想往日记本上写点什么,不加以控制,日记本就成了涂鸦板。这时,ReadWriteLock就派上用场了。它可以确保当一个线程......