ADFGVX密码

简介: ADFGVX密码

ADFGVX密码

  • 加密对象:小写字母,0-9
  • 原理:
  • 改密码在加密和解密时需要输入两个东西,一个密码表,一个密钥,密码表时6x6的polybius表格,里面的字符是a-z,0-9打乱顺序的,出去j刚好填满36个格子。其中的横纵坐标是由ADFGX表示的,如密码表为:“xyzdefghijklmnopqrstuvwcba0123456789j”,如下:
A D G F V X
A x y z d e f
D g h i k l m
G n o p q r s
F t u v w c b
V a 0 1 2 3 4
X 5 6 7 8 9
  • 将密文的每个字符查表转为相应的ADGFX字符对,前面是横排,后面是纵列,如字符o查表为GD。
  • 再将刚刚查表后的字符串根据密钥如下排列(假设密钥是linux, 刚刚查表后得到的是VGDDXGDFFGFFGG):
l i n u x
V G D D X
G D F F X
F F G G

  • 再根据密钥字符的ascii码大小对上表的列按从小到大排列
i l n u x
V G D D X
D G F F X
F F F G

  • 最后按列将密文去除,如上表取出为:VDFGGFDFFDFGXX
  • 特点:
  • 密文长度是明文的两倍,即密文是偶数
  • 密文字符仅有ADFGVX这几个字符
  • 代码
# write by 2021/7/19
# ADFGVX密码, 是ADFGVX的加强版,可以加密a-z,0-9的字符串
import re
INDEX_DIC = "ADFGVX"
def judge_table(table):
    if len(table) != 36:
        print("密码表出问题", len(table))
        return 0
    return 1
def sort_key(key):
    key_len = len(key)
    key_lis = re.findall(".", key)
    index_lis = [i for i in range(key_len)]
    # print(key_lis)
    # print(index_lis)
    # 冒泡法
    for i in range(key_len):
        for j in range(key_len-i-1):
            if key_lis[j] > key_lis[j+1]:
                key_lis[j], key_lis[j+1] = key_lis[j+1], key_lis[j]
                index_lis[j], index_lis[j+1] = index_lis[j+1], index_lis[j]
    # print(key_lis)
    # print(index_lis)
    return index_lis
