换位加密
换位加密算法是一种较为简单的加密算法,由明文、密钥得出最后的密文,就是通过密钥对明文进行加密,换个位置。
1.列位移密码
那么密文就是:
qoury inpho Tkool hbxva uwmtd cfseg erjez
替换加密
替换加密法,是一种用一个字符替换另一个字符的加密方法。
1.云影加密
云影密码,他仅包含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,也就是明文了。
针对云隐密码我这里也准备了解密脚本。输入密文即可解密。同时也支持加密。
#!/usr/bin/python
# -*- coding=utf8 -*-
"""
# @Author : pig
# @CreatedTime:2019-11-2423:54:02
# @Description :
这种加密方式仅使用01248这5种数字来进行,其中0用来唯一表示间隔,其他数字用加法和表示替换密文。再使用数字1~26表示字母A~Z。
如:18 = 1+8 = 9 = I,1248 = 1+2+4+8 = 15 = O
特点:密文中仅存在01248,加密对象仅有字母
"""
#python2
def de_code(c):
dic = [chr(i) for i in range(ord("A"), ord("Z") + 1)]
flag = []
c2 = [i for i in c.split("0")]
for i in c2:
c3 = 0
for j in i:
c3 += int(j)
flag.append(dic[c3 - 1])
return flag
def encode(plaintext):
dic = [chr(i) for i in range(ord("A"), ord("Z") + 1)]
m = [i for i in plaintext]
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='884080810882108108821042084010421'
print (de_code(c))
#加密 将AAAA换成需要加密的字符串即可
#print (encode('AAAAAAAA'))
2.当铺密码
当铺密码就是一种将中文和数字进行转化的密码,算法相当简单:当前汉字有多少笔画出头,就是转化成数字几。
例如:
王:该字外面有 6 个出头的位置,所以该汉字对应的数字就是 6;
口:该字外面没有出头的位置,那就是0;
人:该字外面有 3 个出头的位置,所以该汉字对应的数字就是 3;
下面是一段由当铺密码组成的字符:
密文:王夫 井工 夫口 由中人 井中 夫夫 由中大
对应:67 84 70 123 82 77 125
翻译成 ASCII 码:CTF{RM}
这里笔者也给大家分享一些我在网上搜集到的脚本。
dh = '田口由中人工大土士王夫井羊壮'
ds = '00123455567899'
cip = '王夫 井工 夫口 由中人 井中 夫夫 由中大'
s = ''
for i in cip:
if i in dh:
s += ds[dh.index(i)]
else:
s += ' '
print(s)
解密得到的数字看上去像是ascii码。那么我们就再使用ascii码转字符串的脚本。
得到我们最后的答案CTF{RM}
# /usr/bin/env python
#coding:utf-8
def dtoa():
str = "67 84 70 123 82 77 125"
b = ""
for i in str.split(" "):
b += chr(int(i))
print(b)
if __name__ == '__main__':
dtoa()
3.日历密码
这里向大家介绍下日历密码是如何加密的。先给大家说几点日历密码的原则:
(1)1—26代表a—z的26个英文字母;
(2)M,T1,W,T2,F,S1,S2分别代表周一到周日七天(英文首字母代替,1,2为了有别,也人为增加密度);
(3)密钥即密码表以2020年7月份的日历为密码表,我们来加密这个单词:dictionary
接下来我们开始写密文。
第一步,用数字代替明文中的字母,即DlCTlONARY 4 9 3 20 9 15 14 1 18
第二步,写密文。
方法:例如单词首字母D用4代替,则在日历(2020年7月份日历)中找到4号,发现是本月第一个星期六,所以用S11表示;又如第七个字母N用数字14代表,找到14号,发现是本月第二个星期二,用T12代表。
如此类推,得到了我们的密文:
S11 T22 F1 M3 T22 W3 T12 W1 S13
解密的话,我们反推回去就行了。
4.摩斯密码
终于轮到了大名鼎鼎的摩斯密码!它最早是由美国的摩尔斯在1844年发明的,故也被叫做摩尔斯电码。由两种基本信号和不同的间隔时间组成:短促的点信号" .",读(Di);保持一定时间的长信号"—",读(Da)。
摩尔斯电码主要由以下5种它的代码组成:
点(.)
划(-)
每个字符间短的停顿(通常用空格表示停顿)
每个词之间中等的停顿(通常用 / 划分)
以及句子之间长的停顿
-.- . -.-- .. ... -- --- .-. ... . ....- --...
这里解密的话我们使用工具,摩斯电码编码解码,不用脚本了。(绝对不是脚本不好找)
选择翻译界面,输入密文。大家注意去修改成相对应的点,划和间隔符。
点击电码转明文即可得到明文。
5.敲击码
敲击码(Tap code)是一种以非常简单的方式对文本信息进行编码的方法。因该编码对信息通过使用一系列的点击声音来编码而命名,敲击码是基于5×5方格波利比奥斯方阵来实现的,不同点是是用K字母被整合到C中。
敲击码表:
#!shell
1 2 3 4 5
1 A B C/K D E
2 F G H I J
3 L M N O P
4 Q R S T U
5 V W X Y Z
6.埃特巴什码(Atbash Cipher)
Atbash密码是一种替换密码,具有特定的密钥,其中字母表中的字母是颠倒的。
例如,所有的“A”被替换为“Z”,所有的“B”被替换为“Y”,以此类推它最初用于希伯来字母表,但可以用于任何字母表。就像我们在重力作用下看到的那样。
这种密码是由熊斐特博士发现的熊斐特博士为库姆兰《死海古卷》的最初研究者之一,他在《圣经》历史研究方面最有名气的著作是《逾越节的阴谋》。
他运用这种密码来研究别人利用其他方法不能破解的那些经文,这种密码被运用在公元1世纪的艾赛尼/萨多吉/拿撒勒教派的经文中,用以隐藏姓名。
对应关系如下:
ABCDEFGHIJKLMNOPQRSTUVWXYZ
ZYXWVUTSRQPONMLKJIHGFEDCBA
例题:
UOZTRHYYYZZZBBVVPP
这里我们使用CaptfEncoder进行解密
下载链接:
https://github.com/guyoung/CaptfEncoder/releases
参考链接:
https://blog.csdn.net/weixin_43211186/article/details/123705943
如果你还想学习更深度、更专业的技术知识,推荐一波给我们创研中心的CTF竞赛培训班,在线学习+实操,提升更快哦~
原文始发于微信公众号(小草培养创研中心):技术流丨古典密码学梳理及解密脚本(二)
- 左青龙
- 微信扫一扫
- 右白虎
- 微信扫一扫
评论