CTF古典密码:移位密码

article/2025/9/17 0:41:31

CTF古典密码:移位密码

文章目录

  • CTF古典密码:移位密码
    • 前言
    • 简单例子
    • 曲路密码
    • 栅栏密码
    • 云影密码
    • 总结

前言

密码和编码都是加密,但是有着本质区别:那个密码比编码多一个密钥(key)。这里的密码,不是指平常用来登陆奇安信的密码,而是指加密字符串。我们将数据(明文)通过一定规则(秘钥)进行打乱混编(加密)得到字符串(密文),这就是密码的基本流程。密码学中,一般将明文用m表示,将密文用c表示,将秘钥k表示。

移位密码是最简单的密码形式之一,也是最容易理解的密码形式。上述加密基本流程就是针对这种密码形式的最大白话的描述。

简单例子

这里有一个明文“qianxinshequ”,有一个秘钥“4132”,用下面的形式进行书写:

m="qianxinshequ"
k="4132"

当m为qianxinshequ的时候,先按照秘钥长度对其进行分割,已知 len(k)=4 :

qian xins hequ

m被分为了3部分,按照k的数字顺序对每一部分的明文进行移位加密。根据k,每一部分的明文第一位被换到了第四位,第二位被换到了第一位,第三位依旧是第三位,第四位被换到第二位。剩下的两部分,以此类推。

经过变化,m变为:

inaq isnx euqh

合并就变成了密文:

inaqisnxeuqh

一个简单移位密码完成。

曲路密码

将m填入一个表中,按照定向的连贯的顺序进行遍历,对其进行加密,是移位密码的一种。

在这里插入图片描述

此时,k看起来是一个表的形式,但仍然可以用字符串进行表达。因为k就是行列数。如下图所示:修改行列数就可以修改k。

有以下m

m = "qianxinyuanchuang"

k为7行5列,c为:

unihcxnngaaiunayq

加密程序代码:

