gpt4 book ai didi

PHP mcrypt 问题

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:00:04 27 4
gpt4 key购买 nike

代码:

    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");

发生此错误:(函数中的第三个参数)

mcrypt_generic_init(): Key size too large; supplied length: 64, max: 32

第三个参数是静态键,它必须是 64 个字符长的字符串。不能少。我试图更改 MCRYPT_RIJNDAEL_128 FOR MCRYPT_RIJNDAEL_256 但在发生此错误后(函数中的第二个参数)

mcrypt_generic_init(): Iv size incorrect; supplied length: 16, needed: 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="test@tes.sk">
<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(不正确)

门测试环境中的相同数据是符号:FCBA944122EF996CE6E50B6229753CA7(正确)

编辑:

部分文档作为图像:

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

EDIT2:他们给我发了新的(工作)类(class),所以也许它会对某人有所帮助 :) http://pastebin.com/DKiXPMiE

最佳答案

您不应再使用 MCrypt 函数。为什么?因为 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 密码(具有 128 位 block 大小的 Rijndael)时检查 DES 算法的 block 大小。

此外:您的 IV 必须是随机的1,这就是 IV 的重点。


如果你真的想创建自己的加密库(你不应该),那么推荐的解决方案是使用 PHP 的 OpenSSL 扩展。但是:加密很难,特别难。一个好的加密包装器需要多个密码学家和 PHP 专家一起工作,互相检查并仔细检查代码中的每个更改。仔细审查每一个决定。

1:在这种情况下随机意味着加密质量随机。对于 php 这意味着你应该使用 random_bytes() , 的一部分 CSPRNG .

关于PHP mcrypt 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37406677/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com