为了理解非对称加密过程,我概述了一个简单的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']);
}
?>
答案 0 :(得分:2)
http://en.wikipedia.org/wiki/RSA_(algorithm)
2.2加密:
然后,Bob希望将消息M发送给Alice。他 首先将M变成整数m,使得0≤m<1。 n 使用 商定的可逆协议称为填充方案。 ... Alice将她的公钥(n,e)传送给Bob并保留
这不适用于此,因此您需要使用更大的分解。
答案 1 :(得分:1)
问题在于小$p
和$q
值。正如我们在评论中注意到的那样,$n=$p*$q
更大的值开始返回后会失败。
问题从$i>$n
开始,然后是encription / decription返回错误的数字。
怎么办?
在实际问题中,$p
和$q
是巨大的数字。消息也被分成较小的消息并提供许多值的流。例如,您可以解密部分数字,然后将其求和以获得最终值。在更高级的情况下,将每个符号编码为数字,并逐个编码/解码。