移位密碼(Shift Cipher)體制的加密、解密和破解


移位密碼的理論基礎是數論中的模運算。

模運算的基本定義:假設a和b均為整數,m是一正整數。若m整除a-b,則可將其表示為a≡b(mod m),正整數m稱為模數。

模運算m上的算術運算定義:令表示集合{0,1,...,m-1},在其上定義兩個運算,加法(+)和乘法(x) —— 運算類似於普通的實數域上的加法和乘法,所不同的只是所得的值是取模以后的余數。

 

因為英文有26個字母,故其一般定義在,則容易驗證移位密碼滿足所定義的密碼體制1.1的條件,即對任意的x∈,都有

若取K=3,則次密碼體制通常叫做凱撒密碼(Caesar Cipher),因為它首先被儒勒·凱撒所使用。

 

使用移位密碼來加密普通的英文句子,首先必須要建立英文字母和模26剩余之間的一一對應關系:如A=1,B=2,...Z=25,如下表所示:

例如,假設移位密碼的密鑰為K=11,明文為wewillmeetatmidnight。

首先將明文中的字母對應於其相應的整數,得到如下數字串:

22 04 22 08 11 11 12 04 04 19

00 19 12 08 03 13 08 06 07 19

然后,將每個數都與11相加,再對其和取模26運算,可得:

07 15 07 19 22 22 23 15 15 04

11 04 23 19 14 24 19 17 18 04

最后,再將其轉換為相應的字符串,即得到密文為HPHTWWXPPELEXTOYTRSE。

要對密文進行解密,只需執行相應的逆過程即可。

 

但是,移位密碼(模26)是不安全的,可用密鑰窮盡搜索方法來破譯,因為密鑰空間太小,只有26種可能的情況,可以窮舉所有的可能密鑰,得到我們所希望的有意義的明文來。 

 

代碼實現(Python 3)

'''暴力破解移位密碼'''
def hack_shift_cipher(text :str):
    SYMBOLS = 'abcdefghijklmnopqrstuvwxyz'
    for key in range(27):
        translated = ''
        for symbol in text:
            symbol = symbol.lower()
            if symbol in SYMBOLS:
                symbolIndex = SYMBOLS.find(symbol)
                translatedIndex = (symbolIndex - key ) %26
                translated = translated + SYMBOLS[translatedIndex]
            else:
                translated = translated + symbol
        print(f'key={key}: {translated}')


'''移位密碼體制加密'''
def shift_cipher_encrypt(text: str, key = 13):
    SYMBOLS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
    translated = ''
    for symbol in text:
        symbol = symbol.upper()
        if symbol in SYMBOLS:
            symbolIndex = SYMBOLS.find(symbol)
            translatedIndex = (symbolIndex + key ) %26
            translated = translated + SYMBOLS[translatedIndex]
        else:
            translated = translated + symbol
    print(translated)


'''移位密碼體制解密'''
def shift_cipher_decrypt(text: str, key = 13):
    SYMBOLS = 'abcdefghijklmnopqrstuvwxyz'
    translated = ''
    for symbol in text:
        symbol = symbol.lower()
        if symbol in SYMBOLS:
            symbolIndex = SYMBOLS.find(symbol)
            translatedIndex = (symbolIndex - key ) %26
            translated = translated + SYMBOLS[translatedIndex]
        else:
            translated = translated + symbol
    print(translated)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM