1. 程式人生 > 程式設計 >Base64的編碼實現原理攻略

Base64的編碼實現原理攻略

Base64的編碼原理

更多可檢視 點選這裡了

本文將實現:

  • 簡述 ASCII碼字元編碼的Base64 編碼實現原理
  • 簡述 非ASCII碼字元編碼的Base64 編碼實現原理

加密分析系列文章:

  • Base64 編碼實現原理(就是本文了)
  • Url Base64 編碼演演算法實現原理(正在發文中)
  • MD5 算法系列實現原理 (正在發文中)
  • SHA 算法系列實現原理(正在發文中)
  • MAC 算法系列實現原理(正在發文中)
  • 對稱加密 DES (正在發文中)
  • 對稱加密 AES(正在發文中)
  • 基於口令加密 PBE(正在發文中)
  • 非對稱加密 DH(正在發文中)
  • 非對稱加密 RSA(正在發文中)

1 簡述

  • Base64演演算法有編碼和解碼操作,可充當加密和解密的操作,還有一張字元對映表充當了金鑰。
  • Base64演演算法公開,這與 柯克霍夫原則並無違背,但充當金鑰的字元對映表公開,直接違反了 柯克霍夫原則
密碼學上的柯克霍夫原則(Kerckhoffs's principle,也稱為柯克霍夫假說、公理、或定律)系由奧古斯特·柯克霍夫在19世紀提出:即使密碼系統的任何細節已為人悉知,只要密匙(key,又稱金鑰或祕鑰)未洩漏,它也應是安全的。
複製程式碼
  • Base64演演算法不能稱為加密演演算法,但其變換法則遵從了單表置換演演算法。

2 Base64的索引表

Base64的索引表,我們可以理解為加密密文的構成,密文中的字元選用了"A-Z、a-z、0-9、+、/" 64個可列印字元,這是標準的Base64協議規定。在日常使用中我們還會看到“=”或“==”號出現在Base64的編碼結果中,“=”在此是作為填充字元出現

['A','B','C',... 'a','b','c',... '0','1',... '+','/']
複製程式碼

3 編碼表

簡單點來說,一串明文經過一系列轉換後,生成對應十進位制數值,然後參照編碼表,通過單表置換來通過編碼字元來表示密文。

在這裡插入圖片描述

4 Base64 編碼實現過程

通常以字串使用 Base64 編碼(加密),字串是以字元構成,在編碼過程中,以字元為基本單元,如下圖中所示:

在這裡插入圖片描述

編碼過程實現
  • 第一步: “M”、“a”、"n" 對應的ASCII碼值分別為77,97,110,獲取對應的二進位制值 01001101、01100001、01101110。如圖第二三行所示,由此組成一個24位的二進位制字串。
  • 第二步:對獲得的二進位制碼做分組轉換操作,每3個8位二進位制碼為一組,轉換為每4個6位二進位制碼為一組(不足6位時低位補0)如圖紅色框,將24位每6位二進位制位一組分成四組,這是一個分組變化的過程,3個8位二進位制碼和4個6位二進位制碼的長度都是24位,
  • 第三步: 對獲得的4個6位的二進位制碼補位,向6位二進位制碼新增2位高位0,組成4個8位二進位制碼 ,新增2位高位0,組成4個8位二進位制碼,擴充套件成32個二進位制位,此時變為四個位元組:00010011、00010110、00000101、00101110。
  • 第四步 將獲得的4個8位二進位制碼轉換為十進位制碼,在上面的資料中,00010011、00010110、00000101、00101110 分別對應的十進位制的值為:19、22、5、46。 第五步:用上面獲得到的十進位制的值(Base64編碼索引)在Base64編碼表中進行查詢,分別對應:T、W、F、u。因此“Man”Base64編碼之後就變為:TWFu。
位數不足情況

在這裡插入圖片描述

5 非 ASCII碼字元編碼

ASCII 碼可以表示十進位制範圍為 0-127的字元,對應二進位制範圍是 0000 0000 -0111 1111

ASCII 碼包括阿拉伯數字、大小寫英文字母和一些控制符,但卻沒有包含雙位元組編碼的字元,如中文字元,因此有了 GB2312 、GBK、 UTF-8 等編碼,GB2312 、GBK用2個位元組表示一個漢字,UTF-8用三個位元組表示一個漢字。

非 ASCII碼字元編碼 加密實現過程

我們以字串 “密” 為例

  • 第一步 獲取 字串 “密” 對應的 utf-8 的編碼為 -27,-81,-122
  • 第二步 分別獲取上述 utf-8 編碼(-27,-81,-122)對應的二進位制碼:11100101 10101111 10000110
  • 第三步 將上述二進位制碼分成4組6位 111001 011010 111110 000110
  • 第四步 向6位二進位制碼新增2位高位0,組成4個8位二進位制碼,新增2位高位0,00111001 00011010 00111110 00000110
  • 第五步 獲取上述二進位制碼對應的十進位制碼 57 26 62 6
  • 第六步 在Base64編碼表中進行查詢,分別對應 5 a + G

字串 “密” 經過 Base64 編碼後得到字串 "5a+G"

6 分析

在這裡 Base64(2的6次冪就是64)將字元轉成的8位二進位制碼以6位為單位進行分組轉換 表示字元,因此成為Base64。同理,Base32就是用5位分組,Base16就是用4位分組。

所以 Base32 、Base16編碼過程也就一目瞭然了。