ADFGX密码

简介: ADFGX密码

ADFGX密码

  • 加密对象:小写字母
  • 原理:
  • 改密码在加密和解密时需要输入两个东西,一个密码表,一个密钥,密码表时5x5的polybius表格,里面的字符是a-z(i和j看作同一个)打乱顺序的,出去j刚好填满25个格子。其中的横纵坐标是由ADFGX表示的,如密码表为:“xyzdefghijklmnopqrstuvwcba”,如下:


A
D G F X
A x y z d e
D f g h i k
G l m n o p
F q r s t u
X v w c b z


  • 将密文的每个字符查表转为相应的ADGFX字符对,前面是横排,后面是纵列,如字符o查表为GF。
  • 再将刚刚查表后的字符串根据密钥如下排列(假设密钥是linux, 刚刚查表后得到的是FXDDXGDFFGFFGG):

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

  • 最后按列将密文去除,如上表取出为:XDFFGFDFFDFGXX
  • 特点:
  • 密文长度是明文的两倍,即密文是偶数
  • 密文字符仅有ADFGX这几个字符
  • 代码
# write by 2021/7/19
# ADFGX密码
import re
INDEX_DIC = "ADFGX"
def judge_table(table):
    if len(table) != 25:
        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_adfgx(string, table, key):
    if not judge_table(table):
        return -1
    ciphertext = ""
    ciphertext_temp = ""
    for i in string.replace("j", "i"):
        index = table.index(i)
        ciphertext_temp += INDEX_DIC[index // 5] + INDEX_DIC[index % 5]
    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_adfgx(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])*5 + int(i[1])]
    # print(plaintext_temp)
    return plaintext
if __name__ == '__main__':
    table_ = "phqgmeaynofdxkrcvszwbutil"
    key_ = "china"
    ciphertext_ = encrypt_adfgx("njntysecu", table_, key_)
    plaintext_ = decrypt_adfgx(ciphertext_, table_, key_)
    print(f"{plaintext_}: {ciphertext_}")


目录
相关文章
|
1月前
|
人工智能 数据可视化 安全
Dify入门系列(1)| Dify 是什么?真能开启低代码 AI 应用开发?
Dify 是一个融合 BaaS 与 LLMOps 的开源平台,通过可视化编排、预置组件与企业级引擎,帮助企业快速、安全、低成本地构建 AI 应用。无论是客服机器人还是复杂业务流程,Dify 都能将开发周期从数周缩短至分钟级,推动低代码 AI 开发进入实用阶段。
|
数据安全/隐私保护 C++ 计算机视觉
Qt(C++)开发一款图片防盗用水印制作小工具
文本水印是一种常用的防盗用手段,可以将文本信息嵌入到图片、视频等文件中,用于识别和证明文件的版权归属。在数字化和网络化的时代,大量的原创作品容易被不法分子盗用或侵犯版权,因此加入文本水印成为了保护原创作品和维护知识产权的必要手段。 通常情况下,文本水印可以包含版权声明、制作者姓名、日期、网址等信息,以帮助识别文件的来源和版权归属。同时,为了增强防盗用效果,文本水印通常会采用字体、颜色、角度等多种组合方式,使得水印难以被删除或篡改,有效地降低了盗用意愿和风险。 开发人员可以使用图像处理技术和编程语言实现文本水印的功能,例如使用Qt的QPainter类进行文本绘制操作,将文本信息嵌入到图片中,
422 1
Qt(C++)开发一款图片防盗用水印制作小工具
|
10月前
|
中间件 Go API
Go语言中几种流行的Web框架,如Beego、Gin和Echo,分析了它们的特点、性能及适用场景,并讨论了如何根据项目需求、性能要求、团队经验和社区支持等因素选择最合适的框架
本文概述了Go语言中几种流行的Web框架,如Beego、Gin和Echo,分析了它们的特点、性能及适用场景,并讨论了如何根据项目需求、性能要求、团队经验和社区支持等因素选择最合适的框架。
1034 1
|
安全 网络安全 数据安全/隐私保护
BUUCTF:Misc 解析(八)
BUUCTF:Misc 解析(八)
|
人工智能 架构师 搜索推荐
AI Agent【项目实战】:MetaGPT遇上元编程,重塑复杂多智能体协作的边界
【7月更文挑战第4天】AI Agent【项目实战】:MetaGPT遇上元编程,重塑复杂多智能体协作的边界
AI Agent【项目实战】:MetaGPT遇上元编程,重塑复杂多智能体协作的边界
|
11月前
|
数据库
sqlmap过滤连续空格的方法(一)
sqlmap过滤连续空格的方法(一)
|
11月前
|
SQL 安全 前端开发
文件上传漏洞(二)中国菜刀
文件上传漏洞(二)中国菜刀
|
安全 PHP
攻防世界-file_include(convert.iconv的使用)
攻防世界-file_include(convert.iconv的使用)
431 0
|
Linux 网络安全 开发者
【Python】已解决:WARNING: pip is configured with locations that require TLS/SSL, however the ssl module i
【Python】已解决:WARNING: pip is configured with locations that require TLS/SSL, however the ssl module i
4246 3