Base16,Base32,Base64編碼詳細學習


新手一枚,如有錯誤(不足)請指正,謝謝!!
參考資料:
base16,base32,base64 編碼方式的通俗講解
Base16,Base32,Base64編碼的介紹
base58編碼原理和實現
python3.x中如何使用base64、base32、base16編碼解碼

Base編碼

Base16編碼

Base16編碼表格

Base16字符表:0123456789ABCDEF

下標 編碼值 下標 編碼值
0 0 8 8
1 1 9 9
2 2 10 A
3 3 11 B
4 4 12 C
5 5 13 D
6 6 14 E
7 7 15 F

Base16編碼方式

  1. 將數據(根據ASCII編碼,UTF-8編碼等)轉成對應的二進制數
  2. 然后將所有的二進制全部串起來,4個二進制位為一組,轉化成對應十進制數。
  3. 根據十進制數值找到Base16編碼表里面對應的字符

base16是4個比特位表示一個字符,原碼是1個字節(8個比特位)表示一個字符,也就是說原先如果使用ASCII編碼后的一個字符,現在轉化成兩個字符。數據量是原先的2倍。
在這里插入圖片描述
也就是LOVE加密后是4C4F5645

Base16偽代碼|實際環境

待補充

Base32編碼

Base32編碼表格

Base32字符表:ABCDEFGHIJKLMNOPQRSTUVWXYZ234567
在這里插入圖片描述

Base32編碼方式

  1. 將數據(根據ASCII編碼,UTF-8編碼等)轉成對應的二進制數
  2. 然后將所有的二進制全部串起來,5個二進制位為一組,若不足5位則低位補0,轉化成對應十進制數。
  3. 若不足40位,則補"="
    一個"="相當於5位,補滿40位為止。

例:
在這里插入圖片描述
最后01不足5位,低位補全0。補為01000,也就是8
然后這才35位,需要末尾補一個"="
所以LOVE用Base32編碼后得到JRHVMRI=

Base32偽代碼|實際環境

v3 = 0;
  v4 = 0;
  v28 = 0;
  v5 = 0;
  v25 = 0;
  v6 = 0;
  if ( v30 )
  {
    do
    {
      if ( !*(_BYTE *)(v6 + v2) )               // v2為字符串首地址,v6為0開始遍歷
        break;
      ++v6;
      v5 += 8;
      ++v3;
    }
    while ( v6 < v30 );                         // 循環完,v5為將所有字符轉換為二進制位、的位數
                                                // 
    v28 = v3;
  }
  switch ( v5 % 40 )                            // 這里對位數是否能整除40做判斷,來判斷是否添加'='
                                                // v4等於多少就添加幾個'='
  {
    case 8u:
      v4 = 6;
      goto LABEL_10;
    case 16u:
      v4 = 4;
      goto LABEL_10;
    case 24u:
      v4 = 3;
      goto LABEL_10;
    case 32u:
      v4 = 1;
LABEL_10:
      v25 = v4;
      break;
    default:
      break;
  }
  v29 = (8 * v3 + 4) / 5;                       // 除以5,算一下轉換后數據個數
                                                // +4的原因是,向上取整,讓余數也算一個數據

Base64編碼

Base64編碼表格

使用了ASCII編碼中64個可打印的字符(大寫字母A ~ Z,小寫字母a ~ z,數字0~9以及"+","/")
Base64字符表:ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/
在這里插入圖片描述

Base64編碼方式

  1. 將數據(根據ASCII編碼,UTF-8編碼等)轉成對應的二進制數
  2. 然后將所有的二進制全部串起來,6個二進制位為一組,若不足6位則低位補0,轉化成對應十進制數。
  3. 若不足24位,則補"="
    一個"=“想當於6個二進制位。
    例:
    在這里插入圖片描述
    最后只有4位,低位補全0,則為111100
    然后3*6=18 不足24位,加上一個”="
    LO加密后是TE8=

Base64偽代碼|實際環境

當函數頭是這種時候,大概率是Base64加密,然后根據字符集來確認
在這里插入圖片描述
在這里插入圖片描述

Base64url 編碼

字符表中的 ‘+’ → ‘-’ , ‘/’ → ‘_’

總結

名稱 下標數字的位個數 編碼表字符串 位數不足是否會補全= 編碼后數據量變化
base16 4 數字0~ 9和字母A~F 不會,位數剛好是4的倍數 由一個8位表示一個字符 變成 4位表示一個字符,數據量變為原來的2倍
base32 5 大寫字母A~ Z 和 數字2~7 變為 8/5 倍
base64 6 大寫字母A~ Z,小寫字母a~ z,數字0~9以及"+","/" 變為 8/6=4/3 倍

Base加解密|Python實現

Base16加解密實現

Base16加解密(原始字符表)

import base64
original = 'wo tai nan le'
print("1 original: ",type(original),original)
print("2 original.encode('utf-8'): ",type(original.encode('utf-8')),original.encode('utf-8'))
str_encode = base64.b16encode(original.encode('utf-8'))
print("3 str_encode: ",type(str_encode),str_encode)
print("4 str(str_encode,'utf-8'): ",type(str(str_encode,'utf-8')),str(str_encode,'utf-8'))
str_decode = base64.b16decode(str_encode)
print("5 str_decode: ",type(str_decode),str_decode)
print(str(str_decode,'utf-8'))

輸出結果為
在這里插入圖片描述
關鍵代碼:

base64.b16encode(<'bytes'>)  #base16編碼
base64.b16decode(<'bytes'>)  #base16解碼

可以知道,在python3.7中
base64.b16encode(X) 其中需要加密的類型為’bytes
(其中16可自行替換為16 32 64)
同時,加密后的類型也為’bytes’類型

所以加密的時候需要str 類型先轉換為 bytes 類型:
例如:origin是一個 str 類型,則origin.encode('utf-8')則為 bytes 類型

bytes 類型先轉換為 str 類型:
代碼:str(origin,'utf-8')其中origin是需要轉換的 bytes 類型數據

Base16加解密(自定義字符表)

Base16的原始字符表為:0123456789ABCDEF
倘若我們替換成abcdef0123456789
用到兩個方法

str.maketrans(intab, outtab)  //用於創建字符映射的轉換表
intab -- 字符串中被替代的字符組成的字符串。
outtab -- 用來替換的字符串。
后者替換前者
#第三個參數此處不討論
此處的str不可改

str.translate(table[, deletechars])  //根據參數table給出的表轉換字符串的字符
table -- 翻譯表,翻譯表是通過maketrans方法轉換而來。
deletechars -- 字符串中要過濾的字符列表。#第二個參數此處不討論
此處的str為需要轉換的字符串,自行根據自己字符串取的名稱進行更換

實例

intab = "like"
outtab = "love"
biao = str.maketrans(intab, outtab)
origin = "I like you"
print(origin.translate(biao))

輸出
在這里插入圖片描述
加解密實例

import base64
origin = 'wo tai nan le!!'
biao1 = str.maketrans("0123456789ABCDEF","abcdef0123456789")
str_encode = base64.b16encode(origin.encode('utf-8'))
encode = str(str_encode,'utf-8').translate(biao1)
print(encode)
biao2 = str.maketrans("abcdef0123456789","0123456789ABCDEF")
str_decode = base64.b16decode(encode.translate(biao2).encode('utf-8'))
print(str(str_decode,'utf-8'))

輸出

1109ca1e0b03ca080b08ca060fcbcb
wo tai nan le!!

Base32加解密實現

同Base16加解密,將b16改為b32即可

Base64加解密實現

同Base16加解密,將b16改為b64即可


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM