凯撒密码加解密实现(python)

Caesar(凯撒密码)

原理

凯撒密码(Caesar)加密时会将明文中的 每个字母 都按照其在字母表中的顺序向后(或向前)移动固定数目(循环移动)作为密文。例如,当偏移量是左移 3 的时候(解密时的密钥就是 3):

明文字母表:ABCDEFGHIJKLMNOPQRSTUVWXYZ
密文字母表:DEFGHIJKLMNOPQRSTUVWXYZABC

使用时,加密者查找明文字母表中需要加密的消息中的每一个字母所在位置,并且写下密文字母表中对应的字母。需要解密的人则根据事先已知的密钥反过来操作,得到原来的明文。例如:

明文:THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG
密文:WKH TXLFN EURZQ IRA MXPSV RYHU WKH ODCB GRJ

例题

已知密文为vzsx,位移量为3,求明文?
解:第一步,写出密文中字母对应的位置(下标),比如说a在字母表中为第一位,就记作1(记作0也可以,最后一个字母z = 25)
    所以我们可以写出v = 22,z = 26,s = 19,x = 24
    第二步,因为位移量为3,所以我们将以上数字都减3,即19,23,16,21
    第三步,将以上数字还原为字母,19对应s,23对应w,16对应p,21对应u,我们就解出了明文swpu.
    

加解密脚本

from string import ascii_letters


def encrypt(plaintext, key):
    if key < 0:
        raise Exception
    res = ''
    key = key % 26
    for s in plaintext:
        if s in ascii_letters in ascii_letters:
            if chr(ord(s) + key) in ascii_letters:
                res += ''.join(chr(ord(s) + key))
            else:
                res += ''.join(chr(ord(s) + key - 26))
        else:
            res += ''.join(s)
    return res


def decrypt(plaintext, key):
    if key < 0:
        raise Exception
    res = ''
    key = key % 26
    for s in plaintext:
        if s in ascii_letters in ascii_letters:
            if chr(ord(s) - key) in ascii_letters:
                res += ''.join(chr(ord(s) - key))
            else:
                res += ''.join(chr(ord(s) - key + 26))
        else:
            res += ''.join(s)
    return res


def attack(plaintext):
    for key in range(0, 27):
        res = ''
        for s in plaintext:
            if s in ascii_letters in ascii_letters:
                if chr(ord(s) - key) in ascii_letters:
                    res += ''.join(chr(ord(s) - key))
                else:
                    res += ''.join(chr(ord(s) - key + 26))
            else:
                res += ''.join(s)
        res = 'key为' + str(key) + '时:' + res
        print(res)


plaintext = 'QVVFWI{wklv_lv_d_whvw_iodj}'
attack(plaintext)

你可能感兴趣的:(CTF,python)