文档中部分编码在此软件中都已实现:
https://github.com/Leon406/ToolsFx
➡在线工具地址:
http://www.atoolbox.net/Category.php?Id=27
http://tool.chacuo.net/cryptaes/
PS: 正文中未给出在线工具地址的均可在以上站点和工具中实现加密解码操作
♠摩斯码及其特点:
①用点(.)和划(-)来编码范围0-9、A-Z的字符;
②字母不区分大小写,两个字母之间的空格用斜杠(/)或者三个点(.)或者一个划(-)表示;
③两个单词之间的间隔是七个点(.)。
根据摩斯编码的原理,CTF中也有出现过变种的摩斯编码,比如点(.)和划(-)用数字0和1来表示等此类变种的思路。
🔼在线解密&工具:
http://www.jb51.net/tools/morse.htm
(编码的时候不转换空格)
http://ctf.ssleye.com/morse.html
(编码的时候不转换空格)
http://rumkin.com/tools/cipher/morse.php
(空格用斜杠表示)
例题:BUU(来首歌吧)
♠敲击码及其特点:
敲击码是基于5×5方格波利比奥斯方阵来实现的,不同点是是用K字母被整合到C中。
因此密文的特征为1-5的两位一组的数字,编码的范围是A-Z字母字符集,字母不区分大小写。
🔼在线解密&工具:
http://ctf.ssleye.com/tapcode.html
♠格雷编码及其特点:
由相邻两位数之间只有一个位元改变的二进制数码构成数列集合。
传统的二进位系统例如数字3的表示法为011,要切换为邻近的数字4,也就是100时,装置中的三个位元都得要转换。
因此于未完全转换的过程时装置会经历短暂的,010,001,101,110,111等其中数种状态,也就是代表着2、1、5、6、7,因此此种数字编码方法于邻近数字转换时有比较大的误差可能范围。
格雷码的发明即用来将误差之可能性缩减至最小。
🔼在线解密&工具:
https://zh.planetcalc.com/8648/
♠中文电码及其特点:
密文以4位[0-9]为一组的数字表示,如2435 0766两组数字分别表示汉字中文:"斗哥"。
中文电码,又称中文电报码或中文电报明码,是于电报之中传送中文信息的方法。
它是第一个把汉字化作电子讯号的编码表。其中简体中文电码收录了7085个汉字,繁体中文电码收录了9041个汉字。
🔼在线解密&工具:
http://chinesecommercialcode.net/
♠博多编码及其特点:
wiki:https://zh.wikipedia.org/zh-cn/%E5%8D%9A%E5%A4%9A%E5%BC%8F%E7%94%B5%E6%8A%A5%E6%9C%BA
博多(Baudot)使用了同一组编码分别表示字母集和数字标点符号集,通过两个字符实现字符集之间的切换。
因此,当报文中同时包含了英文字母和数字和符号的时候,必须加入切换字符来表示在不同的集之间的切换。
博多式电报机是这样的一个样子:
发报收报端各一台看上去是钢琴一般的只有5个按键的机器,按键从左到右按字母顺序排列,通过电路两两相连,两边按下键盘时,对方的纸带上会打印出相对应按键的黑点。
当需要打符号的时候,只需要按照编码表上表示切换到符号集(Figures)所代表编码按下对应的按键,此后输出的都会被收报员人工判读为符号或者数字。
当需要恢复到输入字母时,按下编码表上表示字母集(Letters)的按键,此后的内容都会被判读为字母。
🔼在线解密&工具:
https://www.boxentriq.com/code-breaking/baudot-code
♠曼切斯特编码:
通过对数字信号进行编码来表示数据不归零编码、曼切斯特编码、差分曼切斯特编码都是其编码方式
差分曼彻斯特编码是一种使用中位转变来计时的编码方案。
数据通过在数据位开始处加一转变来表示。令牌环局域网就利用差分曼彻斯特编码方案。
在每个时钟周期的中间都有一次电平跳变,这个跳变做同步之用。
在每个时钟周期的起始处:跳变则说明该比特是0,不跳变则说明该比特是1。
差分曼彻斯特编码的优点为:收发双方可以根据编码自带的时钟信号来保持同步,无需专门传递同步信号的线路,因此成本低;缺点是实现技术复杂。
曼彻斯特编码(Manchester Encoding),也叫做相位编码(PE),是一个同步时钟编码技术,被物理层使用来编码一个同步位流的时钟和数据。
曼彻斯特编码被用在以太网媒介系统中。曼彻斯特编码提供一个简单的方式给编码简单的二进制序列而没有长的周期没有转换级别,因而防止时钟同步的丢失,或来自低频率位移在贫乏补偿的模拟链接位错误。
在这个技术下,实际上的二进制数据被传输通过这个电缆,不是作为一个序列的逻辑1或0来发送的(技术上叫做反向不归零制(NRZ))。
相反地,这些位被转换为一个稍微不同的格式,它通过使用直接的二进制编码有很多的优点。
差分曼彻斯特编码,每位中间的跳变仅提供时钟定时,而用每位开始时有无跳变表示"0"或"1",有跳变为"0",无跳变为"1"。
曼彻斯特编码的编码规则是:在信号位中电平从低到高跳变表示1,在信号位中电平从高到低跳变表示0。
这个图就单独的表示曼彻斯特编码的0,1原理图 从低到高就是0,从高到低就是1
crypto之曼彻斯特编码-01图
看曼彻斯特就简单的分成一段一段看他上升还是下降就可以表示出来
而差分曼彻斯特要看他前一个信号的值,比如这图里第一个就是不跳就用1表示,第二个信号从底下升到高处就跳了表示0,第三个也是不跳用1表示,第4个同理也是1,第5个跳了就是0。
而差分的意思应该就是要把一段内拆成两段只看前一段,而后一半是用来同步时钟用的,顺便可以传输下一个数据来表示是否有跳
crypto之曼彻斯特编码-02图
再来看下三种信号的区别
crypto之曼彻斯特编码-03图
在来说下802.3曼彻斯特和标准曼彻斯特的区别,就是编码后的字符的区别。
第一种G. E. Thomas, Andrew S. Tanenbaum1949年提出的,它规定0是由低-高的电平跳变表示,1是高-低的电平跳变。按此规则有:
1、编码0101(即0x5),表示原数据为00;
2、编码1001(0x9)表示10;
3、编码0110(0x6)表示01;
4、编码1010(0xA)表示11。
第二种IEEE 802.4(令牌总线)和低速版的IEEE 802.3(以太网)中规定, 按照这样的说法, 低-高电平跳变表示1, 高-低的电平跳变表示0。
1、编码0101(0x5)表示11;
2、编码1001(0x9)表示01;
3、编码0110(0x6)表示10;
4、编码1010(0xA)表示00;
通用脚本:
# -*- coding: utf-8 -*-
import struct
import math
def long_to_bytes(n):
s = b''
pack = struct.pack
while n > 0:
s = pack('>I', n & 0xffffffff) + s
n = n >> 32
for i in range(len(s)):
if s[i] != b'�00'[0]:
break
else:
s = b'�00'
i = 0
s = s[i:]
return s
# 字节逆序
def byteinvert(str_bin):
ret = ''
for i in range(len(str_bin) // 8):
ret += str_bin[i * 8:i * 8 + 8][::-1]
return ret
# 标准曼彻斯特
def MCST_stand(str_bin):
ret = ''
for i in range(len(str_bin) // 2):
x = str_bin[i * 2:i * 2 + 2]
if x == '01':
ret += '0'
elif x == '10':
ret += '1'
else:
return 'stand manchester decode wrong!'
return ret
# IEEE规范的曼彻斯特
def MCST_IEEE(str_bin):
ret = ''
for i in range(math.ceil(len(str_bin) / 8)):
x = str_bin[i * 2:i * 2 + 2]
if x == '01':
ret += '1'
elif x == '10':
ret += '0'
else:
return 'stand manchester decode wrong!'
return ret
# 差分曼彻斯特
def MCST_diff(str_bin):
ret = ''
for i in range(0, len(str_bin) // 2 - 1):
x1 = str_bin[i * 2:i * 2 + 2]
x2 = str_bin[i * 2 + 2:i * 2 + 4]
if x1 == x2:
ret += '0'
else:
ret += '1'
return ret
if __name__ == "__main__":
# str_hex = '9a9a9a6a9aa9656699a699a566995956996a996aa6a965aa9a6aa596a699665a9aa699655a696569655a9a9a9a595a6965569a59665566955a6965a9596a99aa9a9566a699aa9a969969669aa6969a9559596669'
# # str_bin='0101010101010101'
# str_bin = str(bin(int(str_hex, 16)))[2:]
#
# m1 = MCST_IEEE(str_bin)
# m2 = MCST_stand(str_bin)
# m3 = MCST_diff(str_bin)
# print('nIEEE曼彻斯特:')
# print(m1)
# print(hex(int(m1, 2)))
# print(long_to_bytes(int(m1, 2)))
# print('n 标准曼彻斯特:')
# print(m2)
# print(hex(int(m2, 2)))
# print(long_to_bytes(int(m2, 2)))
# print('n 差分曼彻斯特:')
# print(m3)
# print(hex(int(m3, 2)))
# print(long_to_bytes(int(m3, 2)))
# print('n=============字节逆序=============')
# m1 = byteinvert(m1)
# m2 = byteinvert(m2)
# m3 = byteinvert(m3)
# print('nIEEE曼彻斯特:')
# print(m1)
# print(hex(int(m1, 2)))
# print(long_to_bytes(int(m1, 2)))
# print('n 标准曼彻斯特:')
# print(m2)
# print(hex(int(m2, 2)))
# print(long_to_bytes(int(m2, 2)))
# print('n 差分曼彻斯特:')
# print(m3)
# print(hex(int(m3, 2)))
# print(long_to_bytes(int(m3, 2)))
str_hex = 'AAAAA56A69AA55A95995A569AA95565556' # 已知ID为0x8893CA58
#str_hex = 'AAAAA56A69AA556A965A5999596AA95656' #所求
str_bin = str(bin(int(str_hex, 16)))[2:]
m2 = MCST_diff(str_bin)
print(m2)
print(hex(int(m2, 2)))
print(long_to_bytes(int(m2, 2)))
小结:
https://blog.csdn.net/qq_37717687/article/details/123001530
♣ASCII编码及其特征:
用1个字节的8位数来编码英文字符集,即所有字母数字等英文符号可以用二进制数、十进制、十六进制来表示。
比如大写字母A可分别用二进制数(01000001)、十进制(65)、十六进制(0x41)来表示。** **
♣GBK/GBK2312编码及其特征
用2个字节16比特的16进制数表示来编码中文字符集,其中GBK是GBK2312的扩展字符集编码,包含简体、繁体中文、日语、韩语等。比如斗哥斗对应的GBK和GBK2312为B6B7。
🔼在线解密工具:
http://www.mytju.com/classcode/tools/encode_gb2312.asp
https://www.qqxiuzi.cn/bianma/zifuji.php
♣unicode编码及其特征:
国际标准字符,将全球的各种语言的每个字符定义一个唯一的编码,以满足跨语言、跨平台文本信息的转换,当编码和解码的字符集出现不一致的时候就会出现乱码。
unicode一般有四种表示形式&x [Hex]: The & [Decimal]: The U [Hex]: U0054U0068U0065 U+ [Hex]: U+0054U+0068U+0065
🔼在线解密工具:
http://tool.chinaz.com/tools/unicode.aspx
♣UTF-8及其特征:
utf-8是一种可变长的字符编码,主要是为了节省存储空间,编码长度根据编码的字符集从1个字节到6个字节不等。
🔼在线解密工具:
http://tool.chinaz.com/Tools/UTF-8.aspx
♣URL编码及其特征:
一个字符ascii码的十六进制,然后在前面加上%
🔼在线解密工具:
http://ctf.ssleye.com/url.html
http://tool.chinaz.com/Tools/urlencode.aspx
♣base家族
解密地址:http://ctf.ssleye.com
♣base64及其特征:
密文由64个字符(A-Z,a-z,0-9,+,/)组成,末尾可能会出现1或2个’=’ 最多有2个
♣base32及其特征
密文由32个字符(A-Z,2-7)组成,末尾可能会有‘=’,但最多有6个
♣base16及其特征
密文由16个字符(0-9,A-F)组成
♣base36及其特征
密文由36个字符(0-9,a-z)组成,加密仅支持整数数字,解密仅支持字符串,不支持中文 密文由36个字符(0-9,A-Z)
♣base58及其特征
Base58是用于Bitcoin中使用的一种独特的编码方式,主要用于产生Bitcoin的钱包地址,Base58不使用数字”0”,字母大写”O”,字母大写”I”,和字母小写”l”,以及”+”和”/”符号
♣base62及其特征
密文由62字符(0-9,a-z,A-Z)组成
♣base91及其特征
密文由91个字符(0-9,a-z,A-Z,!#$%&()*+,./:;<=>?@[]^_`{|}~”)组成
♣base100及其特征
emoji 表情码
⏫代码混淆
♣quoted-printable(可打印字符引用编码)
在所有邮件处理的各式各样的编码中,很多编码的目的都是通过编码的手段使得七位字符的邮件协议体系可以传送八位的二进制文件、双字节语言等等。
Quoted-Printable也是这样一些编码中的一个,它的目的也是帮助非ASCII编码的信件传输通过SMTP。
Quoted-Printable编码是字符对应的编码,每个末编码的二进制字符被编码成三个字符,即一个等号和一个十六进制的数字,如‘=AB’。
🔼在线解密工具:
http://www.hiencode.com/quoted.html
♣UUencode及其特征:
一种二进制到文字的编码,将要编码的文件转化为二进制,重新分组进行编码的过程,与base64编码类似。
🔼在线解密工具:
http://www.hiencode.com/uu.html
♣jjencode及其特征:
将JS代码转换成只有符号的字符串
♣aaencode及其特征:
将JS代码转换成常用的网络表情
例如类似如下编码:
゚ω゚ノ= /`m´)ノ ~┻━┻ //*´∇`*/ ['_']; o=
♣ppencode及其特征:
把Perl代码转换成只有英文字母的字符串
♣rrencode及其特征:
把ruby代码全部转换成符号
♣jsfuck及其特征:
用6 个字符 ( ) [ ] !+ 来对JavaScript进行编码
JSFuck - Write any JavaScript with 6 Characters: []()!+
♣jother及其特征:
密文为8个字符! + ( ) [ ] { }
♣brainfuck及其特征:
密文由+.<>[]’ && ‘!.?或者’+-.<>[]’等组成
例题:buu-神秘龙卷风,
♣OOK及其特征:
所有明文转换成Ook.?!
♥栅栏密码及其特征:
栅栏密码是一种移动字符位置的加密方法,加密前后的字符数不变。
栅栏密码的加密方式:把文本按照一定的字数分成多个组,取每组第一个字连起来得到密文1,再取每组第二个字连起来得到密文2……最后把密文1、密文2……连成整段密文
def enFence(string, space): # 解密
s = ""
for i in range(0, space):
for j in range(i, len(string), space):
# 不能越界
if j < len(string):
s += string[j]
print(s)
def deFence(string, space): # 加密
s = ""
if len(string) % space == 0:
key = len(string) // space
else:
key = len(string) // space + 1
# 小于间隔继续
for i in range(0, key):
for j in range(i, len(string), key):
# 不能越界
if j < len(string):
s += string[j]
print(s)
from math import sqrt
def factoring(n):
'''对大数进行因数分解'''
if not isinstance(n, int):
print ('You must give me an integer')
return
#开始分解,把所有因数都添加到result列表中
result = []
for p in primes:
while n!=1:
if n%p == 0:
n = n/p
result.append(p)
else:
break
else:
result = map(str, result)
result = '*'.join(result)
return result
#考虑参数本身就是素数的情况
if not result:
return n
maxData = 10000
#小于maxData的所有素数
primes = [ p for p in range(2, maxData) if 0 not in
[ p% d for d in range(2, int(sqrt(p))+1)] ]
m = input("请输入栅栏密码:")
len_m = len(m)
print(len_m, '=', factoring(len_m))
try:
o = input("支持输入不只一个数字,但要用空格分开,例:X Y Z n 每组字母数字:")
o = o.split(' ')
for each in o:
print('每组字母数:', each)
enFence(m, int(each))
except:
print('错误!', '输入密文位数为', len_m)
🔼在线解密工具:
https://www.qqxiuzi.cn/bianma/zhalanmima.php
♥W型栅栏及其特征:
W型栅栏密码加密的方法中,明文由上至下顺序写上,当到达最低部时,再回头向上,一直重复直至整篇明文写完为止。
此例子中,其包含了三栏及一段明文:‘WEAREDISCOVEREDFLEEATONCE’。如下:
W . . . E . . . C . . . R . . . L . . . T . . . E
. E . R . D . S . O . E . E . F . E . A . O . C .
. . A . . . I . . . V . . . D . . . E . . . N . .
按行读取后的密文:
WECRLTEERDSOEEFEAOCAIVDEN
W型的加密密钥就不只能是字符串长度的因子,小于其长度的任何一个数都可能是其key值,所以第一步也是确定密钥。
♥Rabbit编码及其特征:
AES、DES、RC4、Rabbit、Triple DES(3DES) 这些算法都可以引入密钥,密文特征与Base64类似,明显区别是秘文里+比较多,并且经常出现
且Rabbit开头部分通常为U2FsdGVkX1
在线解密:http://www.jsons.cn/rabbitencrypt/
♥曲路密码(Curve Cipher)及其特征:
曲路密码(Curve Cipher)是一种换位密码,需要事先约定填充的行列数(也就是曲路路径)
♥列移位密码(Columnar Transposition Cipher)
列移位密码(Columnar Transposition Cipher)是一种比较简单,易于实现的换位密码,通过一个简单的规则将明文打乱混合成密文。
以明文 The quick brown fox jumps over the lazy dog,密钥 how are u为例:填入5行7列表(事先约定填充的行列数,如果明文不能填充完表格可以约定使用某个字母进行填充)
密钥:how are u 按how are u在字母表中的出现的先后顺序进行编号,我们就有a为1,e为2,h为3,o为4,r为5,u为6,w为7,所以先写出a列,其次e列,以此类推写出的结果便是密文:
密文:qoury inpho Tkool hbxva uwmtd cfseg erjez howareu 3471526
🔼在线解密工具:
http://www.practicalcryptography.com/ciphers/classical-era/columnar-transposition/
♥埃特巴什码(Atbash Cipher)
埃特巴什码(Atbash Cipher)是一种以字母倒序排列作为特殊密钥的替换加密 对应关系如下:ABCDEFGHIJKLMNOPQRSTUVWXYZ ZYXWVUTSRQPONMLKJIHGFEDCBA
🔼在线解密工具:
http://www.practicalcryptography.com/ciphers/classical-era/atbash-cipher/
♥凯撒密码(Caesar Cipher)
明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文。
凯撒密码最早由古罗马军事统帅盖乌斯·尤利乌斯·凯撒在军队中用来传递加密信息,故称凯撒密码。
此为一种位移加密手段,只对26个(大小写)字母进行位移加密,规则相当简单,容易被破解。
下面是明文字母表移回3位的对比:
明文字母表 X Y Z A B C D E F G H I J K L M N O P Q R S T U V W
密文字母表 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 然后A变成D,B变成E,Z变成C。
字母最多可移动25位(按字母表)。通常为向后移动,如果您想向前移动1位,则相当于向后移动25位,位移选择为25位。
#!/usr/bin/env python3
# _*_ coding: utf-8 _*_
import re
import time
__author__ = '0HB'
def encryption(Emessage, key):
change = []
message = list(Emessage.lower())
for letter in message:
if letter >= 'a' and letter <= 'z':
letter = chr((ord(letter) - ord('a') + 26 - key) % 26 + ord('a'))
change.append(letter)
else:
change.append(letter)
continue
return ''.join(change)
"""
def search_key(mabeyMessage, words):
result = []
n = 0
result = re.split(' |,|.|!|?', mabeyMessage)
for em in result:
if em in words.split():
n = n + 1
return n
"""
if __name__ == '__main__':
Emessage = input('请输入凯撒密文:')
words = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
pipei = []
for K in range(0, 26):
start = time.perf_counter()
"""
for i in range(1, 27):
pipei.append(search_key(encryption(Emessage, i), words))
if pipei[i - 1] > max:
max = pipei[i - 1]
K = i
"""
end = time.perf_counter()
print('位移', K, '明文:', encryption(Emessage, K))
"""
# 加密用法
m1 = 'what can I do for you?'
e1 = encryption(m1, 3)
print('加密后:', e1)
"""
♥ROT5/13/18/47
1)ROT5:
只对数字进行编码,用当前数字往前数的第5个数字替换当前数字,例如当前为0,编码后变成5,当前为1,编码后变成6,以此类推顺序循环。
2)ROT13:
只对字母进行编码,用当前字母往前数的第13个字母替换当前字母,例如当前为A,编码后变成N,当前为B,编码后变成O,以此类推顺序循环。
3)ROT18:
这是一个异类,本来没有,它是将ROT5和ROT13组合在一起,为了好称呼,将其命名为ROT18。
4)ROT47:
对数字、字母、常用符号进行编码,按照它们的ASCII值进行位置替换,用当前字符ASCII值往前数的第47位对应字符替换当前字符,例如当前为小写字母z,编码后变成大写字母K,当前为数字0,编码后变成符号_。
用于ROT47编码的字符其ASCII值范围是33-126,
🔼在线解密工具:
http://www.qqxiuzi.cn/bianma/ROT5-13-18-47.php
♥猪圈密码(Pigpen Cipher)
传统对照表
♥猪圈密码其他变种1
♥猪圈密码其他变种2
♥埃及文字
♥宝可梦图腾
♥精灵语
♥盲文
对应的盲文表:
题目:BUU(假如给我三天光明)以小写提交;
♥外星人
♥音乐密码
♥键盘密码(Keyboard Cipher)
利用键盘的特性制作的密码,常见有计算机的键盘和手机的键盘,加密的方式有坐标法和顺序法。
坐标法:
Y轴:
1 QWE RTY UIOP 2 ASD FGH JKL 3 ZXC VBN M
X轴:
12345678910
eg:
密文:2251914161 对应明文:story
顺序法:
Q W E R T Y U I O P 1 2 3 4 5 6 7 8 9 10 A S D F G H J K L 11 12 13 14 15 16 17 18 19 Z X C V B N M 20 21 22 23 24 25 26
密文:125947 对应明文:story
♥键盘密码(Qwerty)
键盘密码应该不算是一种加密算法,但是一种有趣的设置密码方式。他就是a-z(A-Z)对应成键盘上的字母,把键盘字母一行一行的对应即可。
letter = {
'q': 'a', 'w': 'b', 'e': 'c', 'r': 'd', 't': 'e', 'y': 'f', 'u': 'g',
'i': 'h', 'o': 'i', 'p': 'j', 'a': 'k', 's': 'l', 'd': 'm', 'f': 'n',
'g': 'o', 'h': 'p', 'j': 'q', 'k': 'r', 'l': 's', 'z': 't',
'x': 'u', 'c': 'v', 'v': 'w', 'b': 'x', 'n': 'y', 'm': 'z',
'Q': 'A', 'W': 'B', 'E': 'C', 'R': 'D', 'T': 'E', 'Y': 'F', 'U': 'G',
'I': 'H', 'O': 'I', 'P': 'J', 'A': 'K', 'S': 'L', 'D': 'M', 'F': 'N',
'G': 'O', 'H': 'P', 'J': 'Q', 'K': 'R', 'L': 'S', 'Z': 'T',
'X': 'U', 'C': 'V', 'V': 'W', 'B': 'X', 'N': 'Y', 'M': 'Z',
}
def qwerty(letters):
flag = ''
for i in range(0, len(letters)):
flag = flag + letter.get(letters[i])
print(flag)
♥键盘密码·QWE包围
解密方式:每组密文所围住的按键上的字符
例: yujnbg, 观察键盘发现这六个字母围住了h,故明文为h。
手机九宫格键盘密码
特征:密文用数字0-9表示a-z的字符集,字母不区分大小写
密文:21222331323341424351525361626371727381828391929394
21 数字2所在键位一次->a 22 数字2所在键位两次->b ... 42 数字4所在键位两次->h ....
明文:abcdefghijklmnopqrtuvwxyz
cipher = input('请输入键盘密码(数字或英文):')
base = " qwertyuiop"
a = [" ", " ", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"]
dict_zm = {1: 'q', 2: 'w', 3: 'e', 4: 'r', 5: 't', 6: 'y', 7: 'u', 8: 'i', 9: 'o', 0: 'p'}
b = []
if ''.join(cipher.split(' ')).isdigit(): # 是数字时
cipher = cipher.split(' ')
for each in cipher:
b.append(dict_zm[int(each[0])]*len(each))
cipher = ' '.join(b)
for part in cipher.split(" "):
s = base.index(part[0])
count = len(part)
print(a
展开收缩[count-1], end="")
♥维吉尼亚密码(Vigenère Cipher)
维吉尼亚密码(Vigenère Cipher)是在单一恺撒密码的基础上扩展出多表代换密码,根据密钥(当密钥长度小于明文长度时可以循环使用)来决定用哪一行的密表来进行替换,以此来对抗字频统计
明文第一个字母是“I”,密钥第一个字母是“o”,在表格中找到“I”列与“o”行相交点,字母“W”就是密文第一个字母;
同理,“v”列与“k”行交点字母是“F”;“e”列与“o”行交点字母是“S”…… 维吉尼亚密码只对字母进行加密,不区分大小写,若文本中出现非字母字符会原样保留。
**如果输入多行文本,每行是单独加密的。
🔼在线解密工具:
http://planetcalc.com/2468/(已知密匙)**
**http://rumkin.com/tools/cipher/gronsfeld.php(未知密匙)
♥曼彻斯特编码
IEEE形式的,每四位取1 3 位就可以得到原本的Data 得到data后对其二进制进行处理
♥希尔密码(Hill Cipher)
希尔密码(Hill Cipher)是基于线性代数多重代换密码,由Lester S. Hill在1929年发明。
每个字母转换成26进制数字:A=0, B=1, C=2…Z=25一串字母当成n维向量,跟一个n×n的矩阵相乘,再将得出的结果MOD26。
♥波利比奥斯方阵密码(Polybius Square Cipher)
波利比奥斯方阵密码(Polybius Square Cipher或称波利比奥斯棋盘)是棋盘密码的一种,是利用波利比奥斯方阵进行加密的密码方式。
简单的来说就是把字母排列好,用坐标(行列)的形式表现出来。字母是密文,明文便是字母的坐标。
假设明文序列为 attack at once ,使用一套秘密混杂的字母表填满波利比奥斯方阵,如下
- i 和 j视为同一格
- 选择这五个字母,是因为它们译成摩斯密码时不容易混淆,可以降低传输错误的机率
根据上面的Polybius方阵将对应的明文进行加密。其中,A,D,F,G,X也可以用数字1,2,3,4,5来代替,这样密文就成了:
♥夏多密码(曲折加密)
夏多密码是作者麦克斯韦·格兰特在中篇小说《死亡之链》塑造夏多这一英雄人物中所自创的密码
♥培根密码(Baconian Cipher)
培根密码(Baconian Cipher)是一种替换密码,每个明文字母被一个由5字符组成的序列替换。
最初的加密方式就是由’A’和’B’组成序列替换明文(所以你当然也可以用别的字母),比如字母’D’替换成”aaabb”。
def 培根密码_解密():
培根密码_字典_大写 = {
'A':"AAAAA","AAAAA":'A',
'B':"AAAAB",'AAAAB':'B',
'C':"AAABA",'AAABA':'C',
'D':"AAABB",'AAABB':'D',
'E':"AABAA",'AABAA':'E',
'F':"AABAB",'AABAB':'F',
'G':'AABBA','AABBA':'G',
'H':"AABBB",'AABBB':"H",
'I':"ABAAA",'ABAAA':'I',
'J':"ABAAB",'ABAAB':'J',
'K':"ABABA",'ABABA':'K',
'L':"ABABB",'ABABB':'L',
'M':"ABBAA",'ABBAA':'M',
'N':"ABBAB",'ABBAB':'N',
'O':"ABBBA",'ABBBA':'O',
'P':"ABBBB",'ABBBB':'P',
'Q':'BAAAA','BAAAA':'Q',
'R':'BAAAB','BAAAB':'R',
'S':'BAABA','BAABA':'S',
'T':'BAABB','BAABB':'T',
'U':'BABAA','BABAA':'U',
'V':'BABAB','BABAB':'V',
'W':"BABBA",'BABBA':'W',
'X':'BABBB','BABBB':'X',
'Y':'BBAAA','BBAAA':'Y',
'Z':'BBAAB','BBAAB':'Z'
}
密文 = input("请输入密文:")
list = []
while True:
list.append(密文[0:5])
密文 = 密文.replace(密文[0:5],'',1)
if 密文 == '':
break
结果 = []
for i in list:
结果.append(培根密码_字典_大写[i])
print("培根密码解密后:","".join(结果).lower())
培根密码_解密()
♥ADFGX和ADFGVX密码(ADFG/VX Cipher)
ADFGX密码(ADFGX Cipher)是结合了改良过的Polybius方格替代密码与单行换位密码的矩阵加密密码。
使用了5个合理的密文字母:A,D,F,G,X,这些字母之所以这样选择是因为当转译成摩尔斯电码(ADFGX密码是德国军队在一战发明使用的密码)不易混淆,目的是尽可能减少转译过程的操作错误。
🔼在线解密工具:
http://www.practicalcryptography.com/ciphers/adfgx-cipher/
♥双密码(Bifid Cipher)
双密码(Bifid Cipher)结合了波利比奥斯方阵换位密码,并采用分级实现扩散,这里的“双”是指用2个密钥进行加密。
双密码是由法国Felix Delastelle发明,除此之外Felix Delastelle还发明了三分密码(Trifid Cipher),四方密码(Four-Square Cipher)。
还有一个两方密码(Two-Square)与四方密码类似,共轭矩阵双密码(Conjugated Matrix Bifid Cipher)也是双密码的变种。
🔼在线解密工具:
http://www.practicalcryptography.com/ciphers/adfgx-cipher/
♥元音密码
元音密码是一种将字母代換为数字的加密方法,是一种利用音标中的元音进行加密的密码。
密码的原理是英文中有26个字母,其中有5个元音字母,分别是A、E、I、O、U。把这5个字母,按照顺序分别标注数字,A对应1,E对应2,I对应3,O对应4,U对应5。
元音的数字对应完了,下面到辅音字母。
对照表:
链接:
CTF-bugku-crypto-[Math&English]-元音密码_bugku{yuanyinpwd}-CSDN博客
举例:
下面就可以对信息进行加密了, 比如明文是:
When in Rome,do as the Romans do.(入乡随俗)
根据密码表加密为(注意,数字之间加点):
52.23.2.35.3.35.43.4.34.2.13.4.1.44.45.2.43.4.34.1.35.44.13.4
♥六十甲子、天干地支
天干
地支
甲子
例题(BUUCTF-传统知识+古典密码):
小明某天收到封密信,信中写了几个不同的年份:
辛卯,癸巳,丙戌,辛未,庚辰,癸酉,己卯,癸巳。信的背面还写有“+甲子”,请解出这段密文。
key值:CTF{XXX}
根据上述天干地支可得到数字编码:28 30 23 8 17 10 16 30 因为提示有说明家甲子,一甲子为60。
故所有数值加60得到:88 90 83 68 77 70 76 90
通过ascii码转换后得到字符串,在进行密码猜解(后续为栅栏、凯撒加密,此处不做多余解析)
♥条形码
宽度不等的多个黑条和空白,按照一定的编码规则排列,用以表达一组信息的图形标识符。
🔼在线解密工具:
https://online-barcode-reader.inliteresearch.com/
♥二维码
用某种特定几何图形按一定规律在平面分步的黑白相间的图形记录数据符号信息。
堆叠式 / 行排式二维码:Code 16 k、Code 49、PDF417
矩阵式二维码:QR CODE
🔼在线解密工具:
https://online-barcode-reader.inliteresearch.com/
🔼二维码修复:
https://www.cnblogs.com/luogi/articles/15469106.html
♦当铺密码
密文由[0-9]数字组成(以当前汉字有多少笔画出头,就是转化成对应的数字)
密文:0123456789 原文:口由中人工大王夫井羊 ** ****
🔼在线解密工具:
http://www.zjslove.com/3.decode/dangpu/index.html
♦核心价值观编码
密文特征为社会主义核心价值观的关键字
🔼在线解密工具:
http://ctf.ssleye.com/cvencode.html
github:
https://github.com/sym233/core-values-encoder
http://hi.pcmoe.net/buddha.html
♦与佛论禅(佛曰)
密文以”佛曰:如是我闻:”开头,密文一般是与关佛经的汉字
🔼在线解密工具:
http://www.keyfc.net/bbs/tools/tudoucode.aspx
github:
https://github.com/takuron/talk-with-buddha
♦兽音
兽音特点: 通过音译动物叫声类似:嗷呜~ 等特征
🔼解密网站:
https://roar.iiilab.com/ http://hi.pcmoe.net/roar.html
♦熊曰
类似于佛曰。
🔼加解密网站:
http://hi.pcmoe.net/index.html
♦颜文
类似于熊曰,主要未独特的颜文字表情符号体
🔼加解密网站:
http://hi.pcmoe.net/index.html
看在作者辛苦整理的份上给个👍好不啦~
原文始发于微信公众号(OneTS安全团队):CTF必会-古典密码与常见编码大全(全网最全)
- 左青龙
- 微信扫一扫
- 右白虎
- 微信扫一扫
评论