4

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

?>

循环的输出

4

2 回答 2

2

http://en.wikipedia.org/wiki/RSA_(算法)

2.2 加密:

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

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

于 2013-05-14T12:27:18.203 回答
1

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

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

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

于 2013-05-14T12:14:57.667 回答