密码学cryptology

web真你妈难,我还是看看密码学吧

请注意,本文编写于 119 天前,最后修改于 52 天前,其中某些信息可能已经过时。

古典密码

移位密码

凯撒密码

原理:将明文的每一个字符在密码系统所支持字符序列中向右平移N,映射得到新的字符从而实现加密,而解密则相反向左平移N。

例如

原文:moctf

Key(N):3

加密后:prfwi

可转动密码盘外圈进行对照

Caesar-1.png
Caesar-1.png

变形:根据原理密码系统所支持字符序列,密码盘也可以换为ASCII码等

栅栏密码

原理:把要加密的明文分成N个一组,然后把每组的第1个字分别连起来,然后再把每个组按顺序依次连接,形成一段无规律密文。
因此一般密文的个数不是质数,不过也有可能出现如44333这样的分组

例如

BUGKU的一道题目

一只小羊翻过了2个栅栏

KYsd3js2E{a2jda}

根据题目分俩组:KYsd3js2///E{a2jda}

取第一个字母:KE

取第二个字母:Y{

……

取第八个字母:2}

连在一起:KEY{sad23jjdsa2}

若忽略题目的提示,也有可能:

4栏:
K3EjYj{dssaad22}

8栏:
Ks3sEajaYdj2{2d}

看到一个有点好玩的

由于中文用规则的栅栏比较容易破解,所以产生了一些变体,例如道家心法密籍《天仙金丹心法》中的一段加密方法。密文如下:

○ 茫 天 : 摹 然 月 终 为 鼎 半 是 真 灭 器 轮 假 不 但 伸 净 著 定 分 泥 万 ○ 无 ○ 光 人 经 法 一 从 尘 色 返 我 权 自 法 中 妙 大 空 照 生 屈 来 好 路 形 神 海 ○ 便 还 未 归

○ 茫
  天 : 摹
  然 月 终 为
  鼎 半 是 真 灭
  器 轮 假 不 但 伸
  净 著 定 分 泥 万 ○
  无 ○ 光 人 经 法 一 从
  尘 色 返 我 权 自 法 中 妙
  大 空 照 生 屈 来 好 路 形 神
  海 ○ 便 还 未 归

明文(从上向下竖着读):天然鼎器净无尘,大海茫茫月半轮。著色空摹终是假,定光返照便为真。不分人我生还灭,但泥经权屈未伸。万法自来归一法,好从中路妙形神。

ROT5/13/18/47

简单的移位密码

  • ROT5:只对数字进行编码,用当前数字往前数的第5个数字替换当前数字,例如当前为0,编码后变成5,当前为1,编码后变成6,以此类推顺序循环。
  • ROT13:只对字母进行编码,用当前字母往前数的第13个字母替换当前字母,例如当前为A,编码后变成N,当前为B,编码后变成O,以此类推顺序循环。
  • ROT18:这是一个异类,本来没有,它是将ROT5和ROT13组合在一起,为了好称呼,将其命名为ROT18。
  • ROT47:对数字、字母、常用符号进行编码,按照它们的ASCII值进行位置替换,用当前字符ASCII值往前数的第47位对应字符替换当前字符,例如当前为小写字母z,编码后变成大写字母K,当前为数字0,编码后变成符号_。用于ROT47编码的字符其ASCII值范围是33-126,具体可参考ASCII编码。

维吉尼亚加密

维吉尼亚密码由凯撒密码扩展而来,引入了密钥的概念。即根据密钥来决定用哪一行的密表来进行替换,以此来对抗词频统计(详解)。

密码表上面第一行代表明文字母,左面第一列代表密钥字母

维吉尼亚加密-密码表.jpg
维吉尼亚加密-密码表.jpg

加密公式:C = (P + K)%26

  • C:密文
  • P:原文
  • K:第几套加密方式

使用第几套加密方式是通过约定一个规则来确定的,这个规则就是“密钥”。

这样一个密钥字母代表一套加密方式,比如:t代表第19套加密方式,h代表第7套加密方式,i代表第8套加密方式,s代表第18套加密方式。

这样密钥和原文每个字符一一对应,如果密钥长度不足,那么循环替代。

原文hello world
密钥thisthisthi
密文ALTDH EGKSL

杰弗逊转轮加密

我只见过单独出题,比较少见。

可以琢磨一下有没有什么比较骚的出题方式。

BugKu有一道题目托马斯·杰斐逊

