天天看點

Python程式設計:實作凱撒密碼加密解密

凱撒密碼

原理:

通過把字母移動一定的位數來實作加解密

明文中的所有字母從字母表向後(或向前)按照一個固定步長進行偏移後被替換成密文。

例如:

當步長為3時,A被替換成D,B被替換成E,依此類推,X替換成A。

Python程式設計:實作凱撒密碼加密解密

在密碼學中,用于解決複雜問題的步驟,稱為一種算法

加密算法: 從明文到密文的過程

解密算法: 從密文到明文的過程

二者合稱為密碼算法。

密碼算法+密鑰構成了資料加密和解密

對稱加密: 在加密和解密的過程中使用相同密鑰的算法,例如:凱撒密碼

非對稱密碼(公鑰加密算法):加密和解密使用不同密鑰的算法,例如:RSA

Python 來實作凱撒密碼

Python程式設計:實作凱撒密碼加密解密

ord() :将字元轉換為了對應的 ASCII 值

chr(): 将對應的值轉換為字元

取模運算: 将一個數整除另一個數得到的餘數,餘數即模運算的值

# -*- coding: utf-8 -*-

# @Date    : 2018-10-12
# @Author  : Peng Shiyu

class CaesarCipher(object):
    """
    凱撒加密解密
    """

    def __crypt(self, char, key):
        """
        對單個字母加密,偏移
        @param char: {str} 單個字元
        @param key: {num} 偏移量
        @return: {str} 加密後的字元
        """
        if not char.isalpha():
            return char
        else:
            base = "A" if char.isupper() else "a"
            return chr((ord(char) - ord(base) + key) % 26 + ord(base))

    def encrypt(self, char, key):
        """
        對字元加密
        """
        return self.__crypt(char, key)

    def decrypt(self, char, key):
        """
        對字元解密
        """
        return self.__crypt(char, -key)

    def __crypt_text(self, func, text, key):
        """
       對文本加密
       @param char: {str} 文本
       @param key: {num} 偏移量
       @return: {str} 加密後的文本
       """
        lines = []
        for line in text.split("\n"):
            words = []
            for word in line.split(" "):
                chars = []
                for char in word:
                    chars.append(func(char, key))
                words.append("".join(chars))
            lines.append(" ".join(words))
        return "\n".join(lines)

    def encrypt_text(self, text, key):
        """
        對文本加密
        """
        return self.__crypt_text(self.encrypt, text, key)

    def decrypt_text(self, text, key):
        """
        對文本解密
        """
        return self.__crypt_text(self.decrypt, text, key)


if __name__ == '__main__':
    plain = """
    you know? I love you!
    """
    key = 3

    cipher = CaesarCipher()

    # 加密
    print(cipher.encrypt_text(plain, key))
    # brx nqrz? L oryh brx!

    # 解密
    print(cipher.decrypt_text("brx nqrz? L oryh brx!", key))
    # you know? I love you!
      

詳細參考:

Hacking- Python之禅