【问题标题】:PHP - Glitchy mod (%) operatorPHP - Glitchy mod (%) 运算符
【发布时间】:2014-07-09 11:05:47
【问题描述】:

由于某种原因:显示如下:

3 to the power of x mod 17 is 19. This is called v.

Shared person a (v):
19 

并且在脚本中是这样的(该脚本用于描述 Diffie-Hellman 密钥交换算法。):

$p="17";
$g="3";
$px=gmp_nextprime(rand());
$x=gmp_strval($px);
$a=$g^$x%$p;
echo "$g to the power of x mod $p is $a. This is called v.<br>";
echo "<br>Shared person a (v):<br>";
echo "$a <br>";

想知道这是否是一种 PHP 故障,因为:

if{x mod y=z}, z<y

现在我的问题: 如何解决这个问题? 我做错了什么吗? 这是 PHP 故障吗?

(我知道代码需要清理。)

补充说明: $x = 2047401017

【问题讨论】:

  • 你为什么不使用gmp_powm()?尤其是指数那么大。
  • 我遇到的第二个问题:数字太大。 PHP 语言本身只支持最大 2^31-1 的整数大小。我不认为 3^(20 亿)对我有好处。
  • 这正是你应该使用 gmp 的原因。

标签: php operators modulo diffie-hellman


【解决方案1】:

好吧,^ 不是幂运算符 并且 模在它们之前;此外,GMP 已经具有幂模功能:

$p="17";
$g="3";
$px=gmp_nextprime(rand());

$a = gmp_powm($g, $px, $p);

echo "$g to the power of x mod $p is $a. This is called v.<br>";
echo "<br>Shared person a (v):<br>";
echo "$a <br>";

【讨论】:

    【解决方案2】:

    ^ 不是指数运算符,而是按位异或运算符。自 PHP 5.6 起,指数运算符为 **。所以应该是

    $a = ($g ** $x) % $p;
    

    $a = $g ** ($x % $p);
    

    指数运算符是在 PHP 5.6 中添加的。在此之前,需要使用pow()函数:

    $a = pow($g, $x) % $p;
    

    【讨论】:

    • 我喜欢你的回答,但我收到了这个错误:PHP Parse error: syntax error, unexpected '*'
    • 指数运算符是在 PHP 5.6 中添加的。听起来您正在运行旧版本。
    • "PHP 版本 5.4.4-14+deb7u11" 感谢您提示我过时。这让我不得不更新 Linux Headers。 :)
    猜你喜欢
    • 2011-07-28
    • 1970-01-01
    • 2011-02-15
    • 2019-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多