Vigenère cipher 維吉尼亞密碼
維吉尼亞密碼由布萊斯·德·維吉尼亞在 16 世紀發明,是凱撒密碼的一個更復雜的擴展。它是一種多字母替換密碼,使用一個關鍵字來確定明文中不同字母的多個移位值。
與凱撒密碼不同,凱撒密碼對所有字母都有固定的偏移量,而維吉尼亞密碼使用一個重復的關鍵詞為消息中的每個字母創建不同的偏移量。這使其更能抵御頻率分析,但如果消息的一部分已知,它仍然容易受到已知明文攻擊。維吉尼亞密碼曾被認為相當安全,但用現代密碼分析技術可以破解。
凱撒密碼和維吉尼亞密碼都是早期加密方法的歷史實例。雖然它們易于理解,并在密碼學史上發揮了重要作用,但它們缺乏現代加密應用所需的強大安全性,不適合保護敏感的數字信息。
維吉尼亞密碼的主要特點
- 密鑰。維吉尼亞密碼使用一個關鍵字或短語作為加密和解密消息的密鑰。關鍵字可以是任意長度,并通常重復以匹配明文的長度。
- 多字母表密碼。與凱撒密碼不同,凱撒密碼對所有字符使用固定的移位值,維吉尼亞密碼采用多字母表的方法。這意味著消息的不同部分可能會有不同的移位量,使其更復雜且更安全。
- 字母表。為了執行加密和解密,使用維吉尼亞表(也稱為維吉尼亞方陣或正方形表)。該表由多個字母表的行和列組成,每行代表不同的凱撒密碼移位。
? 加密過程
- 要加密一條消息,您需要將明文和關鍵詞對齊。
- 對于明文中的每個字母,您都要在維吉尼亞密碼表中找到由密鑰中相應字母所確定的行。
- 然后找到與你想要加密的明文字母相對應的那一列。
- 行與列的交叉點即為密文字母。
- 對明文中的每個字母重復此過程。
? 解密過程
- 用維吉尼亞密碼進行解密的過程與加密正好相反。
- 將密文與關鍵詞對齊,就像加密時那樣。
- 對于密文中的每個字母,根據關鍵字中的相應字母在維吉尼亞密碼表中找到對應的行。
- 找到包含密文字母的那一列。
- 行與列的交叉點給出的就是明文字母。
- 對密文中的每個字母都重復此過程。
維吉尼亞密碼比簡單的凱撒密碼更安全,因為它通過密鑰引入了變化性。這使得頻率分析和暴力破解攻擊更具挑戰性。但維吉尼亞密碼的安全性仍然有限,尤其是在使用較短密鑰時。較長的密鑰能提高安全性。它容易受到卡西斯基檢驗的攻擊,一種能夠幫助識別密文中重復模式的技術,并有可能揭示有關密鑰長度的信息。
🔹🔹🔹
假設有 m = 7 ,且關鍵字為 PHYSICS。對應于數值等價 K = (8, 0, 17, 11, 1, 21, 11)。
C i = ( M i + K i m o d m ) m o d 26 C_i = (M_i + K_{i \mod m}) \mod 26 Ci?=(Mi?+Kimodm?)mod26 其中 M i M_i Mi?為明文字母數值(A=0), K j K_j Kj?為密鑰字母數值, m m m為密鑰長度。
- m m m:密鑰長度(此處 m = 7 )
- M i M_i Mi?:明文中第 i 個字符的數值( a=0, b=1,…, z=25 )
- K j K_j Kj?:密鑰中第j個字符的數值( j = i mod m )
- C i C_i Ci?:密文中第i個字符的數值
密文結果為:uaitvntclzlohtpazwfnncpyjtdnabfzl
解密時將使用相同的關鍵字,但要從密文中減去它,而不是加上它。
例如:
明文 m
(索引: i = 0 ):
C i C_i Ci? = (12 + 8) mod 26 = 20
密文是: u
py代碼示例(僅供參考):
plaintext = "mariusiulianmihailescuphysicsbook"
key = [8, 0, 17, 11, 1, 21, 11]
ciphertext = []for i, char in enumerate(plaintext):# 將明文字符轉換為0-25的數值p = ord(char) - ord('a')# 獲取對應的密鑰k = key[i % 7]# 加密并轉換回字符encrypted_char = chr((p + k) % 26 + ord('a'))ciphertext.append(encrypted_char)# 將密文字符列表轉換為字符串
ciphertext_str = ''.join(ciphertext)
print(ciphertext_str)
運行結果: