Python3实现Playfair密码算法加解密
题⽬⼀
密钥矩阵的构造
新建5x5的表格,依次填⼊密钥单词,字母不重复,然后字母a-z⼀次不重复填⼊,注意字母i和字母j占据同⼀个位置,⼀般来说加密的时候明⽂中的j字母都可以替换成字母i。
密⽂两两分组
密⽂:
KXJEY UREBE ZWEHE WRYTU HEYFS
KREHE GOYFI WTTTU OLKSY CAJPO
BOTEI ZONTX BYBWT GONEY CUZWR
GDSON SXBOU YWRHE BAAHY USEDQ
值得注意的是,这⾥每⼀个分组的两字母是不重复的(加密过程会注意这⼀点,不过本题⽬只是解密)。
取⼩写、替换j为i、两两分组的脚本:
ciper = "KXJEYUREBEZWEHEWRYTUHEYFSKREHEGOYFIWTTTUOLKSYCAJPOBOTEIZONTXBYBWTGONEYCUZWRGDSONSXBOUYWRHEBAAHYUSEDQ"
ciper = ciper.lower()
ciper = place('j','i')
cl = [ciper[i:i+2] for i in range(len(ciper)) if i%2 == 0]
结果:
解题过程
使⽤脚本书写针对‘royal new zealand navy’密钥系统的playfair解密算法:
# 寻⼆维列表中指定元素的索引坐标,不存在返回None
# 可扩展到numpy.array或numpy.matrix等⼆位数组、矩阵类型
def find_element(matrix, value):
for row in range(len(matrix)):
if value in matrix[row]:
return (row, matrix[row].index(value))
return None
# 解密密钥矩阵
DecodeKeyMatrix = [
['r', 'o', 'y', 'a', 'l'],
['n', 'e', 'w', 'z', 'd'],
['v', 'b', 'c', 'f', 'g'],
['h', 'i', 'k', 'm', 'p'], # i/j代表同⼀个元素
['q', 's', 't', 'u', 'x']
]
def decode(twoletter_ciper):
global DecodeKeyMatrix
(_1r, _1c) = find_element(DecodeKeyMatrix, twoletter_ciper[0])
(_2r, _2c) = find_element(DecodeKeyMatrix, twoletter_ciper[1])
if _1r == _2r:
return DecodeKeyMatrix[_1r][_1c - 1] + DecodeKeyMatrix[_2r][_2c - 1]
elif _1c == _2c:
return DecodeKeyMatrix[_1r - 1][_1c] + DecodeKeyMatrix[_2r - 1][_2c]
else:
return DecodeKeyMatrix[_1r][_2c] + DecodeKeyMatrix[_2r][_1c]
执⾏主函数:
if __name__ == '__main__':
plaintext = ""
ciper = "KXJEYUREBEZWEHEWRYTUHEYFSKREHEGOYFIWTTTUOLKSYCAJPOBOTEIZONTXBYBWTGONEYCUZWRGDSONSXBOUYWRHEBAAHYUSEDQ" ciper = ciper.lower()
ciper = place('j','i')
cl = [ciper[i:i+2] for i in range(len(ciper)) if i%2 == 0]
for twoletter in cl:
plaintext += decode(twoletter)
print(plaintext)
执⾏结果:
去除占位符X,得到明⽂:pt boat one owe nine lost in action in blackess strait two miles sw meresu co
ce crew of twelve request any information
题⽬⼆
本题是playfair密码算法的加密过程
使⽤密钥矩阵:
python3 numpy教程#加密密钥矩阵
#会⽐解密矩阵多最后⼀⾏(对应第⼀⾏)、最后⼀列(对应第⼀列)的冗余
EncodeKeyMatrix = [
['m','f','h','i','k','m'],
['u','n','o','p','q','u'],
['z','v','w','x','y','z'],
['e','l','a','r','g','e'],
['d','s','t','b','c','d'],
['m','f','h','i','k',None]
]
加密算法:
def encode(twoletter_text):
global EncodeKeyMatrix2
(_1r, _1c) = find_element(EncodeKeyMatrix2, twoletter_text[0])
(_2r, _2c) = find_element(EncodeKeyMatrix2, twoletter_text[1])
if _1r == _2r:
return EncodeKeyMatrix2[_1r][_1c + 1] + EncodeKeyMatrix2[_2r][_2c + 1]
elif _1c == _2c:
return EncodeKeyMatrix2[_1r + 1][_1c] + EncodeKeyMatrix2[_2r + 1][_2c]
else:
return EncodeKeyMatrix2[_1r][_2c] + EncodeKeyMatrix2[_2r][_1c]
还有些⼀个初始化函数init(),来处理明⽂:取⼩写、去除特殊标点符号、末尾补齐(使明⽂长度为偶数)、两两分组;最后⼀个任务是关键点,分组字母不能相同,若是则要在中间差值字母'x'或'q':
def detect(s):
if len(s) == 2 and s[0] == s[1]:
temp = 'x' if s[0] != 'x' else 'q'
return s[0] + temp + s[0]
else:
return s
def init(info):
info = info.lower()
info = re.sub(" |\.|,", "", info)
while True:
flag = 0
info_li = [info[i:i+2] for i in range(len(info)) if i%2 == 0]
_li = map(detect, info_li)
for word in _li:
if len(set(word)) == 3:
flag = 1
break
info = ''.join(_li)
if not flag:
break
info += 'x' if len(info)%2==1 else ''
if info[-2] == 'x':
info[-1] == 'q'
return info
可以看⼀下效果:
现在给see单词中多添加⼀个字母s变成ssee,查看效果:
主函数代码:
ciper = ""
message = "Must see you over Cadogan West.Coming at once."
message = init(message)
mess_li = [message[i:i+2] for i in range(len(message)) if i%2 == 0]
for twoletter in mess_li:
ciper += encode(twoletter)
print(ciper)
加密结果:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论