2016-05-24 45 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:(在功能第三參數)

mcrypt_generic_init():密鑰太大;提供的長度:64,最大值:32

第三個參數是靜態鍵,它必須是64個字符長的字符串。它不能少。我試圖改變MCRYPT_RIJNDAEL_128 FOR MCRYPT_RIJNDAEL_256但這個錯誤occurrs後(在函數第二個參數)

mcrypt_generic_init():㈣尺寸不正確;提供的長度:16,需要:32

我希望是誰的人會幫我:)

編輯:

整個測試文件:

<?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)

隨着柵測試環境相同的數據登錄:FCBA944122EF996CE6E50B6229753CA7(正確)

編輯:

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

EDIT2:文檔作爲圖像

一部分,他們已經發出我新(工作)類,所以也許它會幫助別人:) http://pastebin.com/DKiXPMiE

+0

這是我需要使用的一個支付門的開發者的功能。實際上我需要相同的輸出,但我需要可以工作的功能。由於沒有正確的輸出,我無法進入大門。所以我不能用更好的加密或類似的東西來實現功能。 – UareBugged

+0

他們正在談論它的一部分文檔。該標誌應該如何看起來像http://i.imgur.com/hNkuRoq.png。關鍵是那64個字符長的第三個參數。 IV是第二個參數。它只是字符串+反轉字符串。第一個參數只是幾個字符串的組合 – UareBugged

+0

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

回答

1

你不應該使用MCrypt功能離子了。爲什麼?因爲MCrypt被認爲是棄用。圖書館不再積極維護,並且長期以來不會對其進行修復。

我可以給你的最好的建議是:不要創建你自己的密碼的東西。相反,請使用standard library instead


此外,在這種特定情況下,我已經可以發現您的簽名功能問題。

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

換句話說,您選擇該DES算法的塊大小而使用MCRYPT_RIJNDAEL_128密碼(Rijndael算法與128位塊大小)。

另外:你的IV 必須是隨機的,這就是IV的全部要點。


如果你真的想創建自己的加密庫(你不應該),那麼推薦的解決方案是使用PHP的OpenSSL擴展。但是:加密很難,特別困難。一個好的加密包裝要求多個加密技術人員和PHP專家一起工作,互相檢查並仔細檢查代碼中的每個更改。仔細檢查每一個決定。

:在這種情況下的隨機意味着密碼質量隨機。對於php,這意味着您應該使用random_bytes(),這是CSPRNG的一部分。

+0

這是我需要使用的一個支付門的開發者的功能。實際上我需要相同的輸出,但我需要可以工作的功能。由於沒有正確的輸出,我無法進入大門。所以我不能通過更好的加密或類似的功能發揮作用 – UareBugged

+0

如果這是爲了與支付網關一起使用,您應該提交一份錯誤報告,並且根據您的國家,可能需要向相關機構報告用於使用與支付數據有關的不安全加密。 – Jacco

+0

我不知道'libsodium'暴露給PHP,我同意你寫的所有內容,從我+1以及感謝'libsodium'提示。對於OP:您可以使用'openssl'庫而不是'mcrypt'來重新創建所需的所有內容。然而,他們實施的「安全性」包含一個巨大的漏洞,你應該提交一份像Jacco寫的bug報告。 – Mjh