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))
#以防止移位后超出26个字母的范围,我们知道英文总共有26个字母,
#X 是第23个(下标从0开始),如果往后移3为就变成26了,超出了字母表的范围,
#这时候如果 23+3对26取模得到0,刚好是字母表中的第0个字母A
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 = input("请输入:")
key = 3
cipher = CaesarCipher()
# 加密
print(cipher.encrypt_text(plain, key))
# lqirupdwlrq vhfxulwb!
# 解密
print(cipher.decrypt_text(plain, key))
记录一下自己入门密码学接触的第一个密码算法。