非対称暗号化プロセスを理解するために、単純な数値を暗号化および復号化する単純な 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']);
}
?>