美文网首页
兼容php7和php5的blowfish-compat加解密

兼容php7和php5的blowfish-compat加解密

作者: 赵海洋 | 来源:发表于2020-05-13 11:28 被阅读0次

我们的c++项目和php项目共同使用了blowfish-compat方式加密通信,但php升级到php7后,mcrypt扩展被废弃了。但openssl不支持blowfish-compat方式,于是多方查找和调试后,有了两个解决办法:

  1. 找到一个BlowFish的源码(非compat),将其改造成blowfish-compat
    2.调用openssl的BF-ECB类型加解密,但在前后进行字节序的调整。

前者只需要将 https://github.com/themattharris/PHP-Blowfish/blob/master/blowfish.php 代码中 'N2' 替换成 'V2'即可。
也可以直接使用我改过的版本:https://gist.github.com/k1988/c5c7f1bac1f94547b11c2a258c2a8ba3

后者,基于网上的一个代码改进如下:

<?php

// 使用内置openssl或mcrypt实现blowfish加解密的函数

$plaintext = '{123}';

// 替换字节序,并对齐8字节
function change_net_order($data){
    if ($m = strlen($data)%8)
        $data .= str_repeat("\x00",  8 - $m);

    $data = unpack('V*',$data);
    foreach($data as &$v){
        $v = pack("N", $v);
    }
    $data = join('', $data);
    return $data;
}

function encrypt($data, $key)
{
    $l = strlen($key);
    if ($l < 16)
        $key = str_repeat($key, ceil(16/$l));
    
    if (function_exists('mcrypt_encrypt'))
        $val = mcrypt_encrypt(MCRYPT_BLOWFISH_COMPAT, $key, $data, MCRYPT_MODE_ECB);
    else
    {
        $data = change_net_order($data);
        $val = openssl_encrypt($data, 'BF-ECB', $key, OPENSSL_RAW_DATA | OPENSSL_NO_PADDING);
        $val = change_net_order($val);
    }
    return $val;
}

function decrypt($data, $key)
{
    $l = strlen($key);
    if ($l < 16)
        $key = str_repeat($key, ceil(16/$l));

    if (function_exists('mcrypt_encrypt'))
        $val = mcrypt_decrypt(MCRYPT_BLOWFISH, $key, $data, MCRYPT_MODE_ECB);
    else
    {
        $data = change_net_order($data);
        $val = openssl_decrypt($data, 'BF-ECB', $key, OPENSSL_RAW_DATA | OPENSSL_NO_PADDING);
        $val = change_net_order($val);
    }
    return $val;
}

$data = $plaintext;
$encrypted = encrypt($data,  '1234567890123456');
echo "encryped => ". bin2hex($encrypted) ." <br/>";
echo "encryped-base64 => ". base64_encode($encrypted) ." <br/>";

echo "raw => ". trim(decrypt($encrypted, '1234567890123456')) ." <br/>";

相关文章

  • 兼容php7和php5的blowfish-compat加解密

    我们的c++项目和php项目共同使用了blowfish-compat方式加密通信,但php升级到php7后,mcr...

  • 2019-12-30

    PHP5.6 与 PHP7 加解密区别PHP5.6 PHP7 加解密方法

  • 安装PHP5、安装php7

    安装PHP5 安装PHP5 模块随用随取 安装php7 安装php7 查看php相关 更改Apache使用的php...

  • PHP7垃圾回收机制

    前面一篇文章我们聊了下PHP5的垃圾回收机制,本篇文章再来聊下PHP7的垃圾回收机制。PHP7的速度比PHP5快了...

  • centos lanmp环境php5升级为php7

    centos lanmp环境php5升级为php7 更新yum repo 卸载现有版本的php 安装新的php7及...

  • 安装PHP5、安装PHP7

    目录 一、安装PHP5二、安装PHP7 一、安装PHP5 下载源码包 解压 初始化 --prefix 指定安装目录...

  • 一篇写给准备升级PHP7的小伙伴的文章

    前言 本文是一篇讲座听后+后续研究的总结。话说当年追时髦,php7一出就给电脑立马装上了,php5和php7共存,...

  • PHP7使用MongoDB

    PHP7与PHP5使用的MongoDB不一样,还在使用PHP5的是用不上 安装MongoDB拓展 执行成功后,会输...

  • PHP7 为什么变快了?

    PHP7比PHP5在性能上有很大的提升那么PHP7做了那些优化?变量存储优化 1.存储变量的结构体变小,结构体成员...

  • lamp(三)——php安装

    11.10/11.11/11.12 安装PHP511.13 安装PHP7 安装php5 lamp安装顺序php一定...

网友评论

      本文标题:兼容php7和php5的blowfish-compat加解密

      本文链接:https://www.haomeiwen.com/subject/rltnnhtx.html