低于 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);
}