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 暗号化:

[...] 次に、ボブはメッセージ M をアリスに送信したいと考えています。彼は最初に、パディング スキームとして知られる合意された可逆プロトコルを使用して、0 ≤ m < nとなるように M を整数 m に変換します。...アリスは自分の公開鍵 (n, e) をボブに送信し、

これはここでは当てはまらないため、より大きな因数分解を使用する必要があります。

于 2013-05-14T12:27:18.203 に答える
1

問題は小さく$p$q価値があります。コメントで気づいたように、$n=$p*$qstarts の値が大きいと後で失敗します。

の場合に問題が発生し$i>$n、encription/decription が間違った数値を返します。

何をすべきか?実際の問題で$pは、$q膨大な数です。また、メッセージはより小さなものに分割され、多くの値のストリームとして提供されます。たとえば、番号の一部を解読し、それを合計して最終的な値を取得できます。より高度なケースでは、すべてのシンボルを数値としてコーディングし、それらを 1 つずつエンコード/デコードします。

于 2013-05-14T12:14:57.667 に答える