1: <ZWAXJGDLUBVIQHKYPNTCRMOSFE <
2: <KPBELNACZDTRXMJQOYHGVSFUWI <
3: <BDMAIZVRNSJUWFHTEQGYXPLOCK <
4: <RPLNDVHGFCUKTEBSXQYIZMJWAO <
5: <IHFRLABEUOTSGJVDKCPMNZQWXY <
6: <AMKGHIWPNYCJBFZDRUSLOQXVET <
7: <GWTHSPYBXIZULVKMRAFDCEONJQ <
8: <NOZUTWDCVRJLXKISEFAPMYGHBQ <
9: <QWATDSRFHENYVUBMCOIKZGJXPL <
10: <WABMCXPLTDSRJQZGOIKFHENYVU <
11: <XPLTDAOIKFZGHENYSRUBMCQWVJ <
12: <TDSWAYXPLVUBOIKZGJRFHENMCQ <
13: <BMCSRFHLTDENQWAOXPYVUIKZGJ <
14: <XPHKZGJTDSENYVUBMLAOIRFCQW <

密钥: 2,5,1,3,6,4,9,7,8,14,10,13,11,12

密文:HCBTSXWCRQGLES

解题步骤:

1.根据密钥进行顺序调整

比如密钥第一个数字为2,那么把2: <KPBELNACZDTRXMJQOYHGVSFUWI<拿出来放在第一行,接着把5:…… 拿出来放在第二行。以此类推:

KPBELNACZDTRXMJQOYHGVSFUWI
IHFRLABEUOTSGJVDKCPMNZQWXY
ZWAXJGDLUBVIQHKYPNTCRMOSFE
BDMAIZVRNSJUWFHTEQGYXPLOCK
AMKGHIWPNYCJBFZDRUSLOQXVET
RPLNDVHGFCUKTEBSXQYIZMJWAO
QWATDSRFHENYVUBMCOIKZGJXPL
GWTHSPYBXIZULVKMRAFDCEONJQ
NOZUTWDCVRJLXKISEFAPMYGHBQ
XPHKZGJTDSENYVUBMLAOIRFCQW
WABMCXPLTDSRJQZGOIKFHENYVU
BMCSRFHLTDENQWAOXPYVUIKZGJ
XPLTDAOIKFZGHENYSRUBMCQWVJ
TDSWAYXPLVUBOIKZGJRFHENMCQ

2.根据密文调整每行字符串(密文:HCBTSXWCRQGLES)

第一个密文为H,找到第一行的H,前面的KPBELNACZDTRXMJQOY为一串字符串,后面的HGVSFUWI为第二串字符串,交换字符串位置,得到HGVSFUWIKPBELNACZDTRXMJQOY。以此类推:

HGVSFUWIKPBELNACZDTRXMJQOY
CPMNZQWXYIHFRLABEUOTSGJVDK
BVIQHKYPNTCRMOSFEZWAXJGDLU
TEQGYXPLOCKBDMAIZVRNSJUWFH
SLOQXVETAMKGHIWPNYCJBFZDRU
XQYIZMJWAORPLNDVHGFCUKTEBS
WATDSRFHENYVUBMCOIKZGJXPLQ
CEONJQGWTHSPYBXIZULVKMRAFD
RJLXKISEFAPMYGHBQNOZUTWDCV
QWXPHKZGJTDSENYVUBMLAOIRFC
GOIKFHENYVUWABMCXPLTDSRJQZ
LTDENQWAOXPYVUIKZGJBMCSRFH
ENYSRUBMCQWVJXPLTDAOIKFZGH
SWAYXPLVUBOIKZGJRFHENMCQTD

3.竖着看

云影密码

云影密码又称为01248密码,使用1248 四个数字,用加法表示出0-9,例如0=28,7=124,9=18,再用1-26来表示A-Z。0用作间隔。

替代密码

培根(倍康尼)密码

培根所用的密码是一种本质上用二进制数设计的,没有用通常的0和1来表示,而是采用a和b来替代。

培根密码加密有两种方式

方式一:

A aaaaaB aaaabC aaabaD aaabbE aabaaF aabab
G aabbaH aabbbI abaaaJ abaabK ababaL ababb
M abbaaN abbabO abbbaP abbbbQ baaaaR baaab
S baabaT baabbU babaaV bababW babbaX babbb
Y bbaaaZ bbaab

方式二:

a AAAAAb AAAABc AAABAd AAABBe AABAAf AABAB
g AABBAh AABBBi-j ABAAAk ABAABl ABABAm ABABB
n ABBAAo ABBABp ABBBAq ABBBBr BAAAAs BAAAB
t BAABAu-v BAABBw BABAAx BABABy BABBAz BABBB

不过我不太理解为啥会有这第二种方式。

变形可以有很多种,例如

  • 明文为bling,加密为:aaaab ababb abaaa abbab aabba,此时再随意找句句子,使用大小写来代替ab。密文如下:good GoOd STuDy day DAy Up hAHa

QWE加密

将键盘上的字母顺序qwertyuiopasdfghjklzxcvbnm和26个字母abcdefg……按顺序一一对应

QWE加密.jpg
QWE加密.jpg

九键

应该也算是替代密码吧

直接举例:

密文:33532141

