<span style="COLOR: #008000">/*</span><span style="COLOR: #008000"><br>* RSA アルゴリズムの実装<br>* (C) Copyright 2004 Edsko de Vries, Ireland<br>*<br>* Licensed under the GNU Public License (GPL) )<br>*<br>* この実装は [3] <br>* (Java/PHP の相互運用性がテスト済み) に対して検証されています。<br>*<br>* 参照:<br>* [1] "応用暗号化"、Bruce Schneier、John Wiley & Sons、1996<br>* [2] "Prime Number Hide-and-Seek"、Brian Raiter、Muppetlabs (オンライン)<br>* [3] "The Bouncy Castle Crypto Package"、 Legion of the Bouncy Castle、<br>* (Java 用オープンソース暗号ライブラリ、オンライン)<br>* [4] 「PKCS #1: RSA Encryption Standard」、RSA Laboratories テクニカル ノート、<br>* バージョン 1.5、改訂1993 年 11 月 1 日</span><br><span style="COLOR: #008000">*/</span><span style="COLOR: #000000"></span><br><br><span style="COLOR: #008000">/*</span><span style="COLOR: #008000"><br>* を目的とした関数この PHP モジュールのユーザーによって使用されます。<br>*<br>* 注:<br>* - $key と $modulus は (10 進数の) 文字列形式の数値である必要があります<br>* - $message は次のようになります。バイナリデータ<br>* - $keylength は 8 の倍数で、ビット単位である必要があります<br>* - rsa_encrypt/rsa_sign の場合、$message の長さは <br>* ($keylength / 8) を超えてはなりません - 11 ([4] で義務付けられている)。<br>* - rsa_encrypt と rsa_sign はメッセージにパディングを自動的に追加します。 <br>* rsa_encrypt の場合、このパディングはランダムな値で構成されます。 rsa_sign の場合、<br>* パディングは適切な数の 0xFF 値で構成されます ([4] を参照)<br>* - rsa_decrypt と rsa_verify はメッセージ パディングを自動的に削除します。<br>* - デコード用のブロック (rsa_decrypt、rsa_verify) <br>* ($keylength / 8) バイトの長さである必要があります。<br>* - rsa_encrypt と rsa_verify は公開キーを期待します。 rsa_decrypt と rsa_sign<br>* は秘密鍵を必要とします。</span><br><span style="COLOR: #008000">*/</span><span style="COLOR: #000000"></span><br><br><span style="COLOR: #0000ff">function</span><span style="COLOR: #000000"> rsa_encrypt( </span><span style="COLOR: #800080">$message</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000"> </span><span style="COLOR: #800080">$public_key</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000"> </span><span style="COLOR: #800080">$modulus </span><span style="COLOR: #000000">,</span><span style="COLOR: #000000"> </span><span style="COLOR: #800080">$keylength</span><span style="COLOR: #000000">)<br>{</span><br> <span style="COLOR: #800080">$padded</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> add_PKCS1_padding(</span><span style="COLOR: #800080">$message</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000"> </span><span style="COLOR: #800080">$keylength</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">/</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">8</span><span style="COLOR: #000000">);</span> <br> <span style="COLOR: #800080">$number</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> binary_to_number(</span><span style="COLOR: #800080">$padded</span><span style="COLOR: #000000">);</span><br> <span style="COLOR: #800080">$encrypted</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> pow_mod(</span><span style="COLOR: #800080">$number</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000"> </span><span style="COLOR: #800080">$public_key</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000"> </span><span style="COLOR: #800080">$modulus</span><span style="COLOR: #000000">);</span><br> <span style="COLOR: #800080">$result</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">number_to_binary(</span><span style="COLOR: #800080">$encrypted</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000"> </span><span style="COLOR: #800080">$keylength</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">/</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">8</span><span style="COLOR: #000000">);</span><br> <br> <span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> </span><span style="COLOR: #800080">$result</span><span style="COLOR: #000000">;<br>}</span><br><br><span style="COLOR: #0000ff">関数</span><span style="COLOR: #000000"> rsa_decrypt(</span><span style="COLOR: #800080">$message</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000"> </span><span style="COLOR: #800080">$private_key</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000"> </span><span style="COLOR: #800080">$modulus</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000"> </span><span style="COLOR: #800080">$keylength</span><span style="COLOR: #000000">)<br>{</span><br> <span style="COLOR: #800080">$number</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> binary_to_number(</span><span style="COLOR: #800080">$message</span><span style="COLOR: #000000">);</span><br> <span style="COLOR: #800080">$decrypted</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> pow_mod(</span><span style="COLOR: #800080">$number</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000"> </span><span style="COLOR: #800080">$private_key</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000"> </span><span style="COLOR: #800080">$modulus</span><span style="COLOR: #000000">);</span><br> <span style="COLOR: #800080">$result</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">number_to_binary(</span><span style="COLOR: #800080">$decrypted</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000"> </span><span style="COLOR: #800080">$keylength</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">/</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">8</span><span style="COLOR: #000000">);</span><br><br> <span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">remove_PKCS1_padding(</span><span style="COLOR: #800080">$result</span><span style="COLOR: #000000">、</span><span style="COLOR: #000000"> </span><span style="COLOR: #800080">$keylength</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">/</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">8</span><span style="COLOR: #000000">);<br>}</span><br><br><span style="COLOR: #0000ff">function</span><span style="COLOR: #000000"> rsa_sign(</span><span style="COLOR: #800080">$message</span><span style="COLOR: #000000"> 、</span><span style="COLOR: #000000"> </span><span style="COLOR: #800080">$private_key</span><span style="COLOR: #000000">、</span><span style="COLOR: #000000"> </span><span style="COLOR: #800080">$modulus</span><span style="COLOR: #000000">、</span><span style="COLOR: #000000"> </span><span style="COLOR: #800080">$keylength</span><span style="COLOR: #000000">)<br>{</span><br> <span style="COLOR: #800080">$padded</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> add_PKCS1_padding( </span><span style="COLOR: #800080">$message</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">false</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000"> </span><span style="COLOR: #800080">$keylength</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">/</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">8</span><span style="COLOR: #000000">);</span><br> <span style="COLOR: #800080">$number</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> binary_to_number(</span><span style="COLOR: #800080">$padded</span><span style="COLOR: #000000">);</span><br> <span style="COLOR: #800080">$signed</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> pow_mod(</span><span style="COLOR: #800080">$number</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000"> </span><span style="COLOR: #800080">$private_key</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000"> </span><span style="COLOR: #800080">$modulus</span><span style="COLOR: #000000">);</span><br> <span style="COLOR: #800080">$result</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">number_to_binary(</span><span style="COLOR: #800080">$signed</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000"> </span><span style="COLOR: #800080">$keylength</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">/</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">8</span><span style="COLOR: #000000">);</span><br><br> <span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> </span><span style="COLOR: #800080">$result</span><span style="COLOR: #000000">;<br>}</span><br><br><span style="COLOR: #0000ff">function</span><span style="COLOR: #000000"> rsa_verify( </span><span style="COLOR: #800080">$message</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000"> </span><span style="COLOR: #800080">$public_key</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000"> </span><span style="COLOR: #800080">$modulus </span><span style="COLOR: #000000">,</span><span style="COLOR: #000000"> </span><span style="COLOR: #800080">$keylength</span><span style="COLOR: #000000">)<br>{</span><br> <span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> rsa_decrypt( </span><span style="COLOR: #800080">$message</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000"> </span><span style="COLOR: #800080">$public_key</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000"> </span><span style="COLOR: #800080">$modulus </span><span style="COLOR: #000000">,</span><span style="COLOR: #000000"> </span><span style="COLOR: #800080">$keylength</span><span style="COLOR: #000000">);<br>}</span><br><br><span style="COLOR: #008000">/*</span> <span style="COLOR: #008000"><br>* 一部の定数</span><br><span style="COLOR: #008000">*/</span><span style="COLOR: #000000"></span><br><br><span style="COLOR: #008080">define</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">BCCOMP_LARGER</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">);</span><br><br><span style="COLOR: #008000">/*</span><span style="COLOR: #008000"><br>* 実際の実装。<br>* PHP での BCMath サポートが必要です (--enable-bcmath でコンパイル)</span><br><span style="COLOR: #008000"> */</span><span style="COLOR: #000000"></span><br><br><span style="COLOR: #008000">//</span><span style="COLOR: #008000">--<br>// (p ^ q) mod r を計算します <br>//<br>// [2]:<br>// (a) (p ^ q) mod r の前に (p ^ q) を計算することは避けてください。これは、典型的な RSA<br>// アプリケーションでは、(p ^ q) _WAY_ が大きすぎます。<br>// (つまり、__WAY__ が大きすぎて、コンピューターのメモリに収まりません。)<br>// (b) それでもかなり効率的です。<br>/ /<br>// p、q、r はすべて正であり、r はゼロ以外であると仮定します。<br>//<br>// $p 自体を $q 回乗算する、より単純なアルゴリズムに注意してください。 、<br>// すべてのステップで "mod $r" を適用することも有効ですが、これは O($q) ですが、この<br>// アルゴリズムは O(log $q) です。大きな違い。<br>//<br>// 私が見る限り、私が使用しているアルゴリズムは最適です。部分的な結果の計算には冗長性はありません<br>//。 <br>//--</span><span style="COLOR: #008000"></span><br><span style="COLOR: #0000ff">function</span><span style="COLOR: #000000"> pow_mod(</span><span style="COLOR: #800080">$p</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000"> </span><span style="COLOR: #800080">$q</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000"> </span><span style="COLOR: #800080">$r</span><span style="COLOR: #000000">)<br>{</span><br> <span style="COLOR: #008000">//</span><span style="COLOR: #008000"> $q から 2 のべき乗を抽出</span><span style="COLOR: #008000"></span><br><span style="COLOR: #000000"></span><span style="COLOR: #800080">$factors</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">array</span><span style="COLOR: #000000">();</span><br> <span style="COLOR: #800080">$div</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #800080">$q</span><span style="COLOR: #000000">;</span><br> <span style="COLOR: #800080">$power_of_two</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;</span><br> <span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">(</span><span style="COLOR: #008080">bccomp</span><span style="COLOR: #000000">(</span><span style="COLOR: #800080"> $div</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">) </span><span style="COLOR: #000000">= =</span><span style="COLOR: #000000"> BCCOMP_LARGER)<br> {</span><br> <span style="COLOR: #800080">$rem</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #008080">bcmod</span><span style="COLOR: #000000">(</span><span style="COLOR: #800080">$div</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">);</span><br> <span style="COLOR: #800080">$div</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #008080">bcdiv</span><span style="COLOR: #000000">(</span><span style="COLOR: #800080">$div</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">);</span><br> <br> <span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(</span><span style="COLOR: #800080">$rem</span><span style="COLOR: #000000">) </span><span style="COLOR: #008080">array_push</span><span style="COLOR: #000000">(</span><span style="COLOR: #800080">$factors</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000"> </span><span style="COLOR: #800080">$power_of_two</span><span style="COLOR: #000000">);</span><br> <span style="COLOR: #800080">$ power_of_two</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">;<br> }</span><br><br> <span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 各部分を使用して、各因子の部分結果を計算します<br> // 次の開始点としての結果。これは、<br> // 昇順に生成される 2 の因数に依存します。</span><span style="COLOR: #008000"></span><br><span style="COLOR: #000000"></span><span style="COLOR: #800080">$partial_results</span><span style="COLOR: #000000"> </span> <span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">配列</span><span style="COLOR: #000000">();</span><br> <span style="COLOR: #800080">$part_res</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">= </span><span style="COLOR: #000000"> </span><span style="COLOR: #800080">$p</span><span style="COLOR: #000000">;</span><br> <span style="COLOR: #800080">$idx</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;</span><br> <span style="COLOR: #0000ff">foreach</span><span style="COLOR: #000000">(</span><span style="COLOR: #800080">$factors</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">as</span><span style="COLOR: #000000"> </span><span style="COLOR: #800080">$factor</span><span style="COLOR: #000000">)<br> {</span><br> <span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">(</span><span style="COLOR: #800080">$idx</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000"><</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #800080">$factor</SPAN><SPAN style="COLOR: #000000">)<br/> {</SPAN><br/> <SPAN style="COLOR: #800080">$part_res</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #008080">bcpow</SPAN><SPAN style="COLOR: #000000">(</SPAN><SPAN style="COLOR: #800080">$part_res</SPAN><SPAN style="COLOR: #000000"> 、</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">2</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);</SPAN><br/> <SPAN style="COLOR: #800080">$part_res</SPAN> <SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #008080">bcmod</SPAN><SPAN style="COLOR: #000000">(</SPAN><SPAN style="COLOR: #800080">$part_res</SPAN><SPAN style="COLOR: #000000">,</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #800080">$r</SPAN><SPAN style="COLOR: #000000">);</SPAN><br/><br/> <SPAN style="COLOR: #800080">$idx</SPAN><SPAN style="COLOR: #000000">++</SPAN><SPAN style="COLOR: #000000">;<br/> } <br/> <br/> array_pus(</SPAN><SPAN style="COLOR: #800080">$partial_results</SPAN><SPAN style="COLOR: #000000">,</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #800080">$part_res</SPAN><SPAN style="COLOR: #000000">);<br/> }</SPAN><br/><br/> <SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000"> 最終結果の計算</SPAN><SPAN style="COLOR: #008000"></SPAN><br/><SPAN style="COLOR: #000000"></SPAN><SPAN style="COLOR: #800080">$result</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">1</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">;</SPAN><br/> <SPAN style="COLOR: #0000ff">foreach</SPAN><SPAN style="COLOR: #000000">(</SPAN><SPAN style="COLOR: #800080">$partial_results</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #0000ff">as</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #800080">$part_res</SPAN><SPAN style="COLOR: #000000">)<br/> {</SPAN><br/> <SPAN style="COLOR: #800080">$result</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #008080">bcmul</SPAN><SPAN style="COLOR: #000000">(</SPAN><SPAN style="COLOR: #800080">$result</SPAN><SPAN style="COLOR: #000000">,</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #800080">$part_res</SPAN><SPAN style="COLOR: #000000">);</SPAN><br/> <SPAN style="COLOR: #800080">$result</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #008080">bcmod</SPAN><SPAN style="COLOR: #000000">(</SPAN><SPAN style="COLOR: #800080">$result</SPAN><SPAN style="COLOR: #000000">,</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #800080">$r</SPAN><SPAN style="COLOR: #000000">);<br/> }</SPAN><br/><br/> <SPAN style="COLOR: #0000ff">return</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #800080">$result</SPAN><SPAN style="COLOR: #000000">;<br/>}</SPAN><br/><br/><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">--<br/>// 復号化された文字列にパディングを追加する関数<br/>// 知っておく必要がありますこれが秘密鍵または公開鍵の操作である場合 [4]<br/>//--</SPAN><SPAN style="COLOR: #008000"></SPAN><br/><SPAN style="COLOR: #0000ff">function</SPAN><SPAN style="COLOR: #000000"> add_PKCS1_padding(</SPAN><SPAN style="COLOR: #800080"> $data</SPAN><SPAN style="COLOR: #000000">、</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #800080">$isPublicKey</SPAN><SPAN style="COLOR: #000000">、</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #800080">$blocksize</SPAN><SPAN style="COLOR: #000000"> )<br/>{</SPAN><br/> <SPAN style="COLOR: #800080">$pad_length</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #800080">$blocksize</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #000000">-</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #000000">3</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #000000">-</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #008080">strlen</SPAN><SPAN style="COLOR: #000000">(</SPAN><SPAN style="COLOR: #800080">$data</SPAN><SPAN style="COLOR: #000000">);</SPAN><br/><br/> <SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000">(</SPAN><SPAN style="COLOR: #800080">$isPublicKey</SPAN><SPAN style="COLOR: #000000">)<br/> {</SPAN><br/> <SPAN style="COLOR: #800080">$block_type</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000"> x02</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">;</SPAN><br/> <br/> <SPAN style="COLOR: #800080">$padding</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #000000">""</SPAN><SPAN style="COLOR: #000000">;</SPAN><br/> <SPAN style="COLOR: #0000ff">for</SPAN><SPAN style="COLOR: #000000">(</SPAN><SPAN style="COLOR: #800080">$i</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #000000">; </SPAN><SPAN style="COLOR: #800080">$i</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #000000"></SPAN><SPAN style="COLOR: #000000">$pad_length</SPAN><SPAN style="COLOR: #800080">; >$i</SPAN><SPAN style="COLOR: #000000">++</SPAN><SPAN style="COLOR: #800080">)</SPAN> {<SPAN style="COLOR: #000000"></SPAN> <SPAN style="COLOR: #000000">$rnd<br/></SPAN> <br/><SPAN style="COLOR: #800080">=</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #000000">mt_rand</SPAN><SPAN style="COLOR: #000000">(</SPAN><SPAN style="COLOR: #008080">1</SPAN><SPAN style="COLOR: #000000">,</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #000000">255</SPAN><SPAN style="COLOR: #000000">) ;</SPAN><SPAN style="COLOR: #000000"> </SPAN>$padding<SPAN style="COLOR: #000000"></SPAN> <br/><SPAN style="COLOR: #800080">.=</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #000000">chr</SPAN><SPAN style="COLOR: #000000">(</SPAN><SPAN style="COLOR: #008080">$rnd</SPAN><SPAN style="COLOR: #000000">);</SPAN> }<SPAN style="COLOR: #800080"> }</SPAN><SPAN style="COLOR: #000000"> <br/>else<br/></SPAN><br/> {<SPAN style="COLOR: #0000ff"></SPAN> <SPAN style="COLOR: #000000">$ block_type<br/></SPAN> <br/><SPAN style="COLOR: #800080">=</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">x01</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">;</SPAN><SPAN style="COLOR: #000000"> </SPAN>$padding<SPAN style="COLOR: #000000"></SPAN> <br/><SPAN style="COLOR: #800080">=</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #000000">str_repeat</SPAN><SPAN style="COLOR: #000000">(</SPAN><SPAN style="COLOR: #008080">"</SPAN><SPAN style="COLOR: #000000">xFF</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">,</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #000000">$pad_length</SPAN><SPAN style="COLOR: #000000">);</SPAN> }<SPAN style="COLOR: #800080"></SPAN> <SPAN style="COLOR: #000000"> <br/>return</SPAN><br/> <br/><SPAN style="COLOR: #0000ff">"</SPAN><SPAN style="COLOR: #000000">x00</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #000000">.</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #000000">$block_type</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #800080">.</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #000000">$padding</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #800080">.</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">x00</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #000000">.</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #000000">$data</SPAN><SPAN style="COLOR: #000000">;</SPAN>}<SPAN style="COLOR: #800080"></SPAN><SPAN style="COLOR: #000000"><br/>//</SPAN><br/>--<br/>// 復号化されたデータからパディングを削除しますstring<SPAN style="COLOR: #008000">// 詳細については、[4] を参照してください。</SPAN>//--<SPAN style="COLOR: #008000"><br/><br/><br/></SPAN>function<SPAN style="COLOR: #008000"></SPAN> Remove_PKCS1_padding(<br/><🎜) >$data<SPAN style="COLOR: #0000ff"></SPAN>,<SPAN style="COLOR: #000000"></SPAN> <SPAN style="COLOR: #800080"></SPAN>$blocksize<SPAN style="COLOR: #000000"></SPAN>)<SPAN style="COLOR: #000000">{</SPAN><SPAN style="COLOR: #800080"> </SPAN>assert<SPAN style="COLOR: #000000"><br/>(</SPAN><br/>strlen<SPAN style="COLOR: #008080"></SPAN>(<SPAN style="COLOR: #000000"></SPAN>$data<SPAN style="COLOR: #008080"></SPAN>) <SPAN style="COLOR: #000000"></SPAN>==<SPAN style="COLOR: #800080"></SPAN> <SPAN style="COLOR: #000000"></SPAN>$blocksize<SPAN style="COLOR: #000000"></SPAN>);<SPAN style="COLOR: #000000"></SPAN> <SPAN style="COLOR: #800080">$data</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #008080">substr</SPAN><SPAN style="COLOR: #000000">(</SPAN><SPAN style="COLOR: #800080">$data</SPAN><SPAN style="COLOR: #000000">,</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #000000">1</SPAN><SPAN style="COLOR: #000000">);</SPAN><br/><br/> <SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000"> ブロックタイプには対応できません0</SPAN><SPAN style="COLOR: #008000"></SPAN><br/><SPAN style="COLOR: #000000"></SPAN><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000">(</SPAN><SPAN style="COLOR: #800080">$data</SPAN><SPAN style="COLOR: #000000">{</SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #000000">} </SPAN><SPAN style="COLOR: #000000">==</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #000000">'</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #000000">'</SPAN><SPAN style="COLOR: #000000">) </SPAN><br/> <SPAN style="COLOR: #0000ff">die</SPAN><SPAN style="COLOR: #000000">(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">ブロック タイプ 0 は実装されていません。</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">) ;</SPAN><br/><br/> <SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000"> この場合、ブロック タイプは 1 または 2 でなければなりません </SPAN><SPAN style="COLOR: #008000"></SPAN><br/><SPAN style="COLOR: #000000"></SPAN><SPAN style="COLOR: #008080">assert</SPAN><SPAN style="COLOR: #000000">((</SPAN><SPAN style="COLOR: #800080">$data</SPAN><SPAN style="COLOR: #000000">{</SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #000000">} </SPAN><SPAN style="COLOR: #000000">==</SPAN> <SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">x01</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">) </SPAN><SPAN style="COLOR: #000000">||</SPAN><SPAN style="COLOR: #000000"> (</SPAN><SPAN style="COLOR: #800080">$data</SPAN><SPAN style="COLOR: #000000">{</SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #000000">} </SPAN><SPAN style="COLOR: #000000">==</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">x02</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">));</SPAN><br/><br/> <SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000"> パディングを削除します</SPAN><SPAN style="COLOR: #008000"></SPAN><br/><SPAN style="COLOR: #000000"></SPAN><SPAN style="COLOR: #800080">$offset</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #008080">strpos</SPAN><SPAN style="COLOR: #000000">(</SPAN><SPAN style="COLOR: #800080">$data</SPAN><SPAN style="COLOR: #000000">,</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">,</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #000000">1</SPAN><SPAN style="COLOR: #000000">);</SPAN><br/> <SPAN style="COLOR: #0000ff">return</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #008080">substr</SPAN><SPAN style="COLOR: #000000">(</SPAN> <SPAN style="COLOR: #800080">$data</SPAN><SPAN style="COLOR: #000000">、</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #800080">$offset</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #000000">+</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #000000">1</SPAN><SPAN style="COLOR: #000000">);<br/>}</SPAN><br/><br/><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">--<br/>// バイナリ データを 10 進数に変換します<br/>//--</SPAN><SPAN style="COLOR: #008000"></SPAN><br/><SPAN style="COLOR: #0000ff">関数</SPAN><SPAN style="COLOR: #000000"> binary_to_number(</SPAN><SPAN style="COLOR: #800080">$data</SPAN><SPAN style="COLOR: #000000">)<br/>{</SPAN><br/> <SPAN style="COLOR: #800080">$base</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">256</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">;</SPAN><br/> <SPAN style="COLOR: #800080">$radix</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">1 </SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">;</SPAN><br/> <SPAN style="COLOR: #800080">$result</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">;</SPAN><br/><br/> <SPAN style="COLOR: #0000ff">for</SPAN><SPAN style="COLOR: #000000">(</SPAN><SPAN style="COLOR: #800080">$i</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #008080">strlen</SPAN><SPAN style="COLOR: #000000">(</SPAN><SPAN style="COLOR: #800080">$data</SPAN><SPAN style="COLOR: #000000">) </SPAN><SPAN style="COLOR: #000000">-</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #000000">1</SPAN><SPAN style="COLOR: #000000"></SPAN>$i<SPAN style="COLOR: #800080"></SPAN> <SPAN style="COLOR: #000000"></SPAN>><SPAN style="COLOR: #000000"></SPAN>0<SPAN style="COLOR: #000000"></SPAN>; ><SPAN style="COLOR: #000000">$i</SPAN><SPAN style="COLOR: #000000">--</SPAN><SPAN style="COLOR: #800080">)</SPAN> {<SPAN style="COLOR: #000000"></SPAN> <SPAN style="COLOR: #000000">$digit<br/></SPAN> <br/><SPAN style="COLOR: #800080">=</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #000000">ord</SPAN><SPAN style="COLOR: #000000">(</SPAN><SPAN style="COLOR: #008080">$data</SPAN><SPAN style="COLOR: #000000">{</SPAN><SPAN style="COLOR: #800080">$i</SPAN><SPAN style="COLOR: #000000">}) ;</SPAN><SPAN style="COLOR: #800080"> </SPAN>$part_res<SPAN style="COLOR: #000000"></SPAN> <br/><SPAN style="COLOR: #800080">=</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #000000">bcmul</SPAN><SPAN style="COLOR: #000000">(</SPAN><SPAN style="COLOR: #008080">$digit</SPAN><SPAN style="COLOR: #000000">,</SPAN><SPAN style="COLOR: #800080"> </SPAN><SPAN style="COLOR: #000000">$radix</SPAN><SPAN style="COLOR: #000000">);</SPAN><SPAN style="COLOR: #800080"> </SPAN>$result<SPAN style="COLOR: #000000"></SPAN> <br/><SPAN style="COLOR: #800080">=</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #000000">bcadd</SPAN><SPAN style="COLOR: #000000">(</SPAN><SPAN style="COLOR: #008080">$result</SPAN><SPAN style="COLOR: #000000">,</SPAN><SPAN style="COLOR: #800080"> </SPAN> <SPAN style="COLOR: #000000">$part_res</SPAN><SPAN style="COLOR: #000000">);</SPAN><SPAN style="COLOR: #800080"> </SPAN>$radix<SPAN style="COLOR: #000000"></SPAN> <br/><SPAN style="COLOR: #800080">=</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #000000">bcmul </SPAN><SPAN style="COLOR: #000000">(</SPAN><SPAN style="COLOR: #008080">$radix</SPAN><SPAN style="COLOR: #000000">,</SPAN><SPAN style="COLOR: #800080"> </SPAN><SPAN style="COLOR: #000000">$base</SPAN><SPAN style="COLOR: #000000">);</SPAN> }<SPAN style="COLOR: #800080"></SPAN><SPAN style="COLOR: #000000"> <br/>return</SPAN><br/> <br/><SPAN style="COLOR: #0000ff">$result</SPAN><SPAN style="COLOR: #000000">;</SPAN>}<SPAN style="COLOR: #800080"></SPAN><SPAN style="COLOR: #000000"><br/>// </SPAN><br/>--<br/>// 数値をバイナリ形式に変換します<SPAN style="COLOR: #008000">//--</SPAN><SPAN style="COLOR: #008000"><br/><br/></SPAN>function<SPAN style="COLOR: #008000"></SPAN>number_to_binary (<br/><SPAN style="COLOR: #0000ff">$number</SPAN><SPAN style="COLOR: #000000">,</SPAN><SPAN style="COLOR: #800080"> </SPAN><SPAN style="COLOR: #000000">$blocksize</SPAN><SPAN style="COLOR: #000000">)</SPAN>{<SPAN style="COLOR: #800080"></SPAN> <SPAN style="COLOR: #000000"> $base<br/></SPAN> <br/><SPAN style="COLOR: #800080">=</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">256</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">;</SPAN><SPAN style="COLOR: #000000"> </SPAN>$result<SPAN style="COLOR: #000000"></SPAN> <br/><SPAN style="COLOR: #800080">=</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #000000">""</SPAN><SPAN style="COLOR: #000000">;</SPAN><SPAN style="COLOR: #000000"> </SPAN> <SPAN style="COLOR: #000000">$div</SPAN><br/> <br/><SPAN style="COLOR: #800080">=</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #000000">$number</SPAN><SPAN style="COLOR: #000000">;</SPAN><SPAN style="COLOR: #800080"> <SPAN style="COLOR: #0000ff">その間</SPAN><SPAN style="COLOR: #000000">(</SPAN><SPAN style="COLOR: #800080">$div</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #000000">></span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">)<br> {</span><br> <span style="COLOR: #800080">$mod</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #008080">bcmod</span><span style="COLOR: #000000"> (</span><span style="COLOR: #800080">$div</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000"> </span><span style="COLOR: #800080">$base</span><span style="COLOR: #000000">);</span><br> <span style="COLOR: #800080">$div</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #008080">bcdiv</span><span style="COLOR: #000000">(</span><span style="COLOR: #800080">$div</span><span style="COLOR: #000000">,</span> <span style="COLOR: #000000"> </span><span style="COLOR: #800080">$base</span><span style="COLOR: #000000">);</span><br> <br> <span style="COLOR: #800080">$result</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #008080">chr</span><span style="COLOR: #000000">(</span><span style="COLOR: #800080">$mod</span><span style="COLOR: #000000">) </span><span style="COLOR: #000000">.</span><span style="COLOR: #000000"> </span><span style="COLOR: #800080"> $result</span><span style="COLOR: #000000">;<br> }</span><br><br> <span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> </span><span style="COLOR: #008080">str_pad</span><span style="COLOR: #000000">(</span><span style="COLOR: #800080">$result</span><span style="COLOR: #000000">、</span><span style="COLOR: #000000"> </span><span style="COLOR: #800080">$blocksize</span><span style="COLOR: #000000">、</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">x00</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000"> STR_PAD_LEFT);<br>}</span><br><span style="COLOR: #000000">?></span> <p style="width:100%;text-align:center;margin:10px 0"> <br> <br> </p> <p style="width:100%;text-align:center;margin:10px 0"> </p> <p class="clear"></p>