【问题标题】:RSA Encryption process in PHPPHP中的RSA加密过程
【发布时间】: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


【解决方案1】:

http://en.wikipedia.org/wiki/RSA_(algorithm)

2.2 加密:

[...] Bob 然后希望将消息 M 发送给 Alice。他 首先将 M 转换为整数 m,使得 0 ≤ m 通过使用 商定的可逆协议,称为填充方案。 ...爱丽丝将她的公钥 (n, e) 传输给鲍勃并保留

这里不成立,因此您需要使用更大的分解。

【讨论】:

    【解决方案2】:

    问题在于较小的 $p$q 值。正如我们在 cmets 中注意到的,$n=$p*$q 的较大值稍后开始返回失败。

    问题从$i&gt;$n 开始,然后加密/解密返回错误的数字。

    怎么办? 在实际问题中,$p$q 是巨大的数字。消息也被分成更小的一个,并提供许多值的流。例如,您可以解密部分号码,然后将其相加得到最终值。在更高级的情况下,将每个符号编码为一个数字,并逐个编码/解码它们。

    【讨论】:

    • 这是有道理的。但是,在 PHP 中,当我使用较大的键(比如 47 和 71)时,返回的所有内容都是 nan 我认为它们对于整数空间来说太大了?
    • 然后使用 BCMath 或 GMP 扩展。
    • 然后pow($sample,$key['e']) 返回巨大的数字。您可以将 $i 拆分成更小的部分来修复它。
    猜你喜欢
    • 2015-03-16
    • 1970-01-01
    • 1970-01-01
    • 2012-11-15
    • 1970-01-01
    • 2013-03-02
    • 2017-06-20
    • 1970-01-01
    相关资源
    最近更新 更多