2016-05-24 42 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