搜尋
首頁後端開發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"

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

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

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

不用数据库来实现用户的简单的下载,代码如下,但是却不能下载,请高手找下原因,文件路劲什么的没有关问题不用数据库来实现用户的简单的下载,代码如下,但是却不能下载,请高手找下原因,文件路劲什么的没有关问题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

图片消失怎么解决图片消失怎么解决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: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.能量晶體解釋及其做什麼(黃色晶體)
2 週前By尊渡假赌尊渡假赌尊渡假赌
倉庫:如何復興隊友
4 週前By尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
4 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

MantisBT

MantisBT

Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

mPDF

mPDF

mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中