PHP中的RSA加密过程

时间:2013-05-14 11:17:15

标签: php encryption rsa

为了理解非对称加密过程,我概述了一个简单的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']);
}

?>

Output from the loop

2 个答案:

答案 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是巨大的数字。消息也被分成较小的消息并提供许多值的流。例如,您可以解密部分数字,然后将其求和以获得最终值。在更高级的情况下,将每个符号编码为数字,并逐个编码/解码。