【发布时间】:2013-05-08 15:38:52
【问题描述】:
为了理解非对称加密过程,我概述了一个简单的 PHP 脚本来加密和解密简单数字。我注意到,在给定数字加密/解密一段时间后,算法会失败,因为解密后的数字和初始数字不匹配。我放了一个循环来查看算法在加密和解密 100 个数字时的执行情况,而在数字 32 之后,这个过程就崩溃了。
这是因为 p*q = 33 吗?
<?php
# Test encrypto algo
// Choose prime keys
$p = 47; $q = 71;
// Compute n = pq
$n = $p*$q;
// Choose e such that 1 < e < f(n) and e and n are coprime
$e = 79;
// Compute a value for d such that (d * e) % f(n) = 1
$d = 1019;
// Compute f(n) = (p-1)(q-1)
$z = ($p - 1)*($q - 1);
// Create public and private keys
$pubK = array('n' => $n, 'e' => $e);
$privK = array('n'=> $n, 'd' => $d);
// Boundary for loop
$l = 100;
// Perform encypt/decrypt on 1..100
for($i = 1; $i <= $l; $i++)
{
$enc = enc($i, $pubK);
$dec = dec($enc, $privK);
print "encrypted <b>$i</b> = $enc decrypted $enc = <b>$dec</b> ";
if($i == $dec)
print "Success<br>";
else
print "Fail<br>";
}
// Encrypt sample with public key
function enc($sample, $key)
{
return bcmod(bcpow($sample,$key['e']),$key['n']);
}
// Decrypt encrypted sample with private key
function dec($sample, $key)
{
return bcmod(bcpow($sample, $key['d']),$key['n']);
}
?>
【问题讨论】:
-
将
$p设置为 5 看看会发生什么。我认为问题出在小 p 和q数字上。脚本应该在 54 次迭代时失败 -
你是对的。我将 p 和 q 设置为 3 和 5,但它在 14 上失败,它支持 (3*5) - 1。
-
well $key['n'] = 33 (cause 3*11) and it failed on 33...
-
好吧,也许你的算法是错误的。您是否将您的
$i拆分为小于n的值? -
我认为这个问题已经得到解答。键提供范围,因此它们需要更大。同样,当我使用较大的键时,PHP 给出了
NAN,数字太大了吗?
标签: php encryption rsa