Python实现ADFGVX加密结果与维基百科示例不符求助
ADFGVX加密实现结果不符问题排查
你的代码输出与维基百科标准结果不一致,存在3处核心错误:
- 硬编码的双字符替换映射表
keys_dictionary与测试用例使用的初始Polybius方阵完全不匹配。ADFGVX算法第一步的替换结果完全依赖6*6初始方阵,你当前写死的映射关系从根源上就是错的。
维基百科该示例使用的初始方阵行、列标签固定为A/D/F/G/V/X顺序,方阵内容如下:
例如明文字符A D F G V X A N A 1 C 3 H D 8 T B 2 O M F E 5 W R P D G 4 F 6 G 7 I V 9 J 0 K L Q X S U V X Y Z t对应该方阵D行D列,替换结果应为DD,但你现有字典中t映射为GD,第一步输出就和正确值偏离。 - 列换位阶段填充逻辑错误。当前逻辑在第一步输出长度无法被列密钥长度整除时,固定补两个字符
XX,不符合ADFGVX的填充规则:正确逻辑是计算差值,缺几个字符补几个,不需要固定补双字符,也不能写死填充值为XX。 - 缺少输入预处理逻辑。示例明文
attack at 1200am包含的空格会被当前代码静默跳过,虽然不会直接导致该用例报错,但遇到其他特殊字符时会出现无提示的结果错误,加密前应当统一过滤所有非字母、非数字的字符,统一转为大写后再进入加密流程。
修正要点
- 删除硬编码的
keys_dictionary,改为根据初始方阵动态生成字符与双字符编码的映射关系,测试该用例时直接使用上文给出的对应方阵生成映射即可得到正确的第一步替换结果。 - 修改
stage_two加密分支的填充逻辑:计算需要补充的字符数为len(key) - (len(第一步输出) % len(key)),补充对应数量的字符直到总长度能被密钥长度整除即可。 - 在加密流程最开始增加预处理步骤,过滤输入中的无关字符,避免空格、标点等干扰结果。
内容的提问来源于stack exchange,提问作者Mono
相关产品推荐
相关产品推荐

