5 之前的 PHP 版本没有 bcpowmod 函数。此例程使用 bcdiv、bcmod 和 bcmul 模拟此函数。能够使用 bcpowmod 很重要,因为它通常用于实现 RSA 算法。
bcpowmod(v, e, m) 函数应该等效于 bcmod(bcpow(v, e), m)。但是,对于 RSA 算法中用作密钥的大数字,bcpow 函数会生成一个太大而溢出的数字。对于任何大于几万的指数,bcpow 都会溢出并返回 1。
此例程将遍历一个循环,对于指数中的每个位,对结果进行平方,并对模数进行取模。在每次迭代中,指数向右移一位。当指数被缩减为零时,计算结束。
此方法可能比 bcpowmod 慢,但至少它可以工作。
function PowModSim($Value, $Exponent, $Modulus)
{
// 检查是否需要模拟。
if (function_exists("bcpowmod"))
return (bcpowmod($Value, $Exponent, $Modulus));
// 循环直到指数被缩减为零。
$Result = "1";
while (TRUE)
{
if (bcmod($Exponent, 2) == "1")
$Result = bcmod(bcmul($Result, $Value), $Modulus);
if (($Exponent = bcdiv($Exponent, 2)) == "0") break;
$Value = bcmod(bcmul($Value, $Value), $Modulus);
}
return ($Result);
}