
- 密碼學教程
- 密碼學 - 首頁
- 密碼學 - 起源
- 密碼學 - 歷史
- 密碼學 - 原理
- 密碼學 - 應用
- 密碼學 - 優點與缺點
- 密碼學 - 現代密碼學
- 密碼學 - 傳統密碼
- 密碼學 - 加密的需求
- 密碼學 - 雙重強度加密
- 密碼系統
- 密碼系統
- 密碼系統 - 組成部分
- 密碼系統攻擊
- 密碼系統 - 彩虹表攻擊
- 密碼系統 - 字典攻擊
- 密碼系統 - 暴力攻擊
- 密碼系統 - 密碼分析技術
- 密碼學型別
- 密碼系統 - 型別
- 公鑰加密
- 現代對稱金鑰加密
- 密碼學雜湊函式
- 金鑰管理
- 密碼系統 - 金鑰生成
- 密碼系統 - 金鑰儲存
- 密碼系統 - 金鑰分發
- 密碼系統 - 金鑰撤銷
- 分組密碼
- 密碼系統 - 流密碼
- 密碼學 - 分組密碼
- 密碼學 - Feistel 分組密碼
- 分組密碼的工作模式
- 分組密碼的工作模式
- 電子密碼本 (ECB) 模式
- 密碼分組連結 (CBC) 模式
- 密碼反饋 (CFB) 模式
- 輸出反饋 (OFB) 模式
- 計數器 (CTR) 模式
- 經典密碼
- 密碼學 - 反向密碼
- 密碼學 - 凱撒密碼
- 密碼學 - 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 與 SHA1
- 密碼學 - RSA 與 DSA
- 密碼學 - RSA 與 Diffie-Hellman
- 密碼學與密碼學
- 密碼學 - 密碼學與密碼分析
- 密碼學 - 經典與量子
- 密碼學與隱寫術
- 密碼學與加密
- 密碼學與網路安全
- 密碼學 - 流密碼與分組密碼
- 密碼學 - AES 與 DES 密碼
- 密碼學 - 對稱與非對稱
- 密碼學有用資源
- 密碼學 - 快速指南
- 密碼學 - 討論
密碼學 - 仿射密碼
現在我們將學習仿射密碼及其加密和解密演算法。仿射密碼是單字母替換密碼的一個例子。它是一種加密策略。它也像一個秘密程式碼,將敏感內容轉換為編碼形式。
在仿射密碼中,訊息中的每個字母都透過遵循一個簡單的數學公式替換為另一個字母。在這個演算法中,我們將字母在字母集中的位置乘以一個數字,然後再加上另一個數字。此過程更改訊息,以便只有知道正確數字的人才能將其翻譯回其原始形式。
由於加密策略基本上是數學的,因此它與我們已經看到的其他情況略有不同。整個過程依賴於模m運算,其中m是字元集的長度。我們透過對明文字元應用方程來轉換明文。
仿射密碼加密
加密過程的第一步是將明文字母集中的每個字母轉換為其在 0 到 M-1 範圍內的對應數字。完成此操作後,每個字母的加密過程由下式給出:
E(x) = (Ax + B) mod M
其中,
E 是加密訊息。
x 是字母在字母集中的位置(例如,A=0,B=1,C=2,…,Z=25)
A 和 B 是密碼的金鑰。這表明我們在將明文字母的數值乘以 A 後,將 B 加到結果中。
M 表示模。
(也就是說,當我們將大數除以字母集的長度時,我們找到餘數部分。這確保了我們的新字母仍然在字母表內)。
仿射密碼解密
當我們必須使用仿射密碼加密系統解密密文時,我們將不得不執行與加密相反的過程。第一步是將每個密文字母轉換回其數值,就像我們在轉換訊息時所做的那樣。
然後,要解密每個數字,我們使用以下公式:
D(x)= C(x − B) mod M
其中,
D 代表解密訊息。
x 表示我們從密文字母獲得的數字。
B 表示我們在加密時新增以移動字母的數字。
C 是一個特殊的數字,稱為 A 的模乘法逆元。這是一個數字,當我們將其乘以 A 並不斷減去字母表的長度時,我們將得到 1。
M 是模或字母的長度。
讓我們看看下面的圖片,以簡單的方式理解加密和解密過程。