import recol = 7
row = 5
m = input()
c = ""
temp = []for i in range(col):temp.append([])for index, i in enumerate(m):temp[index % col].append(i)
re_temp = list(reversed(temp))for index, i in enumerate(re_temp):if index % 2 == 0:i = list(reversed(i))c += "".join(i)plaintext = ""
length = len(m)
min_row = length // col       
min_num = col - length % col  temp = []
index = 0for i in range(col):if i < min_num:temp.append(m[index:index+min_row])index += min_rowelse:temp.append(m[index:index+min_row+1])index += min_row + 1print(temp)for index, i in enumerate(temp):if index % 2 == 0:temp[index] = "".join(list(reversed(re.findall(".{1}", temp[index]))))
temp.reverse()for i in range(length):plaintext += temp[i % col][i // col]print(f"{plaintext} : {c}")

在这里插入图片描述

栅栏密码

栅栏密码是一种规则比较特殊的移位密码,他的k是一个数字,用来表示栅栏的长度。其具体加密过程为,将要加密的m分成若干组。每组一共有k个字符。然后取每组第一个字符顺次连接,组成第一个字符串。然后再将第二个字符顺次连接,组成第二个字符串。以此类推,直到所有的m加密完毕。最后将加密后的字符串拼接在一起,便是c。

有以下样例

m = "qianxin"
k = "2"

按照k进行分解

qi an xi n

每组首位相加,以此类推

qaxn ini

合并得出c

c = "qaxnini"

加密程序代码:

m = input()
k = 2c = []
length = len(m)for i in range(k):for j in range(i, length, k):c.append(m[j])print (''.join(c))

在这里插入图片描述

解密程序代码:

from calendar import c
from msvcrt import kbhitc = input()
k = 2
m  = [] 
length = len(c)q, r = divmod(length, k)
n = (q + 1) if r else q 
mid = n * (k - r)for i in range(n - 1):for j in range(i, mid, n):m.append(c[j])for j in range(mid + i, length, n - 1):m.append(c[j])for j in range(n - 1, mid, n):m.append(c[j])print (''.join(m))

在这里插入图片描述

云影密码

云影密码,他仅包含01248五个数字,其中的0用于分割,其余数字用于加和操作之后转换为m。

m只包含字母(不区分大小写),将字母在字母表的排位分解为若干数字(只包含1248这四个数字)之和,然后将这些数字排列在一起便是一个字母的c。若干字母的c之间用0作分割线。

例如

m = "QIANXIN"

加密之后就是

c = "88108101084208880810842"

解密是这样的

881 81 1 842 888 81 842

各组相加

17 9 1 14 24 9 14

对应

Q I A N X I N

连起来就是m

m = "QIANXIN"

加密程序:

mcode = input()
dic = [chr(i) for i in range(ord("A"), ord("Z") + 1)]
m = [i for i in mcode]
tmp = [];flag = []for i in range(len(m)):for j in range(len(dic)):if m[i] == dic[j]:tmp.append(j + 1)for i in tmp:res = ""if i >= 8:res += int(i/8)*"8"if i%8 >=4:res += int(i%8/4)*"4"if i%4 >=2:res += int(i%4/2)*"2"if i%2 >= 1:res += int(i%2/1)*"1"flag.append(res + "0")print ("".join(flag)[:-1])

在这里插入图片描述

解密程序:

c = input () 
c = c.split("0") 
m = ''for i in range(0, len(c)):str = c[i]sum = 0for i in str:sum += int(i)m += chr(sum + 64)print(m)

在这里插入图片描述

总结

古典密码当中的移位密码在ctf比赛当中最主要出现以上三种形式,其中的k有的是固定的,有的是自定义的(需要爆破)。

固定的是云影密码,自定义的是曲路密码和栅栏密码。其中曲路密码的k的爆破主要是针对行列数的改变和遍历方向的不同。而栅栏密码爆破则主要针对的是k的数值不同。

竞赛当中也有一些小技巧可以使用。

比如已知m为flag{…},那么如果在c可以主要寻找flag不同的组合方式。通过四个字母的组合方式去推断k的可能性。


http://chatgpt.dhexx.cn/article/0dlDbGgq.shtml

相关文章

位移密码加密、解密matlab实现

密码学&#xff1a;位移密码加密、解密matlab实现 一、matlab实现&#xff1a;自定义函数 function texttrans_cipher(strText,operation,key) %%% 对明&#xff08;密&#xff09;文采用位移密码进行加&#xff08;解&#xff09;密&#xff1b; %%% 明文&#xff08;密…

初学加密算法之移位密码

移位密码的加密方法很简单&#xff0c;就是将明文按照某种方式进行移位&#xff0c;著名的凯撒密码就是移位密码的一种。 比如‘’i am nine‘’后移3位后的密文就是 l dp qlqh 按照这种思想我设计了一段程序来实现移位加密&#xff1a; #include<stdio.h> #include&l…

【经典密码】移位密码和代换密码的实现

1&#xff0c;移位密码 先读取输入 K&#xff0c;表示移位密码的参数。然后读取输入的一个只含小写字母的字符串。要求你输出该字符串经过 K 位加密之后的加密串&#xff0c;其中串的长度在 100 以内&#xff0c;0<K<25 #include<bits/stdc.h> using namespace st…

信息安全——移位密码算法(C++实现)

信息安全导论课程学习的实验一&#xff0c;移位密码算法C的实现。 移位密码算法是较为简单的算法&#xff0c;只是简单的对明文进行指定位数的移位操作&#xff0c;C语言实现也较为简单&#xff0c;不需要过多赘述。 以下简单介绍了以下移位密码算法的原理&#xff1a; 【原理…

linux常用命令学习总结(超详细)

作为一个程序员&#xff0c;我们在进行项目部署和运维时&#xff0c;经常会用到一些linux命令&#xff0c;可是这些命令老是忘记&#xff0c;每次用到的时候都要去谷歌百度&#xff0c;很是麻烦&#xff01;这不&#xff0c;为了自己使用方便&#xff0c;对常见的linux命令进行…

批处理命令之find 和findstr

find 作用&#xff1a;从文件中收索字符串 格式&#xff1a;find 参数 "字符串" 路径\文件名 参数&#xff1a; /V 显示所有未包含指定字符串的行。 /C 仅显示包含字符串的行数。 /N 显示行号。 /I 搜索字符串时忽略大小写。 /OFF[LINE] 不要跳过具有脱机属性集…

pygame安装教程(python)

1&#xff0c;安装好python。 2&#xff0c;打开cmd 3&#xff0c;输入&#xff1a;pip --version 如果显示未安装pip&#xff0c;那么输入pip。 等待安装完毕。 检查pip是否安装&#xff1a;pip --version 4&#xff0c;输入&#xff1a;pip install pygame 可能会出现这种错…

pygame安装教程(window)

来自一个初学者的疯狂吐槽&#xff0c;最近在学python设计游戏&#xff0c;要安装pygame。这他娘的&#xff0c;安装一个这个&#xff0c;能把刘某人老命要了&#xff0c;各种资源以及资料&#xff0c;各种尝试&#xff0c;各种装不上&#xff0c;各种错误&#xff0c;各种乱七…

Windows Pygame 安装教程 (自己识别版本号并下载)

最近在自学python&#xff0c;准备写个小项目&#xff0c;这个项目需要安装pygame&#xff0c;书中有给出了两个下载链接&#xff1a;https://bitbucket.org/pygame/pygame/downloads/和http://www.lfd.uci.edu/~gohlke/pythonlibs/#pygame。 自己也尝试下载了两个版本可是提示…

Python之pygame安装教程

首先把Python进行安装好。配置两个环境变量: 在系统变量中找到path&#xff0c;加入Python和pip的安装目录。打开cmd&#xff0c;输入Python&#xff0c;检查Python是否配置成功&#xff0c;如跟图1一样说明配置成功。关闭cmd&#xff0c;重新打开&#xff0c;键入pip&#xff…

python-pygame安装教程

网上有很多关于python&#xff0c;pygame的安装教程。大都比较麻烦&#xff0c;下面为大家介绍一种非常简单的安装方法。&#xff08;因为安装大都是新手教程写详细一些&#xff09; python是32位 python是3.6 1 pip配置 安装好python后&#xff0c;配置环境变量。 安装pygame需…

python没有pygame_pygame安装教程全程详解

1、python --version 查看安装的Python版本, pip --version 查看安装的pip版本, 升级pip命令: python -m pip install --upgrade pip 如果已经下载了安装文件就使用:pip install 文件名 如果没有下载就使用:python -m pip install --user 模块名,系统自动下载 2、如果没有…

python安装pygame的命令是什么_Python的pygame安装教程详解

简介 关于Pygame的基本信息&#xff0c;pygame是什么&#xff0c;谁会被Pygame吸引&#xff0c;并且在哪里找到它。 Pygame是被设计用来写游戏的python模块集合&#xff0c;Pygame是在优秀的SDL库之上开发的功能性包。使用python可以导入pygame来开发具有全部特性的游戏和多媒…

Pygame安装教程及基本配置(详细图文)

1、python --version 查看安装的Python版本&#xff0c; pip --version 查看安装的pip版本&#xff0c; 升级pip命令&#xff1a; python -m pip install --upgrade pip 如果已经下载了安装文件就使用&#xff1a;pip install 文件名 如果没有下载就使用&#xff1a;python …

Pygame 安装教程

实验周用 Python 写个小游戏&#xff0c;需要用到 Pygame &#xff0c;记录一下安装过程。 一、下载文件 先去官网下载文件。我选的是 Pygame1.9 版本&#xff0c;因为去图书馆借了本书&#xff0c;是按照 Pygame1.9 版本进行讲解的&#xff0c;如果用 Pygame2.X &#xff0c;…

python安装pygame教程_pygame 安装教程

步骤&#xff1a; 1.去官网下载PyGame 注意&#xff1a;要下载对应版本的包 其中&#xff0c;如果python为以下版本&#xff1a; &#xff08;cp36就是python3.6的意思&#xff09; 2. .exe文件直接安装 .whl文件启动doc命令安装&#xff1a; 在文件所在位置打开doc界面…

pygame安装教程(小白入手)

** pygame安装教程&#xff08;小白入手&#xff09; ** 1.在python官网上下载pygame 官网url 点击pypi 在搜索框输入pygame 点击搜索 点击对应的版本&#xff08;选择第一个&#xff09; 看到对应的图标&#xff0c;点击下载 2.pygame版本的选择 上一步骤点击下载之后…

IDEA 设置背景颜色为黑色

黑夜给了我黑色的眼睛我却用它来寻找光明。既然是黑色的眼睛那就设置一波黑色背景吧。在黑色额背景中寻找光明。 设置步骤&#xff1a; File->Settings->Appearance&Behavior->Appearance 就是如此的简单迅速&#xff0c;黑色诱惑一波。 就很nice&#xff01;&a…

IDEA设置背景颜色(护眼色)

在开发的时候&#xff0c;眼睛一直盯着开发工具难免会眼睛干涩&#xff0c;时间长了造成视力疲劳&#xff1b;绿色又是公认的护眼色&#xff0c;三步将你的IDEA设置为护眼色 看起来是不是舒服了点

设置idea的背景颜色为护眼的绿色

按照图片中的1-6的步骤点击 1.file 2.setting 3.editor 4.color 5.color sheme 6.genneral 7.default text 然后设置背景色 设置完成后的背景色 我的RGB比例是 217 242 208 觉得好用的&#xff0c;可以采纳