当前位置: 首页 > article >正文

CTF之密码学(栅栏加密)

栅栏密码是古典密码的一种,其原理是将一组要加密的明文划分为n个一组(n通常根据加密需求确定,且一般不会太大,以保证密码的复杂性和安全性),然后取每个组的第一个字符(有时也涉及取其他位置的字符,但规则需事先约定),根据情况将这些字符重新排列组合成一段无规律的话,形成密文。

栅栏密码的“栏”数,即分组后形成的“列”数或“行”数(具体取决于加密时的排列方式),是栅栏密码的一个重要参数。根据栏数的不同,栅栏密码可以分为多种类型,其中比较常见的是2栏栅栏密码。但理论上,栏数n可以是任何正整数(实际应用中受限于明文的长度和加密的安全性要求)。

加密过程示例

以明文“welcome to ctf”为例,假设采用3栏栅栏密码进行加密:

  1. 去掉空格,得到“welcometoctf”。
  2. 将明文划分为三组(尽量平均):“w e l c”、“o m e t”和“o c t f”。
  3. 按竖列取出字母,得到“woo”、“emc”、“let”和“ctf”。
  4. 将这些字母连在一起,形成密文“woo emc let ctf”。

解密过程示例

对于上述密文“woo emc let ctf”,假设已知是采用3栏栅栏密码进行加密的,解密过程如下:

  1. 将密文划分为三组(根据加密时的栏数和密文长度确定):“w o o”、“e m c”和“l e t c t f”。
  2. 按竖列顺序取字母,重新组合成明文:“welcome to ctf”(注意恢复空格)。

注意事项

  1. 栅栏密码的安全性主要依赖于栏数的选择和明文的长度。栏数越多,密文的规律性越弱,但同时明文的长度也会限制栏数的选择。
  2. 在实际应用中,为了增加密码的复杂性,可以采用变栏数(即不同部分使用不同的栏数进行加密)或与其他加密方法(如替换密码、移位密码等)相结合的方式进行加密。

综上所述,栅栏密码的栏数是一个灵活的参数,可以根据加密需求和安全要求进行选择。

下面是python加密程序

# 栅栏加密
def zhalan(txt,key):
    s = ''
    # 从0开始遍历到key - 1 
    for m in range(key):
        #遍历m后面每个与前面的距离为key的字符
        for n in range(m,len(txt),key):
            s += txt[n]

    return s


if __name__ == '__main__':
    txt = input("请输入明文").strip()

    key = []
    # 计算是文本长度的约数的数字
    for i in range(2,len(txt)):
        if len(txt) % i == 0:
            key.append(i)
    # 遍历每个数字,计算出他们对应的栏数的文本
    for j in key:
        flag = zhalan(txt,j)
        print(f'{j}栏,{flag}')


http://www.kler.cn/a/413438.html

相关文章:

  • 【深度学习|目标跟踪】StrongSort 详解(以及StrongSort++)
  • 实时数据开发 | checkpoints监控和调优
  • windows电脑上安装树莓派操作系统
  • AI 助力开发新篇章:云开发 Copilot 深度体验与技术解析
  • Ubuntu20.04运行msckf_vio
  • GreatSQL 运行时内存太高,超过90%怎么办
  • IntelliJ+SpringBoot项目实战(十六)--在SpringBoot中整合SpringSecurity和JWT(下A)
  • Jenkins流水线 Allure JUnit5 自动化测试
  • vue3项目搭建-4-正式启动项目,git管理
  • 如何寻找适合的HTTP代理IP资源?
  • 13 —— 开发环境调错-source map
  • 本地部署 WireGuard 无需公网 IP 实现异地组网
  • Redis中如何使用lua脚本-即redis与lua的相互调用
  • coqui-ai TTS 初步使用
  • React的基本知识:事件监听器、Props和State的区分、改变state的方法、使用回调函数改变state、使用三元运算符改变state
  • 命令行版 postman 之 post 小工具
  • TDengine 签约深圳综合粒子,赋能粒子研究新突破
  • Spring Boot Web应用开发:安全
  • docker安装使用Elasticsearch,解决启动后无法访问9200问题
  • 基于Java Springboot智慧养老院管理系统
  • 生产环境中,nginx 最多可以代理多少台服务器,这个应该考虑哪些参数 ?怎么计算呢
  • Stable Diffusion初步见解(二)
  • Spring:AOP面向切面编程入门案例
  • 如何提升C/C++的编程能力
  • 临床检验项目指标学习笔记
  • c++小球反弹可视化