密碼學是一門通過使用代碼和密碼來保護信息的藝術與科學,其歷史可以追溯到數千年前。古典密碼學代表了這一古老學科早期的篇章。早在計算機和現代加密算法出現之前,歷史上的各個文明就依靠巧妙的方法來保護機密、安全通信以及獲取戰略優勢。
古典密碼學植根于古代文化的智慧,在歷史的關鍵時刻對保護敏感信息發揮了關鍵作用。從古埃及的象形文字到凱撒密碼,從文藝復興時期的創新到美國獨立戰爭中的密碼學陰謀,古典密碼學構成了現代密碼學原理得以建立的歷史背景。
以下是古典密碼學的簡要歷史背景:
? 古代文明: 自古以來,密碼技術就被用于各種目的,包括軍事通信、外交以及保護敏感信息。最早有記錄的密碼學使用可以追溯到古埃及,當時象形文字有時會被加密以保護陵墓和紀念碑的內容。古希臘人也為古典密碼學做出了重大貢獻,像尤利烏斯·愷撒就使用簡單的替換密碼來保護敏感的軍事信息。
?中世紀歐洲: 在中世紀的歐洲,密碼學的使用與君主和軍事領袖開發的秘密代碼和密碼緊密相關。16 世紀布萊斯·德·維吉尼亞發明的維吉尼亞密碼是古典密碼學的一個顯著進步,在數百年間都被認為是無法破解的。
? 文藝復興和啟蒙時代: 文藝復興時期,人們對密碼學的興趣日益濃厚,學者和科學家在該領域取得了諸多進展。在啟蒙時代,密碼學成為外交通信和間諜活動的重要工具。
? 美國獨立戰爭: 美國獨立戰爭是古典密碼學的一個重要歷史背景。在戰爭期間,英美雙方都使用了各種密碼和密碼本。像托馬斯·杰斐遜這樣的知名人物也開發了自己的密碼系統,比如輪盤密碼機。
? 19 世紀及以后: 19 世紀見證了更先進密碼技術的發展,包括密碼本的使用和更復雜的替換密碼。在第二次世界大戰期間,古典密碼學發揮了重要作用,英國的“超機”計劃成功破譯了軸心國的通信。
在整個歷史背景下,古典密碼學作為一種保護敏感信息、維護機密性和在軍事及外交事務中獲取優勢的手段不斷發展。它為現代密碼學的后來發展奠定了基礎。
盡管古典密碼在歷史上具有重要意義,但它們缺乏保護現代數字通信和數據所必需的安全特性。隨著技術的進步,攻擊者的手段和能力也在增強,這使得古典密碼無法滿足當代的安全需求。基于可靠數學原理的現代密碼算法和協議旨在為數字時代提供強大的安全保障。
?
凱撒密碼 是最簡單且最早為人所知的加密技術之一。它以尤利烏斯·愷撒的名字命名,據說他曾用它來傳遞機密信息。它易于理解,但安全性不高,容易受到暴力破解和頻率分析的攻擊。
這種密碼是一種替換密碼,通過將字母表中的字母向前或向后移動固定位數來進行加密和解密。凱撒密碼的密鑰是“移位值”或“密鑰”,它決定了移位的量。例如,如果移位值為 3,那么 ‘A’ 將被加密為 ‘D’,‘B’ 被加密為 ‘E’,依此類推。而Z會繞回到C。比如明文"HELLO",移位3位,應該得到密文"KHOOR"。解密的話,移位-3位,恢復原文。如果移位位數超過26時應該對26取模,因為移位26位相當于沒有移位。
py示例代碼(僅供參考):
def caesar_cipher(text, shift, mode='encrypt'):"""凱撒密碼加密/解密函數:param text: 輸入文本:param shift: 移位值:param mode: 'encrypt' 加密 或 'decrypt' 解密:return: 處理后的字符串"""result = []# 處理解密模式if mode == 'decrypt':shift = -shiftfor char in text:if char.isalpha():# 確定字符類型的基礎ASCII碼base = ord('A') if char.isupper() else ord('a')# 計算新字符new_char = chr((ord(char) - base + shift) % 26 + base)result.append(new_char)else:# 非字母字符保持不變result.append(char)return ''.join(result)# 測試示例
if __name__ == "__main__":# 加密示例plain_text = "Hello, World! 2025"shift_amount = 3encrypted = caesar_cipher(plain_text, shift_amount)print(f"加密結果: {encrypted}") # 輸出: Khoor, Zruog! 2025# 解密示例decrypted = caesar_cipher(encrypted, shift_amount, 'decrypt')print(f"解密結果: {decrypted}") # 輸出: Hello, World! 2025# 處理大偏移量(自動取模)big_shift = 29 # 29 % 26 = 3encrypted_big = caesar_cipher(plain_text, big_shift)print(f"大偏移加密: {encrypted_big}") # 輸出: Khoor, Zruog! 2025
運行結果:
這里編寫了兩個函數,一個用于加密,另一個用于解密。另外,需要考慮字符的范圍,比如是否只處理大寫字母或小寫字母,或者同時處理兩者。還需要處理非字母字符,比如空格、標點符號,這些通常保持不變。
首先處理輸入的字符串。對于每個字符,如果是字母,就進行移位;如果不是,就保留原樣。移位的時候,需要注意大小寫,因為ASCII碼中大寫字母和小寫字母的編碼不同。比如,大寫字母A的ASCII碼是65,小寫字母a是97。移位的時候,可以使用模運算來處理繞回的情況。例如,對于一個字符char,移位shift,加密后的字符可以通過公式:new_char = chr((ord(char) - base + shift) % 26 + base),其中base是大寫或小寫字母的起始ASCII碼。
然后需要編寫加密函數,接收明文和移位位數,返回密文。解密函數則可以使用相同的邏輯,但移位位數為負數,或者直接調用加密函數并傳入負的移位位數。最后,需要一個主函數來讓用戶輸入文本和移位位數,并輸出加密或解密的結果。