
- 密碼學教程
- 密碼學 - 首頁
- 密碼學 - 起源
- 密碼學 - 歷史
- 密碼學 - 原理
- 密碼學 - 應用
- 密碼學 - 優缺點
- 密碼學 - 現代
- 密碼學 - 傳統密碼
- 密碼學 - 加密的需求
- 密碼學 - 雙重強度加密
- 密碼系統
- 密碼系統
- 密碼系統 - 元件
- 密碼系統攻擊
- 密碼系統 - 彩虹表攻擊
- 密碼系統 - 字典攻擊
- 密碼系統 - 暴力破解攻擊
- 密碼系統 - 密碼分析技術
- 密碼學型別
- 密碼系統 - 型別
- 公鑰加密
- 現代對稱金鑰加密
- 密碼學雜湊函式
- 金鑰管理
- 密碼系統 - 金鑰生成
- 密碼系統 - 金鑰儲存
- 密碼系統 - 金鑰分發
- 密碼系統 - 金鑰撤銷
- 分組密碼
- 密碼系統 - 流密碼
- 密碼學 - 分組密碼
- 密碼學 - Feistel 分組密碼
- 分組密碼操作模式
- 分組密碼操作模式
- 電子密碼本 (ECB) 模式
- 密碼分組連結 (CBC) 模式
- 密碼反饋 (CFB) 模式
- 輸出反饋 (OFB) 模式
- 計數器 (CTR) 模式
- 經典密碼
- 密碼學 - 反向密碼
- 密碼學 - 凱撒密碼
- 密碼學 - ROT13 演算法
- 密碼學 - 轉置密碼
- 密碼學 - 加密轉置密碼
- 密碼學 - 解密轉置密碼
- 密碼學 - 乘法密碼
- 密碼學 - 仿射密碼
- 密碼學 - 簡單替換密碼
- 密碼學 - 簡單替換密碼加密
- 密碼學 - 簡單替換密碼解密
- 密碼學 - 維吉尼亞密碼
- 密碼學 - 實現維吉尼亞密碼
- 現代密碼
- Base64 編碼和解碼
- 密碼學 - 異或加密
- 替換技術
- 密碼學 - 單字母替換密碼
- 密碼學 - 破解單字母替換密碼
- 密碼學 - 多字母替換密碼
- 密碼學 - Playfair 密碼
- 密碼學 - 希爾密碼
- 多字母替換密碼
- 密碼學 - 一次性密碼本密碼
- 一次性密碼本密碼的實現
- 密碼學 - 轉置技術
- 密碼學 - 柵欄密碼
- 密碼學 - 列移位密碼
- 密碼學 - 隱寫術
- 對稱演算法
- 密碼學 - 資料加密
- 密碼學 - 加密演算法
- 密碼學 - 資料加密標準
- 密碼學 - 三重 DES
- 密碼學 - 雙重 DES
- 高階加密標準
- 密碼學 - AES 結構
- 密碼學 - AES 變換函式
- 密碼學 - 位元組替換變換
- 密碼學 - 行移位變換
- 密碼學 - 列混合變換
- 密碼學 - 輪金鑰加變換
- 密碼學 - AES 金鑰擴充套件演算法
- 密碼學 - Blowfish 演算法
- 密碼學 - SHA 演算法
- 密碼學 - RC4 演算法
- 密碼學 - Camellia 加密演算法
- 密碼學 - ChaCha20 加密演算法
- 密碼學 - CAST5 加密演算法
- 密碼學 - SEED 加密演算法
- 密碼學 - SM4 加密演算法
- IDEA - 國際資料加密演算法
- 公鑰(非對稱)密碼學演算法
- 密碼學 - RSA 演算法
- 密碼學 - RSA 加密
- 密碼學 - RSA 解密
- 密碼學 - 建立 RSA 金鑰
- 密碼學 - 破解 RSA 密碼
- 密碼學 - ECDSA 演算法
- 密碼學 - DSA 演算法
- 密碼學 - Diffie-Hellman 演算法
- 密碼學中的資料完整性
- 密碼學中的資料完整性
- 訊息認證
- 密碼學數字簽名
- 公鑰基礎設施
- 雜湊
- MD5(訊息摘要演算法 5)
- SHA-1(安全雜湊演算法 1)
- SHA-256(安全雜湊演算法 256 位)
- SHA-512(安全雜湊演算法 512 位)
- SHA-3(安全雜湊演算法 3)
- 雜湊密碼
- Bcrypt 雜湊模組
- 現代密碼學
- 量子密碼學
- 後量子密碼學
- 密碼協議
- 密碼學 - SSL/TLS 協議
- 密碼學 - SSH 協議
- 密碼學 - IPsec 協議
- 密碼學 - PGP 協議
- 影像和檔案加密
- 密碼學 - 影像
- 密碼學 - 檔案
- 隱寫術 - 影像
- 檔案加密和解密
- 密碼學 - 檔案加密
- 密碼學 - 檔案解密
- 物聯網中的密碼學
- 物聯網安全挑戰、威脅和攻擊
- 物聯網安全的加密技術
- 物聯網裝置的通訊協議
- 常用的加密技術
- 自定義構建加密演算法(混合加密)
- 雲密碼學
- 量子密碼學
- 密碼學中的影像隱寫術
- DNA 密碼學
- 密碼學中的一次性密碼 (OTP) 演算法
- 區別
- 密碼學 - MD5 與 SHA1
- 密碼學 - RSA 與 DSA
- 密碼學 - RSA 與 Diffie-Hellman
- 密碼學與密碼學
- 密碼學 - 密碼學與密碼分析
- 密碼學 - 經典與量子
- 密碼學與隱寫術
- 密碼學與加密
- 密碼學與網路安全
- 密碼學 - 流密碼與分組密碼
- 密碼學 - AES 與 DES 密碼
- 密碼學 - 對稱與非對稱
- 密碼學有用資源
- 密碼學 - 快速指南
- 密碼學 - 討論
密碼學 - 異或加密
異或函式廣泛應用於密碼學、數字邏輯電路、網路保護以及 Python、Java 和 C++ 等程式語言。異或運算也稱為“互斥或”。
邏輯函式異或(互斥或)比較兩個二進位制數字,如果它們不同則返回 1。如果兩個位完全相等,則異或函式返回 0。換句話說,如果其中一個二進位制數字為 1 但不是兩個都為 1,則異或給出 1。
正如我們上面討論的,異或可以用於密碼學中的加密。因此,藉助異或加密,我們可以加密難以使用蠻力破解的資料。例如,建立與正確金鑰匹配的隨機加密金鑰。
使用 Python 實現
我們可以使用以下 Python 方法實現異或加密:
使用 For 迴圈和固定金鑰
使用隨機金鑰生成
使用 base64 模組
在接下來的部分中,我們將嘗試簡要解釋這些方法中的每一種,以便您能夠更好地理解使用 Python 的異或加密。
方法 1:使用 for 迴圈和固定金鑰
異或加密是一種簡單的對稱加密演算法,其中輸入訊息中的每個單獨字元都使用異或運算與金鑰組合。因此,我們可以使用異或運算逐個字元地加密我們的輸入訊息,並且在這裡我們可以為每個字元使用一個固定金鑰。在我們的例子中,金鑰是“T”。然後將異或運算的結果轉換回字元。
使用金鑰對每個字元進行異或運算的過程隱藏了原始訊息,使其在沒有加密金鑰的情況下難以閱讀。
以下是在明文中執行異或加密的示例:
示例
#Our XOR encryption function def xorEncrypt(inpString): my_xor_key = 'T' length = len(inpString) encrypted_msg = "" for i in range(length): encrypted_msg += chr(ord(inpString[i]) ^ ord(my_xor_key)) return encrypted_msg demoMsg = "This is Tutorialspoint" # Encrypt the string print("Original Message: ", demoMsg) encrypted_message = xorEncrypt(demoMsg) print("Our Encrypted Message: ", encrypted_message)
以下是上述示例的輸出:
輸入/輸出
Original Message: This is Tutorialspoint Our Encrypted Message: <='t='t! ;&=58'$;=:
方法 2:使用隨機金鑰生成
在這種方法中,我們將使用 Python 的 random 模組生成隨機金鑰,以建立與訊息長度相同的金鑰用於異或加密。它使用 random.choice() 方法從 string 模組中隨機選擇 ASCII 字元。
在 xorEncrypt 函式中,生成的金鑰和訊息作為引數傳遞。zip 函式用於同時迭代訊息和金鑰的對應字元。
此過程為加密過程增加了隨機性和安全性。
以下是使用隨機金鑰生成進行異或加密的 Python 實現:
示例
import random import string #Generate random key def generate_key(length): return ''.join(random.choice(string.printable) for _ in range(length)) # XOR Encryption function def xorEncrypt(message, key): encrypted = ''.join(chr(ord(char) ^ ord(key_char)) for char, key_char in zip(message, key)) return encrypted #Function execution and input message message = "Hello, Everyone!" key = generate_key(len(message)) encrypted_msg = xorEncrypt(message, key) print("Encrypted Message:", encrypted_msg) decrypted_msg = xorEncrypt(encrypted_msg, key) print("Decrypted Message:", decrypted_msg)
以下是上述示例的輸出:
輸入/輸出
Encrypted Message: e-2( vH#R\29 Decrypted Message: Hello, Everyone!
方法 3:使用 base64 模組
Python 中的 base64 模組提供使用 Base64 編碼對資訊進行編碼和解碼的功能。因此,我們將使用使用者定義的金鑰對輸入訊息執行異或加密。加密訊息後,我們將使用 base64 對其進行編碼以建立加密訊息。
這是一個實現,它顯示了使用使用者定義的金鑰進行異或加密,然後使用 base64 對加密的訊息進行編碼:
示例
import base64 def xorEncrypt(message, key): encrypted = ''.join(chr(ord(char) ^ ord(key[i % len(key)])) for i, char in enumerate(message)) return encrypted def main(): try: message = "Hello my name is Azaad" key = "T" print("Our Original Message is:", message) # Encrypt the message using XOR encryption encrypted_message = xorEncrypt(message, key) # Encode the encrypted message using base64 encoded_message = base64.b64encode(encrypted_message.encode()).decode() print("Encrypted and encoded message:", encoded_message) except Exception as e: print("An error occurred:", str(e)) if __name__ == "__main__": main()
以下是上述示例的輸出:
輸入/輸出
Our Original Message is: Hello my name is Azaad Encrypted and encoded message: HDE4ODt0OS10OjU5MXQ9J3QVLjU1MA==
使用 Java 實現
在此實現中,我們將使用 Java 的 Base64 類來實現 Base64 編碼和解碼功能。此類僅包含用於獲取 Base64 編碼方法的編碼器和解碼器的靜態方法。此類的實現支援 RFC 4648 和 RFC 2045 中指定的 Base64 型別。
示例
因此,以下是使用 Java 的 Base64 類實現 Base64 編碼和解碼的方法
import java.util.Base64; public class Base64Class { public static void main(String[] args) { // Encoding process String plaintext = "Hello, Tutorialspoint!"; String encoded_message = Base64.getEncoder().encodeToString(plaintext.getBytes()); System.out.println("The Encoded string: " + encoded_message); // Decoding process byte[] decodedBytes = Base64.getDecoder().decode(encoded_message); String decodedString = new String(decodedBytes); System.out.println("The Decoded string: " + decodedString); } }
以下是上述示例的輸出:
輸入/輸出
The Encoded string: SGVsbG8sIFR1dG9yaWFsc3BvaW50IQ== The Decoded string: Hello, Tutorialspoint!
使用 C++ 實現
C++ 程式碼實現了一個將字串編碼為 Base64 的函式。在這裡,我們將主要使用 vector 和 iomanip 庫來實現 Base64。Vector 庫包含有用資料結構和函式的定義和實現,而 iomanip 是一個庫,主要用於操縱 C++ 程式的輸出。
此程式碼基本上將每個字元轉換為其相應的 Base64 成本並將其追加到輸出字串中。類似地,解密功能將每個 Base64 字元轉換回其唯一值並將其追加到輸出字串中。這樣,原始字串就會被重建。
示例
以下是使用 C++ 的實現
#include <iostream> #include <string> #include <vector> #include <iomanip> #include <sstream> std::string base64_encode(const std::string &in) { std::string out; std::string base64_chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" "abcdefghijklmnopqrstuvwxyz" "0123456789+/"; int val = 0, valb = -6; for (unsigned char c : in) { val = (val << 8) + c; valb += 8; while (valb >= 0) { out.push_back(base64_chars[(val >> valb) & 0x3F]); valb -= 6; } } if (valb > -6) out.push_back(base64_chars[((val << 8) >> (valb + 8)) & 0x3F]); while (out.size() % 4) out.push_back('='); return out; } std::string base64_decode(const std::string &in) { std::string out; std::string base64_chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" "abcdefghijklmnopqrstuvwxyz" "0123456789+/"; std::vector<int> base64_reverse_chars(256, -1); for (int i = 0; i < 64; i++) { base64_reverse_chars[base64_chars[i]] = i; } int val = 0, valb = -8; for (unsigned char c : in) { if (base64_reverse_chars[c] == -1) break; val = (val << 6) + base64_reverse_chars[c]; valb += 6; if (valb >= 0) { out.push_back(char((val >> valb) & 0xFF)); valb -= 8; } } return out; } int main() { std::string plaintext = "Hello, Everyone. This world is beautiful!"; std::string es = base64_encode(plaintext); std::cout << "The Encoded string: " << es << std::endl; std::string ds = base64_decode(es); std::cout << "The Decoded string: " << ds << std::endl; return 0; }
以下是上述示例的輸出:
輸入/輸出
The Encoded string: SGVsbG8sIEV2ZXJ5b25lLiBUaGlzIHdvcmxkIGlzIGJlYXV0aWZ1bCE= The Decoded string: Hello, Everyone. This world is beautiful!
優勢
使用異或加密過程加密訊息有一些優勢 -
異或加密非常簡單易於實現和理解。
此方法計算效率高,使其成為一種快速的加密方法。
異或加密是一種對稱加密,因此與非對稱加密方法相比,它簡化了金鑰管理。
它可以透過使用不同的金鑰輕鬆自定義,從而允許各種加密變化。
缺點
以下是需要注意的一些異或加密的缺點 -
異或加密需要一個安全的金鑰交換過程來確保金鑰的機密性。
它容易受到已知明文攻擊,攻擊者可以在其中猜測明文和密文中模式以獲取金鑰或解密其他訊息。
在這種技術中,我們對多個訊息重複使用相同的金鑰。這會削弱異或加密的安全性。
它不適合加密大量資料,因為它缺乏像 AES 這樣的現代加密演算法提供的安全功能。