- 密碼學教程
- 密碼學 - 首頁
- 密碼學 - 起源
- 密碼學 - 歷史
- 密碼學 - 原理
- 密碼學 - 應用
- 密碼學 - 優點與缺點
- 密碼學 - 現代密碼學
- 密碼學 - 傳統密碼
- 密碼學 - 加密的需求
- 密碼學 - 雙重強度加密
- 密碼系統
- 密碼系統
- 密碼系統 - 組成部分
- 密碼系統的攻擊
- 密碼系統 - 彩虹表攻擊
- 密碼系統 - 字典攻擊
- 密碼系統 - 暴力攻擊
- 密碼系統 - 密碼分析技術
- 密碼學的型別
- 密碼系統 - 型別
- 公鑰加密
- 現代對稱金鑰加密
- 密碼學雜湊函式
- 金鑰管理
- 密碼系統 - 金鑰生成
- 密碼系統 - 金鑰儲存
- 密碼系統 - 金鑰分發
- 密碼系統 - 金鑰撤銷
- 分組密碼
- 密碼系統 - 流密碼
- 密碼學 - 分組密碼
- 密碼學 - Feistel分組密碼
- 分組密碼的工作模式
- 分組密碼的工作模式
- 電子密碼本 (ECB) 模式
- 密碼分組連結 (CBC) 模式
- 密碼反饋 (CFB) 模式
- 輸出反饋 (OFB) 模式
- 計數器 (CTR) 模式
- 經典密碼
- 密碼學 - 反向密碼
- 密碼學 - Caesar 密碼
- 密碼學 - ROT13 演算法
- 密碼學 - 轉置密碼
- 密碼學 - 加密轉置密碼
- 密碼學 - 解密轉置密碼
- 密碼學 - 乘法密碼
- 密碼學 - 仿射密碼
- 密碼學 - 簡單替換密碼
- 密碼學 - 簡單替換密碼的加密
- 密碼學 - 簡單替換密碼的解密
- 密碼學 - 維吉尼亞密碼
- 密碼學 - 維吉尼亞密碼的實現
- 現代密碼
- Base64編碼與解碼
- 密碼學 - XOR 加密
- 替換技術
- 密碼學 - 單字母替換密碼
- 密碼學 - 單字母替換密碼的破解
- 密碼學 - 多字母替換密碼
- 密碼學 - Playfair 密碼
- 密碼學 - Hill 密碼
- 多字母替換密碼
- 密碼學 - 一次性密碼本密碼
- 一次性密碼本密碼的實現
- 密碼學 - 轉置技術
- 密碼學 - 柵欄密碼
- 密碼學 - 列置換密碼
- 密碼學 -隱寫術
- 對稱演算法
- 密碼學 - 資料加密
- 密碼學 - 加密演算法
- 密碼學 - 資料加密標準 (DES)
- 密碼學 - 三重 DES
- 密碼學 - 雙重 DES
- 高階加密標準 (AES)
- 密碼學 - AES 結構
- 密碼學 - AES 變換函式
- 密碼學 - 位元組替換變換
- 密碼學 - 行移位變換
- 密碼學 - 列混淆變換
- 密碼學 - 輪金鑰加變換
- 密碼學 - AES 金鑰擴充套件演算法
- 密碼學 - Blowfish 演算法
- 密碼學 - SHA 演算法
- 密碼學 - RC4 演算法
- 密碼學 - Camellia 加密演算法
- 密碼學 - ChaCha20 加密演算法
- 密碼學 - CAST5 加密演算法
- 密碼學 - SEED 加密演算法
- 密碼學 - SM4 加密演算法
- IDEA - 國際資料加密演算法
- 公鑰(非對稱)密碼演算法
- 密碼學 - RSA 演算法
- 密碼學 - RSA 加密
- 密碼學 - RSA 解密
- 密碼學 - 建立 RSA 金鑰
- 密碼學 - 破解 RSA 密碼
- 密碼學 - ECDSA 演算法
- 密碼學 - DSA 演算法
- 密碼學 - Diffie-Hellman 演算法
- 密碼學中的資料完整性
- 密碼學中的資料完整性
- 訊息認證
- 密碼學數字簽名
- 公鑰基礎設施 (PKI)
- 雜湊
- MD5(訊息摘要演算法 5)
- SHA-1(安全雜湊演算法 1)
- SHA-256(安全雜湊演算法 256 位)
- SHA-512(安全雜湊演算法 512 位)
- SHA-3(安全雜湊演算法 3)
- 雜湊密碼
- Bcrypt 雜湊模組
- 現代密碼學
- 量子密碼學
- 後量子密碼學
- 密碼協議
- 密碼學 - SSL/TLS 協議
- 密碼學 - SSH 協議
- 密碼學 - IPsec 協議
- 密碼學 - PGP 協議
- 影像和檔案加密
- 密碼學 - 影像
- 密碼學 - 檔案
- 隱寫術 - 影像
- 檔案加密和解密
- 密碼學 - 檔案加密
- 密碼學 - 檔案解密
- 物聯網中的密碼學
- 物聯網安全挑戰、威脅和攻擊
- 物聯網安全的密碼技術
- 物聯網裝置的通訊協議
- 常用的密碼技術
- 自定義構建密碼演算法(混合密碼)
- 雲密碼學
- 量子密碼學
- 密碼學中的影像隱寫術
- DNA 密碼學
- 密碼學中的一次性密碼 (OTP) 演算法
- 區別
- 密碼學 - MD5 vs SHA1
- 密碼學 - RSA vs DSA
- 密碼學 - RSA vs Diffie-Hellman
- 密碼學 vs 密碼學
- 密碼學 - 密碼學 vs 密碼分析
- 密碼學 - 經典 vs 量子
- 密碼學 vs 隱寫術
- 密碼學 vs 加密
- 密碼學 vs 網路安全
- 密碼學 - 流密碼 vs 分組密碼
- 密碼學 - AES vs DES 密碼
- 密碼學 - 對稱 vs 非對稱
- 密碼學有用資源
- 密碼學 - 快速指南
- 密碼學 - 討論
密碼學 - Base64編碼與解碼
本章將介紹 Python 中 Base64 編碼和解碼的過程,從基礎到高階方法。讓我們開始學習 Base64 編碼和解碼。
藉助 Base64 這個有效的工具,我們可以將二進位制資料轉換為允許安全文字傳輸的格式。所以基本上 Base64 幫助我們對位元組進行編碼並將其轉換為 ASCII 字元。當你想在僅處理文字的系統中傳送或使用資料時,它非常有用。這種編碼有助於確保資料在傳輸過程中保持安全且不變。
Base64 編碼的細節
Base64 指的是一組相關的編碼技術,這些技術以數字方式對二進位制資料進行編碼並將其轉換為 Base64 表示形式。Base64 這個詞來自特定的 MIME 內容傳輸編碼。
設計
用於構成 Base64 所需的 64 個字元的特定字元因實現而異。一般規則是選擇一組 64 個字元,這些字元是 1. 大多數編碼共享的子集的一部分,以及 2. 可列印的。
這種組合使得資料在透過像電子郵件這樣的系統傳輸時不太可能被修改,而這些系統以前不是 8 位乾淨的。例如,MIME 的 Base64 實現中的前 62 個值是 A-Z、a-z 和 0-9,最後兩個是“+”和“/”。其他版本通常衍生自 Base64,共享此屬性,但在用於最後兩個值的符號上有所不同;例如,URL 和檔名安全的“RFC 4648 / Base64URL”變體使用“-”和“_”。
Base64 有一組特定的字元:
26 個大寫字母
26 個小寫字母
10 個數字
加號 (+) 和斜槓 (/) 用於換行
它通常用於各種應用程式中,包括電子郵件附件、透過網際網路傳輸資料以及以簡單的文字格式儲存複雜資料。
Python 的 Base64 模組
Python 中的 Base64 模組提供使用 Base64 編碼技術對資料進行編碼和解碼的函式。這種編碼策略將二進位制資料轉換為文字格式。
以下是 Base64 重要函式的概述:
Base64 的關鍵函式
| 序號 | 函式及描述 |
|---|---|
| 1 | base64.b64encode(s, altchars=None) 此函式使用 Base64 對輸入的類似位元組的物件 s 進行編碼,並返回編碼後的位元組。要生成 URL 或檔案系統安全的 Base64 字串,可以提供一組備用字元 (altchars) 來替換標準的“+”和“/”字元。 |
| 2 | base64.b64decode(s, altchars=None, validate=False) 解碼 Base64 編碼的類似位元組的物件或 ASCII 字串 s,並返回解碼後的位元組。與 b64encode 函式類似,可以指定一組備用字元 (altchars)。如果輸入中存在 Base64 字母表之外的字元,可以啟用驗證 (validate=True) 來報告錯誤。 |
| 3 | base64.standard_b64encode(s) 此函式使用標準 Base64 字母表對輸入的類似位元組的物件 s 進行編碼,並返回編碼後的位元組。 |
| 4 | base64.standard_b64decode(s) 此函式使用標準 Base64 字母表對類似位元組的物件或 ASCII 字串 s 進行解碼,並返回解碼後的位元組。 |
| 5 | base64.urlsafe_b64encode(s) 此函式使用 URL 和檔案系統安全的字母表對輸入的類似位元組的物件 s 進行編碼,該字母表用“-”代替“+”,用“_”代替標準 Base64 字母表中的“/”。結果可能仍然包含“=”。 |
| 6 | base64.urlsafe_b64decode(s) 此函式使用 URL 和檔案系統安全的字母表對類似位元組的物件或 ASCII 字串 s 進行解碼,並返回解碼後的位元組。 |
使用 Python 實現
以下是我們在 Python 中進行 Base64 編碼和解碼的方法:
使用 Base64 進行編碼
編碼是一種將明文轉換為加密形式的方法,以便中間人無法理解它。因此,這裡我提供了兩種在 Python 中使用 Base64 進行編碼的不同方法:
使用 base64.b64encode() 函式
在此程式碼中,我們將探討如何使用 Python 的 base64 模組以可在基於文字的系統中傳輸或儲存的格式對資料進行編碼。為了對訊息進行編碼,我們將使用 base64.b64encode() 方法。此函式將資料轉換為可在僅處理文字的系統上安全傳輸的格式。這是一個簡單的示例,用於理解 Base64 編碼的概念。
以下是使用上述函式進行 Base64 編碼的實現:
示例
import base64
def base64_encoding(data):
encoded_bytes = base64.b64encode(data)
encoded_string = encoded_bytes.decode('utf-8')
return encoded_string
#our plain text message
data = b"Hello, World!"
encoded_data = base64_encoding(data)
print("Our plain text message:", data)
print("Encoded data using b64encode():", encoded_data)
以下是上述示例的輸出:
輸入/輸出
Our plain text message: b'Hello, World!' Encoded data using b64encode(): SGVsbG8sIFdvcmxkIQ==
使用 base64.standard_b64encode() 函式
該程式碼匯入了 base64 模組,該模組包含使用 Base64 編碼方法對資料進行編碼和解碼的函式。該函式使用 base64.standard_b64encode() 方法對輸入資料進行編碼。此函式使用標準 Base64 字母表將資料轉換為 Base64 編碼格式。
以下是使用 standard_b64encode() 函式的 Python 實現:
示例
import base64
def base64_encoding(data):
encoded_bytes = base64.standard_b64encode(data)
encoded_string = encoded_bytes.decode('utf-8')
return encoded_string
# Our plaintext example
data = b"Hello, Tutorialspoint!"
encoded_data = base64_encoding(data)
print("Our plain text message:", data)
print("Encoded data using standard_b64encode() :", encoded_data)
以下是上述示例的輸出:
輸入/輸出
Our plain text message: b'Hello, Tutorialspoint!' Encoded data using standard_b64encode() : SGVsbG8sIFR1dG9yaWFsc3BvaW50IQ==
使用 urlsafe_b64encode()
在本例中,我們將使用 `urlsafe_b64encode()` 方法返回一個適用於 URL 的 Base64 編碼文字。當我們需要在 URL 中新增二進位制資料(例如路徑段或查詢字串)時,這非常有用。
以下是使用上述函式進行 Base64 編碼的實現:
示例
import base64
data = b'Hello, Bharat!'
encoded_data = base64.urlsafe_b64encode(data)
print("Our plaintext message: ", data)
print("Encoded data using urlsafe_b64encode(): ", encoded_data)
以下是上述示例的輸出:
輸入/輸出
Our plaintext message: b'Hello, Bharat!' Encoded data using urlsafe_b64encode(): b'SGVsbG8sIEJoYXJhdCE='
Base64 解碼
解碼是將編碼或加密的資料轉換回其原始可讀格式的過程。
這裡有兩個 Python 程式,第一個程式將使用 `base64.b64decode()` 函式解碼 Base64 編碼的字串,另一個程式將使用 `base64.standard_b64decode()` 函式。
使用 `base64.b64decode()`
該程式實現了相同的結果,但使用了 `base64` 模組中不同的解碼函式。它直接使用 `base64.b64decode()` 來解碼 Base64 編碼的字串。
以下是使用 `b64decode()` 函式進行簡單解碼的 Python 實現:
示例
import base64
def base64_decoding(encoded_string):
decoded_bytes = base64.b64decode(encoded_string)
decoded_string = decoded_bytes.decode('utf-8')
return decoded_string
# Our ciphertext
encoded_data = "SGVsbG8sIFR1dG9yaWFsc3BvaW50IQ=="
decoded_data = base64_decoding(encoded_data)
print("Our encoded message:", encoded_data)
print("Decoded data using b64decode():", decoded_data)
以下是上述示例的輸出:
輸入/輸出
Our encoded message: SGVsbG8sIFR1dG9yaWFsc3BvaW50IQ== Decoded data using b64decode(): Hello, Tutorialspoint!
使用 `base64.standard_b64decode()`
此程式使用 `base64.standard_b64decode()` 函式來解碼加密的訊息。以下是 Base64 解碼的 Python 實現:
示例
import base64
def base64_decoding(encoded_string):
decoded_bytes = base64.standard_b64decode(encoded_string)
decoded_string = decoded_bytes.decode('utf-8')
return decoded_string
# our encrypted data
encoded_data = "SGVsbG8sIEV2ZXJ5b25lIQ=="
decoded_data = base64_decoding(encoded_data)
print("Our encoded message:", encoded_data)
print("Decoded data using standard_b64decode():", decoded_data)
以下是上述示例的輸出:
輸入/輸出
Our encoded message: SGVsbG8sIEV2ZXJ5b25lIQ== Decoded data using standard_b64decode(): Hello, Everyone!
使用 Base64 處理不同資料型別
在深入研究 Base64 編碼時,我們可能會遇到一些需要編碼除簡單文字訊息之外的其他資料型別的情況。因此,我們將瞭解如何使用 Base64 函式編碼影像和 JSON 資料。
編碼影像檔案
讓我們來看一個例子,我們有一個影像檔案,我們將把它編碼成 Base64。當我們使用 `open()` 函式以二進位制模式開啟影像檔案時,我們將使用 `read()` 方法讀取影像檔案的內容。然後,我們將使用 `b64encode()` 函式來編碼影像檔案的二進位制資料。輸出將是一個 Base64 編碼的位元組字串,顯示影像資料。
以下是操作方法:
示例
import base64
# Binary data (image)
with open('image.jpg', 'rb') as file:
binary_data = file.read()
# Encode binary data
encoded_binary_data = base64.b64encode(binary_data).decode('utf-8')
print("Encoded (Image) Binary Data:", encoded_binary_data)
在這個例子中,您可以將影像檔案路徑替換為您自己的影像檔名和路徑。
以下是上述示例的輸出:
輸入/輸出
Base64 編碼程式碼將給出以下輸出:
編碼 JSON 物件
Base64 的另一個基本用例是編碼 JSON 物件。我們將首先定義一個 JSON 物件。然後,我們將使用 `JSON` 模組中的 `dumps()` 函式將 JSON 物件轉換為字串。然後將此字串轉換為位元組,並將其傳遞給 `b64encode()` 函式進行編碼。
以下是實現:
示例
import base64
import json
# Declare a JSON object here
json_obj = {
'name': 'Amit Sharma',
'age': 28,
'city': 'New Delhi'
}
# change the JSON object to a string
json_string = json.dumps(json_obj)
# change the string to bytes
byte_data = json_string.encode('utf-8')
# Encode the bytes
encoded_data = base64.b64encode(byte_data)
print("Encoded JSON Object: ", encoded_data)
以下是上述示例的輸出:
輸入/輸出
Encoded JSON Object: b'eyJuYW1lIjogIkFtaXQgU2hhcm1hIiwgImFnZSI6IDI4LCAiY2l0eSI6ICJOZXcgRGVsaGkifQ=='
如您所見,Python 中的 Base64 編碼非常靈活,可以處理各種資料格式。Python 的 `base64` 模組可以編碼文字、影像檔案和 JSON 物件。
應用
Base64 編碼常用於各種應用程式。它廣泛用於加密二進位制資料,尤其是在需要透過電子郵件進行通訊或用於其他文字欄位時。它也用於各種 Web 和網際網路協議,以及編碼數字簽名和證書。
侷限性
以下是 Base64 編碼的侷限性:
Base64 編碼通常會將資料大小增加約 33%。這會影響傳輸和儲存效率,尤其對於大型資料集而言。
它基本上不是一種加密形式。它只是將資料轉換為不同的格式。因此,敏感資訊不會被保密或安全。
Base64 在編碼資料的末尾新增填充字元('='),以確保其正確對齊。這可能會使編碼資料的解析和處理變得複雜。
它使用一組有限的字元(A-Z、a-z、0-9、'+'、'/')進行編碼。當編碼資料需要在對某些字元有限制的系統中傳輸或處理時,這可能會導致問題。
Base64 編碼不會壓縮資料。它僅用於以文字格式表示二進位制資料,而不是用於減小檔案大小。
ASCII 和 Base64 的區別
在使用 ASCII 和 Base64 編碼資料時,您可以觀察到以下區別:
當您使用 ASCII 編碼文字時,您從文字字串開始,將其轉換為位元組序列。
當您使用 Base64 編碼資料時,您從位元組序列開始,將其轉換為文字字串。
缺點
Base64 演算法通常用於在資料庫中儲存密碼。主要的缺點是每個解碼後的單詞都可以透過任何線上工具輕鬆編碼,入侵者可以輕鬆獲取資訊。