ホームページ  >  記事  >  バックエンド開発  >  Base64アルゴリズムの原理とエンコード・デコード[暗号化・復号化]入門_PHPチュートリアル

Base64アルゴリズムの原理とエンコード・デコード[暗号化・復号化]入門_PHPチュートリアル

WBOY
WBOYオリジナル
2016-07-13 10:29:36948ブラウズ
<p></p> <p> Base64エンコーディングは、プログラム開発でよく使用されるエンコーディング方法です。これは、64 個の印刷可能な文字を使用してバイナリ データを表現することに基づいた表現方法です。通常、バイナリ データを保存および送信するためのエンコード方法として使用されます。これは、MIME (MultiPurpose Internet Mail Extensions、主に電子メール標準として使用される) の印刷可能文字で表されるバイナリ データの一般的なエンコード方法でもあります。実際には、印刷可能な文字を使用してコンテンツを送信する方法を定義しているだけであり、新しい文字セットを作成するわけではありません。場合によっては、変換の概念を学んだ後、実際のニーズに基づいて独自のインターフェイス定義コーディング方法を実際に構築できることがあります。さて、変換のアイデアを見てみましょう! </p> <p><strong>Base64実装の変換原理</strong></p> <p> 64 個の印刷可能な文字を使用してすべてのバイナリ データを表す方法です。 2 の 6 乗は 64 に等しいため、6 ビットごとを、特定の印刷可能文字に対応する単位として使用できます。 3 バイトは 24 ビットであり、4 つの Base64 ユニットに対応できることがわかっています。つまり、3 バイトは 4 つの Base64 印刷可能文字で表す必要があります。 Base64 で印刷可能な文字には、文字 A ~ Z、a ~ z、数字 0 ~ 9 が含まれるため、合計 62 文字になります。また、通常、2 つの印刷可能な記号はシステムによって異なります。ただし、よく参照される Base64 の他の 2 文字は「+/」です。この 64 文字の対応表は次のとおりです。 </p> <blockquote> <table class="table"> <tbody> <tr> <th scope="col">数字</th> <th scope="col">文字</th> <th rowspan="18"> </th> <th scope="col">数字</th> <th scope="col">文字</th> <th rowspan="18"> </th> <th scope="col">数字</th> <th scope="col">文字</th> <th rowspan="18"> </th> <th scope="col">数字</th> <th scope="col">文字</th> </tr> <tr> <td>0</td> <td>あ</td> <td>16</td> <td>Q</td> <td>32</td> <td>g</td> <td>48</td> <td>w</td> </tr> <tr> <td>1</td> <td>B</td> <td>17</td> <td>R</td> <td>33</td> <td>え</td> <td>49</td> <td>×</td> </tr> <tr> <td>2</td> <td>C</td> <td>18</td> <td>S</td> <td>34</td> <td>私</td> <td>50</td> <td>よ</td> </tr> <tr> <td>3</td> <td>D</td> <td>19</td> <td>た</td> <td>35</td> <td>j</td> <td>51</td> <td>z</td> </tr> <tr> <td>4</td> <td>え</td> <td>20</td> <td>う</td> <td>36</td> <td>k</td> <td>52</td> <td>0</td> </tr> <tr> <td>5</td> <td>F</td> <td>21</td> <td>V</td> <td>37</td> <td>l</td> <td>53</td> <td>1</td> </tr> <tr> <td>6</td> <td>G</td> <td>22</td> <td>わ</td> <td>38</td> <td>ん</td> <td>54</td> <td>2</td> </tr> <tr> <td>7</td> <td>ひ</td> <td>23</td> <td>X</td> <td>39</td> <td>ん</td> <td>55</td> <td>3</td> </tr> <tr> <td>8</td> <td>私</td> <td>24</td> <td>よ</td> <td>40</td> <td>お</td> <td>56</td> <td>4</td> </tr> <tr> <td>9</td> <td>J</td> <td>25</td> <td>Z</td> <td>41</td> <td>p</td> <td>57</td> <td>5</td> </tr> <tr> <td>10</td> <td>K</td> <td>26</td> <td>あ</td> <td>42</td> <td>q</td> <td>58</td> <td>6</td> </tr> <tr> <td>11</td> <td>L</td> <td>27</td> <td>b</td> <td>43</td> <td>r</td> <td>59</td> <td>7</td> </tr> <tr> <td>12</td> <td>ま</td> <td>28</td> <td>c</td> <td>44</td> <td>す</td> <td>60</td> <td>8</td> </tr> <tr> <td>13</td> <td>ん</td> <td>29</td> <td>d</td> <td>45</td> <td>ち</td> <td>61</td> <td>9</td> </tr> <tr> <td>14</td> <td>お</td> <td>30</td> <td>え</td> <td>46</td> <td>う</td> <td>62</td> <td>+</td> </tr> <tr> <td>15</td> <td>P</td> <td>31</td> <td>f</td> <td>47</td> <td>v</td> <td>63</td> <td>/</td> </tr> </tbody> </table> </blockquote> <p> 変換中、3 バイトのデータが 24 ビット バッファに次々と入れられ、最初に来たバイトが上位ビットを占めます。データが 3 バイト未満の場合、バッファ内の残りのビットは 0 で埋められます。その後、毎回 6 ビットが取り出され、その値に応じて <code><br>ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/</code> 内の文字がエンコードされた出力として選択されます。すべての入力データが変換されるまで続行します。 </p> <p> 最後に入力データが 2 つ残っている場合は、エンコード結果の後に 1 つ「=」を追加します。最後に入力データが 1 つ残っている場合は、エンコード結果の後に 2 つ「=」を追加します。データ復元の正確性を確保するため、何も使用しないでください。 </p> <p> エンコードされたデータは元のデータよりわずかに長く、元のデータの 4/3 です。文字の種類に関係なく、すべての文字がエンコードされるため、Quoted-printable エンコードとは異なり、一部の印刷可能文字は保持されます。したがって、Quoted-printable エンコーディングほど読みやすくはありません。 </p> <table class="table"> <tbody> <tr> <th scope="row">テキスト</th> <td colspan="8" align="center"><strong>M</strong></td> <td colspan="8" align="center"><strong>あ</strong></td> <td colspan="8" align="center"><strong>ん</strong></td> </tr> <tr> <th scope="row">ASCII エンコード</th> <td colspan="8" align="center">77</td> <td colspan="8" align="center">97</td> <td colspan="8" align="center">110</td> </tr> <tr> <th scope="row">バイナリビット</th> <td>0</td> <td>1</td> <td>0</td> <td>0</td> <td>1</td> <td>1</td> <td>0</td> <td>1</td> <td>0</td> <td>1</td> <td>1</td> <td>0</td> <td>0</td> <td>0</td> <td>0</td> <td>1</td> <td>0</td> <td>1</td> <td>1</td> <td>0</td> <td>1</td> <td>1</td> <td>1</td> <td>0</td> </tr> <tr> <th scope="row">インデックス</th> <td colspan="6" align="center">19</td> <td colspan="6" align="center">22</td> <td colspan="6" align="center">5</td> <td colspan="6" align="center">46</td> </tr> <tr> <th scope="row">Base64エンコーディング</th> <td colspan="6" align="center"><strong>た</strong></td> <td colspan="6" align="center"><strong>W</strong></td> <td colspan="6" align="center"><strong>F</strong></td> <td colspan="6" align="center"><strong>う</strong></td> </tr> </tbody> </table> <p> M の ASCII コードは 77、最初の 6 桁は 19 に対応し、対応する Base64 文字は T などとなります。他の文字コードも自動変換可能!ちょうど 3 バイトではない別の状況を見てみましょう。 </p> <table class="table"> <tbody> <tr> <th scope="row">テキスト(1バイト)</th> <td colspan="8" align="center"><strong>A</strong></td> <td colspan="8" align="center"> </td> <td colspan="8" align="center"> </td> </tr> <tr> <th scope="row">バイナリビット</th> <td>0</td> <td>1</td> <td>0</td> <td>0</td> <td>0</td> <td>0</td> <td>0</td> <td>1</td> <td> </td> <td> </td> <td> </td> <td> </td> <td> </td> <td> </td> <td> </td> <td> </td> <td> </td> <td> </td> <td> </td> <td> </td> <td> </td> <td> </td> <td> </td> <td> </td> </tr> <tr> <th scope="row">2進数(0の補数)</th> <td>0</td> <td>1</td> <td>0</td> <td>0</td> <td>0</td> <td>0</td> <td>0</td> <td>1</td> <td><strong>0</strong></td> <td><strong>0</strong></td> <td><strong>0</strong></td> <td><strong>0</strong></td> <td> </td> <td> </td> <td> </td> <td> </td> <td> </td> <td> </td> <td> </td> <td> </td> <td> </td> <td> </td> <td> </td> <td> </td> </tr> <tr> <th scope="row">Base64エンコーディング</th> <td colspan="6" align="center"><strong>Q</strong></td> <td colspan="6" align="center"><strong>Q</strong></td> <td colspan="6" align="center"><strong>=</strong></td> <td colspan="6" align="center"><strong>=</strong></td> </tr> <tr> <th scope="row">テキスト(2バイト)</th> <td colspan="8" align="center"><strong>B</strong></td> <td colspan="8" align="center"><strong>C</strong></td> <td colspan="8" align="center"> </td> </tr> <tr> <th scope="row">バイナリビット</th> <td>0</td> <td>1</td> <td>0</td> <td>0</td> <td>0</td> <td>0</td> <td>1</td> <td>0</td> <td>0</td> <td>1</td> <td>0</td> <td>0</td> <td>0</td> <td>0</td> <td>1</td> <td>1</td> <td> </td> <td> </td> <td>×</td> <td>×</td> <td>×</td> <td>×</td> <td>×</td> <td>×</td> </tr> <tr> <th scope="row">2進数(0の補数)</th> <td>0</td> <td>1</td> <td>0</td> <td>0</td> <td>0</td> <td>0</td> <td>1</td> <td>0</td> <td>0</td> <td>1</td> <td>0</td> <td>0</td> <td>0</td> <td>0</td> <td>1</td> <td>1</td> <td><strong>0</strong></td> <td><strong>0</strong></td> <td>×</td> <td>×</td> <td>×</td> <td>×</td> <td>×</td> <td>×</td> </tr> <tr> <th scope="row">Base64エンコーディング</th> <td colspan="6" align="center"><strong>Q</strong></td> <td colspan="6" align="center"><strong>k</strong></td> <td colspan="6" align="center"><strong>M</strong></td> <td colspan="6" align="center"><strong>=</strong></td> </tr> </tbody> </table> <p><strong>Base64変換コードの実装</strong></p> <p> 方法がわかったので、簡単な変換を自分で書きたい場合、それは非常に簡単だと思われます。以下に、変換を行う php コードを書き留めます。 </p> <blockquote> <p><code><span><?php</span></code></p> <p><code>/**</code></p> <p><code></code><code>*base64编码方法、本方法只是做base64转换过程代码举例说明,通过该例子可以任意改造不同语言版</code></p> <p><code></code><code>*@author 程默</code></p> <p><code></code><code>*@copyright http://blog.chacuo.net</code></p> <p><code></code><code>*@param $src 原字符串</code></p> <p><code></code><code>*@return string base64字符串*</code></p> <p><code></code><code>*/</code></p> <p><code>function</code> <code>c_base64_encode(</code><code>$src</code><code>)</code></p> <p><code>{</code></p> <p><code></code><code>static</code> <code>$base</code><code>=</code><code>"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"</code><code>;</code></p> <p><code></code><code>////将原始的3个字节转换为4个字节</code></p> <p><code></code><code>$slen</code><code>=</code><code>strlen</code><code>(</code><code>$src</code><code>);</code></p> <p><code></code><code>$smod</code> <code>= (</code><code>$slen</code><code>%3);</code></p> <p><code></code><code>$snum</code> <code>= </code><code>floor</code><code>(</code><code>$slen</code><code>/3);</code></p> <p><code></code><code>$desc</code> <code>= </code><code>array</code><code>();</code></p> <p><code></code><code>for</code><code>(</code><code>$i</code><code>=0;</code><code>$i</code><code><</code><code>$snum</code><code>;</code><code>$i</code><code>++)</code></p> <p><コード></コード><code></code><code>{</code></p> <p><code></code><code>////读取3个字节</code></p> <p><code></code><code>$_arr</code> <code>= </code><code>array_map</code><code>(</code><code>'ord'</code><code>,</code><code>str_split</code><code>(</code><code>substr</code><code>(</code><code>$src</code><code>,</code><code>$i</code><code>*3,3)));</code></p> <p><code></code><code>///计算每一个base64值</code></p> <p><code></code><code>$_dec0</code><code>= </code><code>$_arr</code><code>[0]>>2;</span></code></p> <p><code></code><code>$_dec1</code><code>= ((</code><code>$_arr</code><code>[0]&3)<<4)|(</code><code>$_arr</code><code>[1]>>4);</code></p> <p><code></code><code>$_dec2</code><code>= ((</code><code>$_arr</code><code>[1]&0xF)<<2)|(</code><code>$_arr</code><code>[2]>>6);  </code></p> <p><code></code><code>$_dec3</code><code>= </code><code>$_arr</code><code>[2]&63;</code></p> <p><code></code><code>$desc</code> <code>= </code><code>array_merge</code><code>(</code><code>$desc</code><code>,</code><code>array</code><code>(</code><code>$base</code><code>[</code><code>$_dec0</code><code>],</code><code>$base</code><code>[</code><code>$_dec1</code><code>],</code><code>$base</code><code>[</code><code>$_dec2</code><code>],</code><code>$base</code><code>[</code><code>$_dec3</code><code>]));</code></p> <p><code></code><code>}</code></p> <p><code></code><code>if</code><code>(</code><code>$smod</code><code>==0) </code><code>return</code> <code>implode(</code><code>''</code><code>,</code><code>$desc</code><code>);</code></p> <p><code></code><code>///计算非3倍数字节</code></p> <p><code></code><code>$_arr</code> <code>= </code><code>array_map</code><code>(</code><code>'ord'</code><code>,</code><code>str_split</code><code>(</code><code>substr</code><code>(</code><code>$src</code><code>,</code><code>$snum</code><code>*3,3)));</code></p> <p><code></code><code>$_dec0</code><code>= </code><code>$_arr</code><code>[0]>>2;</code></p> <p><code></code><code>///只有一个字节</code></p> <p><code></code><code>if</code><code>(!isset(</code><code>$_arr</code><code>[1]))</code></p> <p>コード><code></code><code>{</code></p> <p><code></code><code>$_dec1</code><code>= ((</code><code>$_arr</code><code>[0]&3)<<4);</code></p> <p><code></code><code>$_dec2</code><code>=</code><code>$_dec3</code><code>=</code><code>"="</code><code>;</code></p> <p><code></code><code>}</code></p> <p><code></code><code>else</code></p> <p>コード><code></code><code>{</code></p> <p><code></code><code>///2个字节</code></p> <p><code></code><code>$_dec1</code><code>= ((</code><code>$_arr</code><code>[0]&3)<<4)|(</code><code>$_arr</code><code>[1]>>4);</code></p> <p><code></code><code>$_dec2</code><code>= </code><code>$base</code><code>[(</code><code>$_arr</code><code>[1]&7)<<2];</code></p> <p><code></code><code>$_dec3</code><code>=</code><code>"="</code><code>;</code></p> <p><code></code><code>}</code></p> <p><code></code><code>$desc</code> <code>= </code><code>array_merge</code><code>(</code><code>$desc</code><code>,</code><code>array</code><code>(</code><code>$base</code><code>[</code><code>$_dec0</code><code>],</code><code>$base</code><code>[</code><code>$_dec1</code><code>],</code><code>$_dec2</code><code>,</code><code>$_dec3</code><code>));</code></p> <p><code></code><code>return</code> <code>implode(</code><code>''</code><code>,</code><code>$desc</code><code>);</code></p> <p><code>}</code></p> </blockquote> <blockquote> リーリー </blockquote> <p> さて、この例を通じて、base64 エンコーディングの変換原理とアルゴリズムについてある程度理解できたと思います。変換プロセスは非常に簡単で、マッピング テーブルを作成し、元のテーブルに対してシフト操作を行うだけです。この例を通じて、独自の Base32 エンコーディングを作成できますか?友達とコミュニケーションを取ることを歓迎します! </p> <p> </p> <blockquote> <p>著者: Cheng Mo のブログ QQ: 8292669 <br>元の URL: http://blog.chacuo.net/719.html <br>購読してお待ちください: http://blog.chacuo.net/feed <br>この記事の著作権は以下に属します著者への転載は歓迎しますが、必ず原文へのリンクを追加してください。 </p> </blockquote> <p align="left"></p> <div style="display:none;"> <span id="url" itemprop="url">http://www.bkjia.com/PHPjc/771651.html</span><span id="indexUrl" itemprop="indexUrl">www.bkjia.com</span><span id="isOriginal" itemprop="isOriginal">tru​​e</span><span id="isBasedOnUrl" itemprop="isBasedOnUrl">http://www.bkjia.com/PHPjc/771651.html</span><span id="genre" itemprop="genre">技術記事</span><span id="description" itemprop="description"> Base64エンコードはプログラム開発でよく使われるエンコード方式です。これは、64 個の印刷可能な文字を使用してバイナリ データを表現することに基づいた表現方法です。通常、保存、送信に使用されます...</span> </div> <div class="art_confoot"></div>
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。