def encrypt_adfgvx(string, table, key):
    if not judge_table(table):
        return -1
    ciphertext = ""
    ciphertext_temp = ""
    for i in string:
        index = table.index(i)
        ciphertext_temp += INDEX_DIC[index // 6] + INDEX_DIC[index % 6]
    ciphertext_lis = re.findall(".{1,"+str(len(key))+"}", ciphertext_temp)
    # print("ciphertext_lis", ciphertext_lis)
    sort_index = sort_key(key)
    for index in sort_index:
        for j in ciphertext_lis:
            try:
                ciphertext += j[index]
            except:
                pass
    # print(ciphertext_temp)
    return ciphertext
def decrypt_adfgvx(string, table, key):
    key_len = len(key)
    string_len = len(string)
    if not judge_table(table):
        return -1
    if string_len % 2 != 0:
        return -1
    plaintext = ""
    plaintext_temp = ""
    plaintext_lis = []
    # 一列最小个数
    min_lin = string_len // key_len
    # 有多少最大个数的列
    max_col = string_len % key_len
    # print(f"m={m}, n={n}")
    index = 0
    # 分组
    sort_index = sort_key(key)
    for i in sort_index:
        if i < max_col:
            plaintext_lis.append(string[index:index+min_lin+1])
            index += min_lin+1
        else:
            plaintext_lis.append(string[index:index+min_lin])
            index += min_lin
    # 还原列顺序
    for i in range(key_len-1):
        for j in range(key_len-i-1):
            if sort_index[j] > sort_index[j+1]:
                sort_index[j], sort_index[j+1] = sort_index[j+1], sort_index[j]
                plaintext_lis[j], plaintext_lis[j+1] = plaintext_lis[j+1], plaintext_lis[j]
    # 合成字符串,并转为横纵坐标
    for i in range(min_lin+1):
        for j in plaintext_lis:
            try:
                plaintext_temp += str(INDEX_DIC.index(j[i]))
            except:
                pass
    # 查表
    plaintext_num_lis = re.findall(".{2}", plaintext_temp)
    for i in plaintext_num_lis:
        plaintext += table[int(i[0])*6 + int(i[1])]
    # print(plaintext_temp)
    return plaintext
if __name__ == '__main__':
    table_ = "abcdefghijklmnopqrstuvwxyz0123456789"
    key_ = "china"
    ciphertext_ = encrypt_adfgvx("linux", table_, key_)
    plaintext_ = decrypt_adfgvx(ciphertext_, table_, key_)
    print(f"{plaintext_}: {ciphertext_}")


目录
相关文章
|
Linux Python
百度搜索:蓝易云【Centos 7系统安装python 3.9.10详细教程。】
现在,你已经成功在CentOS 7系统上安装了Python 3.9.10。你可以使用 `python3.9`命令来运行Python 3.9.10版本的解释器。请根据实际需要进行配置和使用。
565 0
|
存储 分布式计算 大数据
hadoop和spark的区别
学习hadoop已经有很长一段时间了,好像是二三月份的时候朋友给了一个国产Hadoop发行版下载地址,因为还是在学习阶段就下载了一个三节点的学习版玩一下。在研究、学习hadoop的朋友可以去找一下看看
4522 0
|
敏捷开发 监控 容灾
阿里巴巴DevOps实践指南(二十二)| 发布策略
DevOps 追求更短的迭代周期、更高频的发布。但发布的次数越多,引入故障的可能性就越大。更多的故障将会降低服务的可用性,进而影响到客户体验。所以,为了保证服务质量,守好发布这个最后一道关,阿里逐步发展出了适应 DevOps 要求的发布策略。
阿里巴巴DevOps实践指南(二十二)| 发布策略
|
11月前
|
数据采集 Web App开发 监控
深度解析:使用ChromeDriver和webdriver_manager实现无头浏览器爬虫
在现代网络爬虫实践中,动态网页加载和反爬虫机制增加了数据采集的难度。采用无头浏览器技术(如Selenium与ChromeDriver)可有效模拟用户行为、执行JavaScript,获取动态内容。通过设置代理IP、伪装User-Agent和处理Cookies,提升爬虫隐蔽性和稳定性。该方案适用于电商价格监控、社交媒体数据采集和招聘信息抓取等场景,实现更高效的数据获取。
910 2
深度解析:使用ChromeDriver和webdriver_manager实现无头浏览器爬虫
|
人工智能 异构计算 Python
智谱AI数学课代表MathGLM魔搭首发,社区体验推理教程来啦!
GLM家族又发布了一个新成员 数学模型 MathGLM ,以提升大语言模型的数学推理能力。它可以在不使用计算器工具的情况下,高效执行复杂算术运算,解答中文数学应用题,已经在魔搭社区全球首发开源啦!
|
SQL 关系型数据库 MySQL
Liquibase----SQL格式通过update更新MySQL数据库
Liquibase----SQL格式通过update更新MySQL数据库
1237 0
|
SQL 前端开发 JavaScript
前端后端技术栈分类和整体架构
前端后端技术栈分类和整体架构
|
消息中间件 Oracle 关系型数据库
实时计算 Flink版操作报错之连接外部kafka本地执行测试代码报错如何解决
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
|
API 开发工具 Android开发
简述大疆无人机对接
【2月更文挑战第7天】本文介绍了对接大疆无人机的主要目的,包括实时画面获取、飞行数据监测、操控飞行、媒体管理和业务功能开发等,并列举了多种开发接口如MobileSDK、UXSDK、云开发API等。重点讨论了MobileSDK在Android平台的应用,包括SDK集成步骤、直播推流和获取飞机实时数据的细节。另外,UXSDK用于加速应用开发,提供预设UI组件。上云API则简化了无人机与第三方云平台的集成,支持MQTT、HTTPS和WebSocket协议,适用于行业级无人机。对接流程涉及Pilot2和Dock的配置,以及数据传输和业务功能处理。文章还提及了如何对接多个飞机的方法。
11466 0
简述大疆无人机对接
|
Kubernetes NoSQL 数据库
Nomad 系列 - 快速上手
Nomad 系列 - 快速上手

热门文章

最新文章