%26是确保加密后的值仍然在字母表范围内(当然为了能解密,前提条件是原文的字符也不能超过这26个字母)
为什么要%26呢?直接用原文的Unicode值加三再转换成字符不就可以了吗? ---
凯撒密码应该是很古老的加密技术吧,那时候计算机都还没出现,ASCII码或者你说的unicode码更不存在。所以说表示字符的就那么26个。当然你说我可以创造一些字符啊,那也没问题,和直接用数字也没多少区别。但有可能保持这26个字母更能起到混淆视听的作用,毕竟它们可能不能一眼看出是密码。
不管在古代还是现代,增加字库都是有成本的,比如雕刻活字、设计字体等,能复用现有字体的话,打印传播密文的成本就大大降低。
# codinng=utf-8
x = 'a b c d e f g h i j k l m n o p q r s t u v w x y z'.split(' ')
y = 'n o p q r s t u v w x y z a b c d e f g h i j k l m'.split(' ')
X = map(lambda x: x.upper(), x)
Y = map(lambda x: x.upper(), y)
dict_kaisa = dict(zip(x + X, y + Y)) # 创建一个字典, 键为原字符串, 值为加密字符串
# 定义凯撒加密函数, 输入字符串, 输出凯撒加密后字符串
def kaisa(string):
result = []
for i in range(len(string)):
if string[i] in dict_kaisa.keys():
result.append(dict_kaisa[string[i]])
else:
result.append(string[i])
return ''.join(result)
print(kaisa('The Zen of Python')) # 结果为Gur Mra bs Clguba
凯撒密码是对字母表整体进行偏移的一种变换加密。因此,建立一个字母表,对明文中每个字母,在这个字母表中偏移固定的长度即可得到对应的密文字母。
最基本的实现如下:
def caesarcipher(s: str,rot: int=3) -str:
_ = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
encode = ''
i = 0
for c in s:
try:
encode += _[(_.index(c.upper()) + rot) % len(_)]
except (Exception,) as e:
encode += c
return encode
print(caesarcipher('hellow'))
print(caesarcipher('KHOORZ', -3))
如果要求解密后保持大小写,那么,字母表_还需要包含所有小写字母并且index时不对c做upper处理.
同样的,也可以在字母表中追加数字,各种符号,空格等.
python中凯撒密码num=num+key是一种替换加密的技术,明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文。根据查询相关公开信息,凯撒密码是古罗马凯撒大帝用来对军事情报进行加密的算法,它采用了替代方法将信息中的每一个英文字母循环替换为字母表序列中该字符后面的第k个字符(k为密钥)。加密方法:C=(P+k)mod26,P为原文字符,k为密钥,解密方法:P=(C-3)mod26。