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的可能性。

CTF古典密码:移位密码相关推荐

  1. 古典密码学--移位密码

    首先了解密码学的基本目的是使得两个在不安全的信道中通信的人,通常称为Alice和Bob,以一种使他们的敌手Oscar不能明白和理解通信内容的方式进行通信. 定义 一个密码体制是满足以下条件的五元组(P ...

  2. 移位密码(凯撒密码)

    一.移位密码(凯撒密码) 移位密码是一种简单的加密方法,它通过将明文中的每个字符按照一定规则向左或向右移动若干位来生成密文.移位密码通常使用偏移量来确定每个字符移动的位数. 二.加密解密 1. 移位加 ...

  3. ctf古典密码从0到1

    本文共计6357个词 阅读预计花费8分钟 1.古典密码和现代密码的区别: 2.代换密码 a)单表代换密码 i.字符或数学型 1.凯撒密码 2.仿射密码 3.四方密码 4.培根密码 ii.图表 1.标准 ...

  4. 古典密码算法(移位密码算法、维吉尼亚算法)

    古典密码算法(凯撒.维吉尼亚) A. 1-1.移位密码算法 [实验目的] 1) 学习移位密码的原理 2) 学习移密码的实现 [实验原理] 算法原理 a) 移位密码就是对26个字母进行移位操作,可以移动 ...

  5. 古典密码----仿射密码加解密

    理论部分 仿射密码是移位密码的一个推广,其加密过程不仅包含移位操作,而且使用了乘法运算.与移位密码相同,仿射密码的明文空间M和密文空间C均为Z26,因此,在使用仿射密码体制对英文消息进行加密之前,需要 ...

  6. python中字符移位加密_1.1 移位密码加密解密python实现

    例题1.1 移位密码加密解密 1.1.使用穷尽密钥搜索法破译如下利用移位密码加密的密文: ESPESTCOPIPCNTDPYPPODACZRCLXXTYR. 1.1答案: K=11,明文序列为: th ...

  7. CTF中Crypty(密码类)入门必看

    常见编码 ASCII编码 ASCII码大致可以分为三部分组成: 第一部分是:ASCII非打印控制字符 第二部分是:ASCII打印字符: 第三部分是:扩展ASCII打印字符. 在线ASCII码与进制互相 ...

  8. 关于移位密码的破解问题

    先来看一道例题: 截获使用移位密码加密的密文如下: BEEAKFYDJXUQYHYJIQRYHTYJIQFBQDUYJIIKFUHCQD 试分析对应的明文 求解思路: 考虑明文有逻辑意思的情况下,其实 ...

  9. 简单移位密码——凯撒加密、解密算法

    简单移位密码--凯撒加密.解密算法 移位密码是简单的替换密码(simple substitution cipher),即将明文的一个字符用相应的一个密文字符替换. 算法描述:设P=C=K=Z26,对k ...

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

    1,移位密码 先读取输入 K,表示移位密码的参数.然后读取输入的一个只含小写字母的字符串.要求你输出该字符串经过 K 位加密之后的加密串,其中串的长度在 100 以内,0<=K<=25 # ...

最新文章

  1. 公路建厂最短路径问题
  2. u-boot分析之启动简介(一)
  3. Daily Report 2012/11/09 陈伯雄(step 9)
  4. 2010年11月编程语言排行榜:手机里的代码
  5. 关于工业级RS485串口服务器的组网方式详解
  6. Tomcat9 安装与配置
  7. 3.5 Java经典垃圾收集器介绍
  8. 智能门锁与网关:海康萤石智能门锁的网关分析(二)
  9. 洛谷 P1005 矩阵取数游戏
  10. 修改Office 2016安装路径的方法
  11. 1024我的Java上车日记(二)
  12. 零基础学php rar,php实现rar文件的读取和解压
  13. Cesium中如何获取鼠标单击位置的经纬度
  14. 《推荐系统实践》 第四章 利用用户标签数据 读书笔记
  15. JavaScript数组的push()等方法的使用
  16. 基于Tcl脚本生成Vivado工程及编译
  17. PLC高精度定时器(T法测速功能块)
  18. 真假4K电视检测:一张图足矣
  19. 升级gradle版本报错
  20. Android APPT2 报异常处理

热门文章

  1. FCPX插件 画笔记号标注工具 Pixel Film Studios PROPEN v1.0.3激活版
  2. 合成器基础(三) - 减法合成器的工作原理
  3. 使用pgAdmin 4来修改PostgreSQL中的用户密码
  4. itextpdf使用总结
  5. html酷狗客户端音乐官网代码表,仿酷狗html5手机音乐播放器主要部分代码
  6. 统计学计算机app,统计学计算器
  7. linux ping 某个端口,linux 怎么ping 端口
  8. 微信小程序开发工具基本介绍入门级(备忘)
  9. 逐步揭示makop.mkp勒索病毒中毒防范恢复解密
  10. iTunes C# Mobile Device API代码-立哥开发