凱撒密碼
原理:
通過把字母移動一定的位數來實作加解密
明文中的所有字母從字母表向後(或向前)按照一個固定步長進行偏移後被替換成密文。
例如:
當步長為3時,A被替換成D,B被替換成E,依此類推,X替換成A。
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5SN0MjN5ATNhRmN3Y2YyYWYwQzY0MWMzAjYhNmYmRGOj9CX5d2bs92Yl1iclB3bsVmdlR2LcNWaw9CXt92Yu4GZjlGbh5yYjV3Lc9CX6MHc0RHaiojIsJye.png)
在密碼學中,用于解決複雜問題的步驟,稱為一種算法
加密算法: 從明文到密文的過程
解密算法: 從密文到明文的過程
二者合稱為密碼算法。
密碼算法+密鑰構成了資料加密和解密
對稱加密: 在加密和解密的過程中使用相同密鑰的算法,例如:凱撒密碼
非對稱密碼(公鑰加密算法):加密和解密使用不同密鑰的算法,例如:RSA
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之禅