我们使用二进制数字进行一次性填充,而在学习经典密码时,我们主要使用英语字母。请设计一种直接用于英文字母的一次性记事本。
key是:English letters
message是:English letters
不允许将密钥和消息转换为二进制。
将每个字母的 ASCII 码值与密钥字母的 ASCII 码值相加。
如果结果大于 26,则使用结果对 26 取模。
将结果加上字母 'a' 的 ASCII 码值,以获得新的字符。
对于解密操作,只需要将步骤 1 中的加法改为减法即可。
'c' + 'e' = 99 + 101 = 200
200 % 26 = 9
9 + 97 = 106 = 'j'
可以使用一种叫做替代密码的加密方法。它直接将消息的每个字母替换为密钥中的对应字母,这样就可以将明文转换为密文。例如,如果密钥是"QWERTYUIOPASDFGHJKLZXCVBNM",那么A就替换为Q,B替换为W,以此类推。这种方法仅仅是一种最基本的加密方法,不够安全。比如,我们可以定义一种加密方式,将原始的英文字母移位,以加密消息。
例如:密钥为“ABC”,消息为“HELLO”,加密后的结果为“KHOOR”(每个字母根据密钥移位)。
如果对方要解密,他只需知道密钥,然后将每个加密后的字母再移回原位,就能得到原始的消息。
可以让message和key中的每个字符的ascii码相加得到一个新的ascii码,再转换成字符,这样可以得到加密的结果。
解密则将加密后结果和key中的每个字符的ascii码相减。
打乱密码则随机生成一个长度与message字符串相等的全是字母的key
import random
from string import ascii_letters
def encrypt(message, key):
'''加密原理:将message和key中的每一个字母的ascii码相加得到新值'''
secret_msg = ""
for c1, c2 in zip(message, key):
secret_msg += chr(ord(c1) + ord(c2))
return secret_msg
def decrypt(secret_msg, key):
message = ""
for c1, c2 in zip(secret_msg, key):
message += chr(ord(c1) - ord(c2))
return message
def reset_key(message):
'''由于是一次性密码,所以每次传输数据后需要打乱密码'''
key = ""
for i in range(len(message)):
key += random.choice(ascii_letters)
return key
if __name__ == "__main__":
message = "English letters"
key = "English letters"
e = encrypt(message, key) #加密
print(e)
print(decrypt(e, key)) #解密
"""
输出:
ÜÎØÒæÐ@ØÊèèÊäæ
English letters
"""