1.4 ADFGX

a)简介
第一次世界大战:德军采用由A、D、F、G、X五个字母拼成全新密码加密的电报。属于置换替代技术密码类型,ADFGVX密码是德军在第一次世界大战中使用的栏块密码。事实上,它是早先一种密码 ADFGX 的增补版。1918年3月Fritz Nebel上校发明了这种密码,并提倡使用。它结合了改良过的Polybius方格替代密码与单行换位密码。这个密码以使用于密文当中六个字母 A, D, F, G, V, X命名。ADFGVX 是被法国陆军中尉 Georges Painvin 所破解的。
b)算法流程
第一步:将字母表中字母组成5×5矩阵,字母i和j被认为是同一个字母,矩阵的行和列用字母A,D,F,G,X标记,矩阵可能是
在这里插入图片描述

每一明文字母用它所在行和列的标记代替,如s变成了FA,z变成了DG
第二步:选择一个关键字,比如Rhein,用关键字字母来标记矩阵的列,将步一的结果组成矩阵:
第三步:重新调整列,使列的标记按字母表的顺序排列
按列读字母可得密文
解密:从关键字长度和密文长度可确定列长度,字母被放置到列中,重新排序可以与关键字匹配,然后用初始矩阵恢复明文

c)算法实现
加密:

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
由于ADFGX密码涉及到多个步骤,代码的长度比较长,下面是一个简单的ADFGX加密解密程序的Python代码: ```python import string # 定义ADFGX表格 ADFGX = ['A', 'D', 'F', 'G', 'X'] key = 'GERMAN' table = [['' for i in range(5)] for j in range(5)] for i, k in enumerate(key): table[i // 5][i % 5] = k letters = string.ascii_uppercase.replace('J', '') for l in letters: if l not in key: table[len(key) // 5][len(key) % 5] = l len(key) += 1 # 定义加密函数 def encrypt(message): message = message.upper().replace('J', 'I') cipher = '' for m in message: row, col = divmod(table.index([x for x in table if m in x])[0], 5) cipher += ADFGX[row] + ADFGX[col] return cipher # 定义解密函数 def decrypt(cipher): message = '' for i in range(0, len(cipher), 2): row = ADFGX.index(cipher[i]) col = ADFGX.index(cipher[i+1]) message += table[row][col] return message # 测试加密解密函数 message = 'ATTACKATDAWN' cipher = encrypt(message) print(cipher) print(decrypt(cipher)) ``` 在这个代码中,我们首先定义了一个5x5的ADFGX表格,并使用GERMAN作为密钥填充表格。然后定义了encrypt和decrypt两个函数来进行加密和解密操作。在加密函数中,我们首先将明文转换为大写字母,并将所有的J替换为I。然后对于每个字母,我们找到它在表格中的位置,并使用该位置的行和列来替换为ADFGX表格中对应的字母。最后返回加密后的密文。在解密函数中,我们首先对密文进行分组,并使用每个组的第一和第二个字母来确定在表格中的位置。然后使用该位置的字母来还原明文。最后我们测试了加密解密函数,确保它们能够正常工作。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值