程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> Base64 算法原理,以及編碼、解碼【加密、解密】 介紹

Base64 算法原理,以及編碼、解碼【加密、解密】 介紹

編輯:關於PHP編程

    Base64編碼,是我們程序開發中經常使用到的編碼方法。它是一種基於用64個可打印字符來表示二進制數據的表示方法。它通常用作存儲、傳輸一些二進制數據編碼方法!也是MIME(多用途互聯網郵件擴展,主要用作電子郵件標准)中一種可打印字符表示二進制數據的常見編碼方法!它其實只是定義用可打印字符傳輸內容一種方法,並不會產生新的字符集!有時候,我們學習轉換的思路後,我們其實也可以結合自己的實際需要,構造一些自己接口定義編碼方式。好了,我們一起看看,它的轉換思路吧!

Base64實現轉換原理

    它是用64個可打印字符表示二進制所有數據方法。由於2的6次方等於64,所以可以用每6個位元為一個單元,對應某個可打印字符。我們知道三個字節有24個位元,就可以剛好對應於4個Base64單元,即3個字節需要用4個Base64的可打印字符來表示。在Base64中的可打印字符包括字母A-Z、a-z、數字0-9 ,這樣共有62個字符,此外兩個可打印符號在不同的系統中一般有所不同。但是,我們經常所說的Base64另外2個字符是:“+/”。這64個字符,所對應表如下。

編號字符 編號字符 編號字符 編號字符 0 A 16 Q 32 g 48 w 1 B 17 R 33 h 49 x 2 C 18 S 34 i 50 y 3 D 19 T 35 j 51 z 4 E 20 U 36 k 52 0 5 F 21 V 37 l 53 1 6 G 22 W 38 m 54 2 7 H 23 X 39 n 55 3 8 I 24 Y 40 o 56 4 9 J 25 Z 41 p 57 5 10 K 26 a 42 q 58 6 11 L 27 b 43 r 59 7 12 M 28 c 44 s 60 8 13 N 29 d 45 t 61 9 14 O 30 e 46 u 62 + 15 P 31 f 47 v 63 /

    轉換的時候,將三個byte的數據,先後放入一個24bit的緩沖區中,先來的byte占高位。數據不足3byte的話,於緩沖區中剩下的bit用0補足。然後,每次取出6個bit,按照其值選擇
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/
中的字符作為編碼後的輸出。不斷進行,直到全部輸入數據轉換完成。

    如果最後剩下兩個輸入數據,在編碼結果後加1個“=”;如果最後剩下一個輸入數據,編碼結果後加2個“=”;如果沒有剩下任何數據,就什麼都不要加,這樣才可以保證資料還原的正確性。

    編碼後的數據比原始數據略長,為原來的4/3。無論什麼樣的字符都會全部被編碼,因此不像Quoted-printable 編碼,還保留部分可打印字符。所以,它的可讀性不如Quoted-printable編碼!

文本 M a n ASCII編碼 77 97 110 二進制位 0 1 0 0 1 1 0 1 0 1 1 0 0 0 0 1 0 1 1 0 1 1 1 0 索引 19 22 5 46 Base64編碼 T W F u

     M的Ascii碼是77,前六位對應值為19,對應base64字符是T,如此類推。其它字符編碼就可以自動轉換得到!我們看看另外不是剛好是3個字節的情況!

文本(1 Byte) A     二進制位 0 1 0 0 0 0 0 1                                 二進制位(補0) 0 1 0 0 0 0 0 1 0 0 0 0                         Base64編碼 Q Q = = 文本(2 Byte) B C   二進制位 0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 1     x x x x x x 二進制位(補0) 0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 1 0 0 x x x x x x Base64編碼 Q k M  =

Base64轉換代碼實現

     既然知道了方法,那麼我們如果要自己寫個簡單轉換,好像也是很容易的!下面,我寫下我做轉換php代碼!

<?php

/**

*base64編碼方法、本方法只是做base64轉換過程代碼舉例說明,通過該例子可以任意改造不同語言版

*@author 程默

*@copyright http://blog.chacuo.net

*@param $src 原字符串

*@return string base64字符串*

*/

function c_base64_encode($src)

{

static $base="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

////將原始的3個字節轉換為4個字節

$slen=strlen($src);

$smod = ($slen%3);

$snum = floor($slen/3);

$desc = array();

for($i=0;$i<$snum;$i++)

{

////讀取3個字節

$_arr = array_map('ord',str_split(substr($src,$i*3,3)));

///計算每一個base64值

$_dec0= $_arr[0]>>2;

$_dec1= (($_arr[0]&3)<<4)|($_arr[1]>>4);

$_dec2= (($_arr[1]&0xF)<<2)|($_arr[2]>>6); 

$_dec3= $_arr[2]&63;

$desc = array_merge($desc,array($base[$_dec0],$base[$_dec1],$base[$_dec2],$base[$_dec3]));

}

if($smod==0) return implode('',$desc);

///計算非3倍數字節

$_arr = array_map('ord',str_split(substr($src,$snum*3,3)));

$_dec0= $_arr[0]>>2;

///只有一個字節

if(!isset($_arr[1]))

{

$_dec1= (($_arr[0]&3)<<4);

$_dec2=$_dec3="=";

}

else

{

///2個字節

$_dec1= (($_arr[0]&3)<<4)|($_arr[1]>>4);

$_dec2= $base[($_arr[1]&7)<<2];

$_dec3="=";

}

$desc = array_merge($desc,array($base[$_dec0],$base[$_dec1],$_dec2,$_dec3));

return implode('',$desc);

}

base64編碼轉換原理 

    好了,通過這個例子,我想base64編碼轉換原理、算法有些了解了吧!它轉換過程很簡單,只需要做個映射表,然後將原先做一些移位運算就可以完成!我們通過該例子,是不是可以做個自己的base32這類的編碼呢!歡迎朋友們交流!

 

作者:程默的博客  QQ:8292669
原文網址:http://blog.chacuo.net/719.html
訂閱保持關注:http://blog.chacuo.net/feed
本文版權歸作者所有,歡迎轉載,請務必添加原文鏈接。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved