playfair加密

Play分值:10
来源: iFurySt 难度:易参与人数:1318人Get Flag:256人答题人数:306人解题通过率:84%
某种加密方式,玩一玩吧 密钥:shiyanb 密文:KQSAMFPAOPMFPA
hint:一律采用竖向加密
Hint: key小写

解:
playfair密码
它在1854到1855年的克里米亚战争和1899年的布尔战争中有广泛应用。但在1915年的一战中被破译了。
用play加密后得到的密文的特点:1将密文两两分成一组,同一组的两个字母不相同2密文长度是偶数
密码表是5X5共25个字母的矩阵(省掉了Z)
加密:
1生成密码表:将密钥竖向写,长度多余5写到第二列,如果密钥中含有相同的字母则后出现的字母被省略,即:写在矩阵中的密钥的所有字母不同
2将明文两两结合在一起,如果结合在一起的两个字母相同,则在中间插入X,即:若明文为MMA,则写成MX MA
如果明文长度为奇数,则在明文尾部加X
3生成密文
如果明文一组的两个数在同行,则在密文中生成的两个字母,依次是这两个明文字母的右端字母
如果明文一组的两个数在同列,则在密文中生成的两个字母,依次是这两个明文字母的下端字母
如果明文一组的两个数在不同行不同列,则在密文中生成的两个字母,依次是以这两个明文字母为顶点生成矩阵的另两个顶点(有两种结果,分别是横向取,纵向取,横向取是取明文字母的同一行,纵向取是取明文字母的同一列,取法会事先约定)
4将得到的密文大写 然后任意几个组合在一起,完成
解密:将3倒过来即可,取左,取上,取另两个对角

这题是playfair,依照百科中playfair的定义,先构造5*5密码表,
s n f m t
h b g o u
i c j p v
y d k q w
a e l r x
这里shiyanb必须以竖列(如果是横向的话待会得不到结果)填充,后面再填充其他没出现过的字符,最后丢弃频率低的z

把密文KQSAMFPAOPMFPA分组
kq sa mf pa op mf pa
按照playfair的解密方法,同行的取左(左右互通),同列的取上(上下互通),不在同行、同列的取所在矩形对角(本题是横向替换),所以得到
dk ay fn ir mo fn ir
也就是dkayfnirmofnir

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是 Playfair 加密的 Python 代码示例: ```python # 定义 Playfair 加密函数 def playfair_encrypt(plain_text, key): # 定义字母表 alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" # 生成加密矩阵 matrix = generate_matrix(key) # 处理明文,将 J 替换为 I plain_text = plain_text.upper().replace("J", "I") # 在明文中添加填充字母,使其长度为偶数 if len(plain_text) % 2 != 0: plain_text += "X" # 逐对加密 cipher_text = "" for i in range(0, len(plain_text), 2): # 获取当前明文对 pair = plain_text[i:i+2] # 获取每个字母在加密矩阵中的位置 pos1 = get_position(pair[0], matrix) pos2 = get_position(pair[1], matrix) # 获取加密后的位置 cipher_pos1, cipher_pos2 = encrypt_positions(pos1, pos2) # 获取加密后的字母 cipher_char1 = matrix[cipher_pos1[0]][cipher_pos1[1]] cipher_char2 = matrix[cipher_pos2[0]][cipher_pos2[1]] # 将加密后的字母添加到密文中 cipher_text += cipher_char1 + cipher_char2 return cipher_text # 定义生成 Playfair 加密矩阵的函数 def generate_matrix(key): # 定义字母表 alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" # 将密钥转换为大写字母,去除重复字母和 J key = key.upper().replace("J", "I") key_filtered = "" for char in key: if char not in key_filtered: key_filtered += char # 将密钥中的字母添加到加密矩阵的第一行 matrix = [list(key_filtered)] # 将字母表中剩余的字母添加到加密矩阵中 for char in alphabet: if char not in key_filtered: matrix.append(char) if len(matrix[-1]) == 5: matrix.append([]) matrix.pop() return matrix # 定义获取字母在加密矩阵中的位置的函数 def get_position(char, matrix): for i in range(len(matrix)): if char in matrix[i]: return (i, matrix[i].index(char)) # 定义加密两个字母在加密矩阵中的位置的函数 def encrypt_positions(pos1, pos2): if pos1[0] == pos2[0]: # 如果两个字母在同一行,则将它们分别加密为同一行中的下一个字母 return ((pos1[0], (pos1[1]+1)%5), (pos2[0], (pos2[1]+1)%5)) elif pos1[1] == pos2[1]: # 如果两个字母在同一列,则将它们分别加密为同一列中的下一个字母 return (((pos1[0]+1)%5, pos1[1]), ((pos2[0]+1)%5, pos2[1])) else: # 如果两个字母不在同一行也不在同一列,则将它们分别加密为同一行中另一个字母 return ((pos1[0], pos2[1]), (pos2[0], pos1[1])) # 示例用法 plain_text = "HELLO WORLD" key = "SECRETKEY" cipher_text = playfair_encrypt(plain_text, key) print(cipher_text) ``` 以上代码实现了 Playfair 加密算法,可以将给定的明文使用指定的密钥加密为密文。其中 `generate_matrix` 函数用于生成加密矩阵,`get_position` 函数用于获取字母在加密矩阵中的位置,`encrypt_positions` 函数用于加密两个字母在加密矩阵中的位置。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值