搜索
首页后端开发php教程 Blowfish加密,诀别使用PHP和C++实现,但结果不同.

Blowfish加密,分别使用PHP和C++实现,但结果不同...
先是MD5实验,结果相同,但使用Blowfish实验,怎么做也成功不了
调用如下:

PHP code
<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--><?php $cipher = mcrypt_module_open(MCRYPT_BLOWFISH, '', MCRYPT_MODE_ECB, '');

    $iv   = '00000000';
    $key  = "strkey11";

    $stext = '38A0E9312DDA8F7C16B9A12159168C76';
    $stext = md5($stext, true);
    //经过调试知道,在这时$stext的值与C++中MD5后的结果一致

    if (mcrypt_generic_init($cipher, $key, $iv) != -1)
    {
        $dtext = mcrypt_generic($cipher,$stext );
        mcrypt_generic_deinit($cipher);

        // Display the result in hex.
        printf("blowfish encrypted:<br>%s<br><br>",strtoupper(bin2hex($dtext)));
    }
    mcrypt_module_close($cipher);


C++的是这样:
C/C++ code
<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->    MD5_CTX md5;
    unsigned char str[16];
    md5.MD5String(strSource.c_str() ,str);

    BlockCipher *bf;
    char key[] = "strkey11";              //Key
    bf = new BlowFish();
    bf->setKey((void *)key, 8*8);

    bf->encrypt((void *)str, 8);      //unsigned char str[16];
    bf->encrypt((void *)(str+8), 8);
    char temp1[4] = {0};
    char buff1[128] = {0};
    for(int i = 0;i


------解决方案--------------------
$iv = '00000000'; ???
按 bf->setKey((void *)key, 8*8); 理解
应该是
$iv = "\x00\x00\x00\x00\x00\x00\x00\x00";
吧?

------解决方案--------------------
IV is ignored in ECB. IV MUST exist in CFB, CBC, STREAM, nOFB and OFB modes.
MCRYPT_MODE_ECB的模式,$iv是忽略的,应该不是这个问题。

好像是加密之前要padding,你试试看
$size = mcrypt_get_block_size(MCRYPT_BLOWFISH, MCRYPT_MODE_ECB);
$input = pkcs5_pad($input, $size); 

function pkcs5_pad ($text, $blocksize)
{
$pad = $blocksize - (strlen($text) % $blocksize);
return $text . str_repeat(chr($pad), $pad);
}

function pkcs5_unpad($text)
{
$pad = ord($text{strlen($text)-1});
if ($pad > strlen($text)) return false;
if (strspn($text, chr($pad), strlen($text) - $pad) != $pad) return false;
return substr($text, 0, -1 * $pad);
}
------解决方案--------------------
c++的结果是不是有问题,这里有个在线blowfish加密的,你可以验证一下
http://webnet77.com/cgi-bin/helpers/blowfish.pl
------解决方案--------------------

首先你要弄清楚到底是PHP错了还是C++错了,我之前用bin2hex确实不对,但是md5之后是二进制数据没法验证,
你能不能不要用md5直接字符abcdefgh, 加密后是什么?

网页结果是
明文 abcdefgh
密文 5B4148819C51DCB5
------解决方案--------------------
我用了PHP的在线解码
http://www.tools4noobs.com/online_tools/decrypt/

5B4148819C51DCB5能解密出来,但是12DB6214F5EAB031解不出来

是不是C++程序有什么不一样?只要能加密解密不能算错,但是要互相能解密加密就必须遵循一样的算法。

同样的对称算法,同样的key,不大可能密文是不一样的,除了有些随机干扰。但是从blowfish的算法看,
并没有随机干扰,是不是有可能是pbox,sbox定义的不一样?
------解决方案--------------------
关于C++代码,有两个问题你可以确认一下
1)bf->setKey((void *)key, 8*8); 第二个参数应该是key的长度,为什么是8*8?
2)PHP有设置ECB模式,但是c++里没有,是不是缺省就是ECB?
------解决方案--------------------
我找到原因了,你的算法跟PHP的blowfish算法不一样,c++的算法是blowfish-compat

所以改成$cipher = mcrypt_module_open('blowfish-compat', '', MCRYPT_MODE_ECB, '');
这样就应该可以了。
声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
php 怎么替换mcryptphp 怎么替换mcryptOct 31, 2022 am 09:46 AM