使用 Python 實現
現在,我們將使用不同的方法實現使用 Python 的仿射加密和解密程式:
使用字典對映
使用預定義金鑰
因此,我們將在以下部分中看到所有上述方法及其在 Python 中的實現:
使用字典對映
在這個例子中,我們將使用字典對映來使用 Python 建立仿射密碼演算法。字典對映的過程需要在解密或加密的情況下將每個字母轉換為其等效字母。
我們的加密和解密數學公式為仿射密碼中的這種對映提供了起點。字母表的原始字母用作字典的鍵,而其加密或解密版本用作值。可以使用程式碼中此字典訪問明文或密文中每個字母的加密或解密字母。
示例
以下是使用字典對映的仿射密碼加密和解密演算法的 Python 實現。請檢視下面的程式碼:
# Encryption function def affine_encrypt(text, a, b): encrypted_text = "" for char in text: if char.isalpha(): if char.isupper(): encrypted_text += chr(((a * (ord(char) - ord('A')) + b) % 26) + ord('A')) else: encrypted_text += chr(((a * (ord(char) - ord('a')) + b) % 26) + ord('a')) else: encrypted_text += char return encrypted_text # Decryption function def affine_decrypt(text, a, b): decrypted_text = "" m = 26 a_inv = pow(a, -1, m) for char in text: if char.isalpha(): if char.isupper(): decrypted_text += chr(((a_inv * (ord(char) - ord('A') - b)) % 26) + ord('A')) else: decrypted_text += chr(((a_inv * (ord(char) - ord('a') - b)) % 26) + ord('a')) else: decrypted_text += char return decrypted_text # plain text message and keys plain_text = "Nice to meet you!" a = 5 b = 8 encrypted_text = affine_encrypt(plain_text, a, b) print("Our Encrypted text:", encrypted_text) decrypted_text = affine_decrypt(encrypted_text, a, b) print("Our Decrypted text:", decrypted_text)
以下是上述示例的輸出:
輸入/輸出
Our Encrypted text: Vwsc za qccz yae! Our Decrypted text: Nice to meet you!
使用預定義金鑰
此程式碼執行仿射密碼過程以編碼和解碼內容。它在 KEY 變數中使用預定義金鑰進行加密和解密。此變數是一個包含三個值的元組:(7, 3, 55)。這些值顯示仿射密碼的加密和解密金鑰。我們還將有另一個變數稱為 DIE,它表示字元集大小 (128)。
示例
以下是使用預定義金鑰的仿射密碼加密和解密演算法的 Python 實現。檢視下面的程式碼:
# Affine cipher Class class affine_cipher(object): DIE = 128 KEY = (7, 3, 55) def __init__(self): pass def encryptChar(self, char): K1, K2, kI = self.KEY return chr((K1 * ord(char) + K2) % self.DIE) def encrypt(self, string): return "".join(map(self.encryptChar, string)) def decryptChar(self, char): K1, K2, KI = self.KEY return chr((KI * (ord(char) - K2)) % self.DIE) def decrypt(self, string): return "".join(map(self.decryptChar, string)) affine = affine_cipher() print("Our Encrypted Text: ", affine.encrypt('Affine Cipher')) print("Our Decrypted Text: ", affine.decrypt('JMMbFcXb[F!'))
以下是上述示例的輸出:
輸入/輸出
Our Encrypted Text: JMMbFcXb[F! Our Decrypted Text: Affine Cipher
使用 Java 實現
本實現將使用Java程式語言來使用仿射密碼加密和解密訊息。因此,我們將在這裡使用兩個金鑰,第一個是乘法金鑰 (A),第二個是加法金鑰 (B)。這些金鑰將用於混合給定訊息中的字母,使其保密。對於解密訊息,將使用一種稱為模乘法逆的特殊數學公式來撤消加密。
示例
因此,下面給出了使用Java實現仿射密碼的方法:
public class AffineCipher { static final int A = 17; // Multiplicative Key static final int B = 20; // Additive Key // Function to find modular multiplicative inverse static int modInverse(int a, int m) { for (int x = 1; x < m; x++) { if (((a % m) * (x % m)) % m == 1) { return x; } } return -1; // If inverse is not there } // Function to encrypt plaintext static String encryptMessage(String pt) { StringBuilder ciphertext = new StringBuilder(); for (int i = 0; i < pt.length(); i++) { char ch = pt.charAt(i); if (Character.isLetter(ch)) { if (Character.isUpperCase(ch)) { ciphertext.append((char) ('A' + (A * (ch - 'A') + B) % 26)); } else { ciphertext.append((char) ('a' + (A * (ch - 'a') + B) % 26)); } } else { ciphertext.append(ch); } } return ciphertext.toString(); } // Function to decrypt ciphertext static String decryptMessage(String ciphertext) { StringBuilder pt = new StringBuilder(); int aInverse = modInverse(A, 26); if (aInverse == -1) { return "Inverse doesn't exist"; } for (int i = 0; i < ciphertext.length(); i++) { char ch = ciphertext.charAt(i); if (Character.isLetter(ch)) { if (Character.isUpperCase(ch)) { int x = (aInverse * (ch - 'A' - B + 26)) % 26; pt.append((char) ('A' + x)); } else { int x = (aInverse * (ch - 'a' - B + 26)) % 26; pt.append((char) ('a' + x)); } } else { pt.append(ch); } } return pt.toString(); } public static void main(String[] args) { String pt = "Hello this is an example of affine cipher"; String et = encryptMessage(pt); // Encrypted Text System.out.println("The Encrypted Text: " + et); String dt = decryptMessage(et); // Decrypted Text System.out.println("The Decrypted Text: " + dt); } }
以下是上述示例的輸出:
輸入/輸出
The Encrypted Text: Jkzzy fjao ao uh kvuqpzk yb ubbahk capjkx The Decrypted Text: Hello this is an example of affine cipher
使用C++的實現
我們將使用C++程式語言來實現仿射密碼,這是一種保持訊息秘密的方法。因此,這段程式碼的概念與我們在Java實現中使用的一樣,但區別在於我們將在這裡使用C++。
示例
因此,下面給出了C++中仿射密碼的實現:
#include <iostream> #include <string> using namespace std; const int A = 17; // Multiplicative Key const int B = 20; // Additive Key // function to find mod inverse int modInverse(int a, int m) { for (int x = 1; x < m; x++) { if (((a % m) * (x % m)) % m == 1) { return x; } } return -1; // If inverse is not there } // Function to encrypt plaintext string encryptMessage(string plaintext) { string ciphertext = ""; for (char ch : plaintext) { if (isalpha(ch)) { if (isupper(ch)) { ciphertext += (char)('A' + (A * (ch - 'A') + B) % 26); } else { ciphertext += (char)('a' + (A * (ch - 'a') + B) % 26); } } else { ciphertext += ch; } } return ciphertext; } // Function to decrypt ciphertext string decryptMessage(string ciphertext) { string plaintext = ""; int aInverse = modInverse(A, 26); if (aInverse == -1) { return "Inverse doesn't exist"; } for (char ch : ciphertext) { if (isalpha(ch)) { if (isupper(ch)) { int x = (aInverse * (ch - 'A' - B + 26)) % 26; plaintext += (char)('A' + x); } else { int x = (aInverse * (ch - 'a' - B + 26)) % 26; plaintext += (char)('a' + x); } } else { plaintext += ch; } } return plaintext; } int main() { string pt = "Hello there i am working with Affine Cipher"; string et = encryptMessage(pt); cout << "Encrypted Text: " << et << endl; string dt = decryptMessage(et); cout << "Decrypted Text: " << dt << endl; return 0; }
以下是上述示例的輸出:
輸入/輸出
The Encrypted Text: Jkzzy fjkxk a uq eyxiahs eafj Ubbahk Capjkx The Decrypted Text: Hello there i am working with Affine Cipher
特點
易於理解和實現。
字母表的大小可以調整。
它允許使用不同的金鑰進行加密和解密。因此,它在選擇安全級別方面提供了靈活性。
加密和解密過程包括數值運算,這為編碼的訊息增加了一層安全性。
缺點
可能的金鑰數量受字母集大小的限制,這容易受到暴力攻擊。
由於仿射密碼保留了字母頻率,因此它容易受到頻率分析攻擊。
它只關注加密和解密,缺乏資料完整性驗證或傳送者身份驗證機制。
總結
在本章中,我們學習了仿射密碼演算法,用於加密和解密我們的秘密資訊。它使用數學公式來加密和解密給定的訊息。它有助於保護訊息安全,方法是將它們轉換成只有使用正確的數字才能理解的秘密程式碼。我們還看到了使用Python以不同方式實現仿射密碼的方法。一種方法涉及使用模算術運算,我們在其中將數字保持在特定範圍內。另一種方法使用字典對映,其中每個字母根據公式替換為其加密或解密版本。