2016-05-24 7 views
1

コード:PHP mcryptの問題

function sign($data,$iv,$hexKey){ 
     $_cipher = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CBC, ''); 
     $binKey32 = hex2bin($hexKey); 
     $block = mcrypt_get_block_size('des', MCRYPT_MODE_CBC); 
     $pad = $block - (strlen($data) % $block); 
     $data .= str_repeat(chr($pad), $pad); 
     mcrypt_generic_init($_cipher, $hexKey, $iv); 
     $result = mcrypt_generic($_cipher, $data); 
     mcrypt_generic_deinit($_cipher); 
     return strtoupper(substr(bin2hex($result),0,32)); 
    } 

問題は、たとえば、私はこの関数を呼び出した場合ということです:

$sign = sign("string", "strinGGnirts", "1234567812345678123456781234567812345678123456781234567812345678"); 

このエラーがoccurrs:(3番目のパラメータを関数内で)

mcrypt_generic_init():キーのサイズが大きすぎます。提供された長さ:64、最大:32

第3のパラメータは静的キーであり、64文字の長い文字列でなければなりません。それは小さくはありません。私は(関数内の第二パラメータ)

てmcrypt_generic_init()MCRYPT_RIJNDAEL_256のためではなく、このエラーoccurrs後MCRYPT_RIJNDAEL_128を変更しようとしました:間違ったIvのサイズ。付属の長さ:16、必要に応じ:32

私は私を助ける誰か:)

EDITがあることを願っています:

全体のテストファイル:

<?php 
function sign($data,$iv,$hexKey){ 
    $_cipher = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CBC, ''); 
    $binKey32 = hex2bin($hexKey); 
    $block = mcrypt_get_block_size('des', MCRYPT_MODE_CBC); 
    $pad = $block - (strlen($data) % $block); 
    $data .= str_repeat(chr($pad), $pad); 
    mcrypt_generic_init($_cipher, $binKey32, $iv); 
    $result = mcrypt_generic($_cipher, $data); 
    mcrypt_generic_deinit($_cipher); 
    return strtoupper(substr(bin2hex($result),0,32)); 
} 

$sign = sign("demoOMED"."10.50"."EUR"."10000"."Michal"."Test"."2015-05-05 14:57:13", "demoOMEDDEMOomed", "1234567812345678123456781234567812345678123456781234567812345678"); 
print_r($sign);?> 
<form method="post" action="https://doxxsl-staging.24-pay.eu/pay_gate/paygt" > 
<input type="hidden" name="Mid" value="demoOMED"> 
<input type="hidden" name="EshopId" value="11111111"> 
<input type="hidden" name="PreAuthProvided" value="false"> 
<input type="hidden" name="MsTxnId" value="10000"> 
<input type="hidden" name="Amount" value="10.50"> 
<input type="hidden" name="CurrAlphaCode" value="EUR"> 
<input type="hidden" name="ClientId" value="170"> 
<input type="hidden" name="FirstName" value="Michal"> 
<input type="hidden" name="FamilyName" value="Test"> 
<input type="hidden" name="Email" value="[email protected]"> 
<input type="hidden" name="Street" value="Kalov"> 
<input type="hidden" name="Zip" value="01001"> 
<input type="hidden" name="City" value="Žilina"> 
<input type="hidden" name="Country" value="SVK"> 
<input type="hidden" name="Timestamp" value="2015-05-05 14:57:13"> 
<input type="hidden" name="Sign" value="<?php echo $sign;?>"> 
<!-- PARAMETER DEBUG USE ONLY WHILE TESTING --> 
<input type="hidden" name="Debug" value="true"> 
<input type="submit" value="Test"> 

は、

これらのデータを使用して、Sign関数で出力しました:6C4BBF9D2EC23D03E010AA94B5A7E174(INCORRECT)

0123門のテスト環境には、同じデータを持つ

サインさ:FCBA944122EF996CE6E50B6229753CA7(CORRECT)

編集:画像などのドキュメントの

パート:

http://i.imgur.com/hNkuRoq.png

EDIT2:彼らが送られてきたが私は新しい(作業)クラスなので多分誰かを助けるでしょう:) http://pastebin.com/DKiXPMiE

+0

私は使用する必要がある1つのペイメントゲートの開発者からの機能です。実際には私は同じ出力が必要ですが、私は機能する必要があります。正しい出力がなければ私はゲートにアクセスすることができません。だから、私はより良い暗号化やそのようなもので機能を作ることはできません。 – UareBugged

+0

彼らが話しているドキュメントの一部があります。そのサインはどのように見えるのですか?http://i.imgur.com/hNkuRoq.png。キーは、64文字の長さの第3パラメータです。 IVは第2パラメータである。それは単なるストリング+逆のストリングです。最初のパラメータは、ほんの少しの文字列の組み合わせです。 – UareBugged

+0

http://stackoverflow.com/a/1628177/5006740 – strangeqargo

答えて

1

あなたはMCrypt functイオン。どうして? MCryptは放棄されたとみなされるのでです。ライブラリーはもはや積極的に維持されておらず、長い時間以来、a long list of known bugsは修正されていません。

私があなたに与えることができる最良のアドバイスは:自分の暗号のものを作成しないことです。代わりにstandard library insteadを使用してください。


また、この特定のケースでは、私はすでにあなたの署名機能に関する問題を見つけることができます。すなわち

<?php 
... 
$_cipher = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', CRYPT_MODE_CBC, ''); 
... 
$block = mcrypt_get_block_size('des', MCRYPT_MODE_CBC); 

MCRYPT_RIJNDAEL_128暗号を使用している間、あなたはDESアルゴリズムのブロックサイズを確認する(128ビットでラインダールサイズブロ​​ック)。

はまた:あなたIV ランダムにする必要があり、それは、IVの全体のポイントです。


独自の暗号ライブラリを作成したい場合は、PHPのOpenSSL拡張機能を使用することをお勧めします。しかし、暗号は非常に難しく、非常に難しい。優れた暗号ラッパーを使用するには、複数の暗号学者とPHP専門家が協力し合ってお互いをチェックし、コードの各変更をダブルチェックする必要があります。あらゆる決定を精査する。

:この場合のランダムは、暗号品質のランダムを意味します。 PHPでは、random_bytes()、部分はCSPRNGの部分を使用する必要があります。

+0

私は使用する必要がある1つの支払いゲートの開発者からの機能です。実際には私は同じ出力が必要ですが、私は機能する必要があります。正しい出力がなければ私はゲートにアクセスすることができません。だから私はより良い暗号化などの機能を作ることができません – UareBugged

+0

これは、支払いゲートウェイで使用するためのものであれば、バグレポートを提出する必要があります、あなたの国によっては、関係当局に報告することが必要な場合があります支払いデータに関連して安全でない暗号を使用する。 – Jacco

+0

私は 'libsodium'がPHPにさらされているという手がかりを持っていませんでした。あなたが書いたものすべてに同意します。私の+1と' libsodium'チップのおかげです。 OPの場合: 'mcrypt'の代わりに' openssl'ライブラリを使って必要なものをすべて再作成することができます。しかし、実装した "セキュリティ"には大きな穴があり、Jaccoが書いたようなバグレポートを提出する必要があります。 – Mjh