php替换mcrypt的方法:1、打开相应的php文件;2、找到原来的加密和解密代码;3、使用“openssl_encrypt”以及“openssl_decrypt”方法进行替代即可。

php提交表单通过后,弹出的对话框怎样在当前页弹出,该如何解决php提交表单通过后,弹出的对话框怎样在当前页弹出,该如何解决Jun 13, 2016 am 10:23 AM

php提交表单通过后,弹出的对话框怎样在当前页弹出php提交表单通过后,弹出的对话框怎样在当前页弹出而不是在空白页弹出?想实现这样的效果:而不是空白页弹出:------解决方案--------------------如果你的验证用PHP在后端,那么就用Ajax;仅供参考:HTML code<form name="myform"

Linux系统Apache优化与防盗链详细教程Linux系统Apache优化与防盗链详细教程Feb 20, 2024 am 09:00 AM

以下是关于Linux系统下Apache优化和防盗链的详细教程:Apache性能优化:启用压缩:在Apache配置文件中启用Gzip压缩来减小传输数据的大小。LoadModuledeflate_modulemodules/mod_deflate.soAddOutputFilterByTypeDEFLATEtext/htmltext/plaintext/xmltext/cssapplication/javascript

完全教程:如何使用php扩展MCrypt进行加密和解密完全教程:如何使用php扩展MCrypt进行加密和解密Jul 28, 2023 pm 12:25 PM

完全教程:如何使用PHP扩展MCrypt进行加密和解密引言在现代网络应用中,数据的保密性和安全性显得尤为重要。为了确保数据传输和存储的安全,加密技术成为一个必备工具。在PHP中,MCrypt扩展提供了一种简便的方式来加密和解密数据。本教程将向您展示如何使用PHP扩展MCrypt进行加密和解密。第一步:安装MCrypt扩展MCrypt扩展是一个用于加密和解密数

图片消失怎么解决图片消失怎么解决Apr 07, 2024 pm 03:02 PM

图片消失如何解决先是图片文件上传$file=$_FILES['userfile'];  if(is_uploaded_file($file['tmp_name'])){$query=mysql_query("INSERT INTO gdb_banner(image_src ) VALUES ('images/{$file['name'

不用数据库来实现用户的简单的下载,代码如下,但是却不能下载,请高手找下原因,文件路劲什么的没有关问题不用数据库来实现用户的简单的下载,代码如下,但是却不能下载,请高手找下原因,文件路劲什么的没有关问题Jun 13, 2016 am 10:15 AM

不用数据库来实现用户的简单的下载,代码如下,但是却不能下载,请高手找下原因,文件路劲什么的没问题。<?phpfunction down_file($file_name,$file_sub_dir){//为防止乱码使用函数iconv$file_name=iconv("utf-8","gb2312",$file_

为什么小弟我在php上写的这个代码,在浏览器上什么都不显示为什么小弟我在php上写的这个代码,在浏览器上什么都不显示Jun 13, 2016 am 10:24 AM

为什么我在php上写的这个代码,在浏览器上什么都不显示啊<?php   if(isset($_POST['Submit'])&& $_POST['Submit']=="登陆"){   $user=$_POST['user']; $pass=$_POST['pass']; if(empt

图片消失怎么解决图片消失怎么解决Jun 13, 2016 am 10:09 AM

图片消失如何解决先是图片文件上传$file=$_FILES['userfile'];  if(is_uploaded_file($file['tmp_name'])){$query=mysql_query("INSERT INTO gdb_banner(image_src ) VALUES ('images/{$file['name'

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
3 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
3 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
3 周前By尊渡假赌尊渡假赌尊渡假赌

热工具

安全考试浏览器

安全考试浏览器

Safe Exam Browser是一个安全的浏览器环境,用于安全地进行在线考试。该软件将任何计算机变成一个安全的工作站。它控制对任何实用工具的访问,并防止学生使用未经授权的资源。

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

功能强大的PHP集成开发环境

MinGW - 适用于 Windows 的极简 GNU

MinGW - 适用于 Windows 的极简 GNU

这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

EditPlus 中文破解版

EditPlus 中文破解版

体积小,语法高亮,不支持代码提示功能