古典密码,且属于单表加密
凯撒密码又称恺撒变换、变换加密,凯撒是当时罗马共和时期恺撒的名字命名的,当年恺撒曾用此方法与其将军们进行联系。(当然只限于26个字母的加密解密)
我觉得叫带有’变换’俩字的好,因为这个算法就是将信息移动替换的过程。
凯撒密码是对单个字母加密,因此加密的时候会采用循环加密
解释
将26个字母按照横排顺序排好,然后密钥就是将26个字母向右移动的位数,这里的移动位数遵循模运算,比如原本的26个字母表中z右移一位就变成了a,原本的26个字母表中a左移一位就变成了z。
算法就是加上加密算法和一些自己定义的细节比如全部大写或者全部小写,追求精益求精的还可以记住用户输入的内容的大小写然后根据他的内容进行加密。
下面的代码就是不管用户是否大小写,最后出来的结果我全部转为大写了。
最主要的步骤还是将其移动后的字母的数字要模26,因为凯撒的明文空间就是26个,密文空间也是26个。所以key即使你写得再大,最后在加密步骤中模26后仍旧回到26个信息空间。
下面代码最重要一步就是 (ord(ch.upper()) - ord(‘A’) + int(key)) % p
先让字母转为凯撒明文空间中的对应数字,然后再加上密钥移动位数再模26.
# 加密
message=input('请输入加密内容')
p = 26
key = input('请输入密钥')
# 首先将所有信息转化为大写字母, 非字母的不进入存储
for ch in message:
# 这里的\单纯只是将代码换行,因为太长了
if ord('A') <= ord(ch) <= ord('Z') \
or ord('a') <= ord(ch) <= ord('z'):
temp_num = (ord(ch.upper()) - ord('A') + int(key)) % p
cipher.append(temp_num)
#首先打印其Cipher数字
print(cipher)
#将其ASCII数字转化为大写字母
message=''
for i in cipher: # 将列表转化为字符串输出
message += chr(i + ord('A'))
#打印输出密文
print(message)
cipher=input('请输入明文')
p = 26
key = input('请输入密钥') #密钥必须与你加密的密钥相同
# 解码
p = 26
#存放解密密文的数字
deCipher = []
for ch in cipher:
if ord('A') <= ord(ch) <= ord('Z') or ord('a') <= ord(ch) <= ord('z'):
temp = (ord(ch.upper()) - int(key) - ord('A')) % p
deCipher.append(temp)
# 输出
message = ''
for i in deCipher:
message += chr(i + ord('A')) #转为ASCII输出
#输出明文
print(message)