将密文拆成两个数字一组:33 53 21 41

在拼音九键上找到对应的字母:3键第三个字母(f),5键第三个字母(l),2键第一个字母(a),4键第一个字母(g)。

猪圈密码

猪圈密码(亦称朱高密码、共济会暗号、共济会密码或共济会员密码),是一种以格子为基础的简单替代式密码。即使使用符号,也不会影响密码分析,亦可用在其它替代式的方法。

猪圈密码-密码表.jpg
猪圈密码-密码表.jpg

当铺密码

当铺密码是一种将中文和数字进行转化的密码,算法相当简单:当前汉字有多少笔画出头,就是转化成数字几。

由 1
中 2
人 3
工 4
大 5
王 6
夫 7
井 8
羊 9
田 0

甲子年加密

好像……就见过一次

12345678910
甲子乙丑丙寅丁卯戊辰己巳庚午辛未壬申癸酉
11121314151617181920
甲戌乙亥丙子丁丑戊寅己卯庚辰辛巳壬午癸未
21222324252627282930
甲申乙酉丙戌丁亥戊子己丑庚寅辛卯壬辰癸巳
31323334353637383940
甲午乙未丙申丁酉戊戌己亥庚子辛丑壬寅癸卯
41424344454647484950
甲辰乙巳丙午丁未戊申己酉庚戌辛亥壬子癸丑
51525354555657585960
甲寅乙卯丙辰丁巳戊午己未庚申辛酉壬戌癸亥

盲文

其实做题没遇到过,眼熟一下

盲文对照表.jpg
盲文对照表.jpg

现代密码

编码

摩斯密码

摩尔斯电码(又译为摩斯密码,Morse code)是一种时通时断的信号代码,通过不同的排列顺序来表达不同的英文字母、数字和标点符号。

特点:只用 .(点)-(杠)表示

变形:.- 变成 01 、oO等

Hex

编码原理:
1.将原来8位的二进制字节打断,分成两个4位的,并且在前面加上4个零
2.将新得到的2个二进制转为16进制,得到的新的字符串就是Hex的值

例如:

ASCII码:A (65)
二进制码:0100_0001
重新分组:0000_0100 0000_0001
十六进制: 4 1
Hex编码:41

Base家族

Base64

Base64是一种编码算法,该算法共包含64个字符。包括大小写拉丁字母各26个、数字10个、加号 + 和斜杠 / ,共64个字符。此外还有等号 = 用来作为后缀用途。

Base64编码表.png
Base64编码表.png

算法原理:

  1. 将待转换的字符串每三个字节分为一组,每个字节占8bit,那么共有24个二进制位。
    2.将上面的24个二进制位每6个一组,共分为4组。
    3.在每组前面添加两个0,每组由6个变为8个二进制位,总共32个二进制位,即四个字节。
    4.根据Base64编码表获得对应的值。

例如:"hhh"在Base64编码之后变为:aGho

base64-ex1.png
base64-ex1.png

若是分组后最后一组字节数不足3个,则用0和=补上

Base64-ex2.png
Base64-ex2.png

特点
  • 可能有等号后缀
  • 标准base64只有64个字符(英文大小写字母、数字和+、/)以及用作后缀的等号
  • base64是把3个字节变成4个可打印字符,所以base64编码后的字符串长度一定能被4整除

Base32

原理同Base64,Base32编码表:

Base32编码表.png
Base32编码表.png

特点
  • 可能有等号后缀
  • 由大写字母、数字2-7组成

Base16

原理:Hex编码

特点
  • 只有数字0-9以及大写字母A-F

URL编码

URL编码通常也被称为百分号编码,它的编码方式非常简单:使用%加上[0123456789ABCDEF]中的两位字符,代表一个字节的十六进制形式。
URL编码要做的,就是将每一个非安全的ASCII字符都被替换为“%xx”格式,对于非ASCII字符,RFC文档建议使用utf-8对其进行编码得到相应的字节,然后对每个字节执行百分号编码。

例如:

"中文"使用UTF-8字符集得到的字节为0xE4 0xB8 0xAD 0xE6 0x96 0x87
经过Url编码之后得到%E4%B8%AD%E6%96%87

JSFuck

[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[
]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]][([][(![]+[])[+[]]+([![]]+[][[]
])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+
(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+
!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![
]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]
+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[
+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!!
[]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![
]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[
]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]((![]+[])[+!+[]]+(![
]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]+(!![]+[])[+[]]+(!
[]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])
[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[!+[]+!+[]+[+[]]]+[+!+[]]+(
!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[
])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[!+[]+!+[]+[+[]]])()

这其实是一段代码alert(1),把js代码加密的结果,有点奇葩

原理在这JSFuck GitHub

特点十分鲜明,看到这个扔控制台回车就可以解码

添加新评论

已有 1 条评论

南溟丷 南溟丷

?密码学呢?