ホームページ バックエンド開発 PHPチュートリアル Blowfish 暗号化はそれぞれ PHP と C++ を使用して実装されますが、結果は異なります。

Blowfish 暗号化はそれぞれ PHP と C++ を使用して実装されますが、結果は異なります。

Jun 13, 2016 pm 01:10 PM
mcrypt quot text

Blowfish 暗号化はそれぞれ PHP と C++ を使用して実装されていますが、結果は異なります...
最初は MD5 実験です。結果は同じですが、Blowfish 実験を使用すると、どんなに頑張っても失敗します。
呼び出しは次のとおりです:

PHP コード
<!--

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

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

    $iv   = '00000000';
    $key  = &quot;strkey11&quot;;

    $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(&quot;blowfish encrypted:&lt;br&gt;%s&lt;br&gt;&lt;br&gt;",strtoupper(bin2hex($dtext)));
    }
    mcrypt_module_close($cipher);

ログイン後にコピー

C++ は次のようになります:
C/C++ コード
<!--

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-&gt;setKey((void *)key, 8*8);

    bf-&gt;encrypt((void *)str, 8);      //unsigned char str[16];
    bf-&gt;encrypt((void *)(str+8), 8);
    char temp1[4] = {0};
    char buff1[128] = {0};
    for(int i = 0;i&lt;16;i++)
    {
        sprintf(temp1,&quot;%02x&quot;,str[i]);
        strcat(buff1,temp1);
    }
    AnsiString strResult = String(buff1).UpperCase();
    delete bf;
ログイン後にコピー


------解決策--- -------
$iv = '00000000'; 🎜>Press bf->setKey((void *)key, 8 *8);

$iv = "x00x00x00x00x00x00x00x00";
である必要があることを理解していますね。


------解決策------IV は CFB に存在しなければなりません。 、CBC、STREAM、nOFB および OFB モード。
MCRYPT_MODE_ECB モード、$iv は無視されます。これは問題ではありません。

暗号化の前にパディングが必要なようです、試してみてください
$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++の結果に問題はありますか?オンラインのフグ暗号化です。検証できます
http://webnet77.com/cgi-bin/helpers/blowfish.pl

------解決策----------------------
まず、何があるか理解する必要がありますPHP が間違っているのか、C++ が間違っているのか? 以前 bin2hex を使用したのですが、md5 以降のバイナリ データが検証できません。
md5 の直接文字 abcdefgh は使用できません。暗号化後はどうなるのでしょうか?

Web ページの結果は、
平文 abcdefgh
暗号文 5B4148819C51DCB5 です。

------解決策---------PHP のオンライン デコードを使用しました
http:/ /www.tools4noobs.com/online_tools/decrypt/

5B4148819C51DCB5 は復号化できますが、12DB6214F5EAB031 は復号化できません

C++ プログラムに違いはありますか?暗号化と復号化ができる限り、計算ミスはあり得ませんが、相互に復号化と暗号化をできるようにしたい場合は、同じアルゴリズムに従う必要があります。

同じ対称アルゴリズムと同じ鍵を使用すると、ランダムな干渉を除いて、暗号文が異なる可能性はほとんどありません。しかし、Blowfish アルゴリズムから判断すると、
にはランダムな干渉がありません。pbox と sbox の定義が異なる可能性はありますか?

------解決策--------- C++ コードに関して、確認できる質問が 2 つあります
1) bf->setKey((void *)key, 8*8); 2 番目のパラメータはキーの長さである必要がありますが、なぜ 8*8 なのでしょうか?
2) PHP は ECB モードを設定しました、しかし、それはデフォルトではECBですか?

------解決策------------------ 理由がわかりました。あなたのアルゴリズムは PHP の flowfish アルゴリズムとは異なります。C++ アルゴリズムは、blowfish-compat

なので、$cipher = mcrypt_module_open('blowfish-compat', '', MCRYPT_MODE_ECB, '') に変更してください。 );
それで十分です。
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットな記事タグ

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

PHPでmcryptを置き換える方法 PHPでmcryptを置き換える方法 Oct 31, 2022 am 09:46 AM

PHPでmcryptを置き換える方法

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

php提交表单通过后,弹出的对话框怎样在当前页弹出,该如何解决

Linux システムにおける Apache の最適化とホットリンク防止に関する詳細なチュートリアル Linux システムにおける Apache の最適化とホットリンク防止に関する詳細なチュートリアル Feb 20, 2024 am 09:00 AM

Linux システムにおける Apache の最適化とホットリンク防止に関する詳細なチュートリアル

完全なチュートリアル: PHP 拡張機能 MCrypt を使用して暗号化および復号化する方法 完全なチュートリアル: PHP 拡張機能 MCrypt を使用して暗号化および復号化する方法 Jul 28, 2023 pm 12:25 PM

完全なチュートリアル: PHP 拡張機能 MCrypt を使用して暗号化および復号化する方法

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

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

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

为什么小弟我在php上写的这个代码,在浏览器上什么都不显示

写真が消える問題を解決する方法 写真が消える問題を解決する方法 Apr 07, 2024 pm 03:02 PM

写真が消える問題を解決する方法

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

图片消失怎么解决

See all articles