密码学

古典密码的介绍

一、目录

  • 什么是密码学
  • 凯撒加密
  • 关键词加密
  • 仿射加密
  • 单表替代加密分析
  • 维吉尼亚加密
  • 替换和编码

二、正文

1、什么是密码学

“密码学是一个多面的世界,对一些人来说,它是一个侦探与保密的世界,对另一些人来说,它是数学与计算机的世界。无论你如何看待它,密码学都是神秘而富有冒险色彩的。它还超越了传统的学术学科。它不只是计算机科学的内容,密码学的研究包括历史、政治学、工程、语言军事学、伦理、数学和工业技术学等。”
——《经典密码学与现代密码学》

古典密码和现代密码的区别

**古典密码学:**主要关注信息的保密书写和传递,以及与其相对应的破译方法。

**现代密码学:**不只关注信息保密问题,还同时涉及信息完整性验证、信息发布的不可抵赖性、以及在分布式计算中产生的来源于内部和外部的攻击的所有信息安全问题。

关于CTF中的密码学

CTF 中的古典密码学题目有时也会出现在杂项里面,古典加密常常不给出加密算法,需要判断或者尝试一下。而 CTF 中的现代加密常常会给出加密算法,或者以一些形式提示某种常用的加密算法。即通过公开的加密算法和题目给的条件来思考解密的算法并加以实现。

在有关密码学的一些描述中,常使用Alice和Bob作为两个想要传递消息的两个人,Eve是想要从传递的密文中窃取明文信息的人

image-20210206150715624

例子:

对于一组函数 a=(E,D):

E为加密函数(encryption function) ,密钥 k,明文m,那么密文 c=E(k,m)

D为解密函数(decryption function) ,密钥 k,明文m,那么密文 m=D(k,m)

2、凯撒密码(Caesar cipher)

凯撒加密(Caesar cipher)是一种最简单且最广为人知的加密技术,它属于替代加密,明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文。

image-20210206151234747

凯撒加密会生成一个一一对应的密码表,加密和解密过程都是通过查表完成的。和很多其他的单表替换加密一样,凯撒加密是十分不安全的。可以把移位值看作密钥key,不难想到,在明文空间为26个英文字母时,有效的密钥只有25个。所以很容易枚举出来。

image-20210206151324370

利用Python脚本实现加密:

from string import ascii_uppercase

Plaintext = "输入要加密的密文"
Key =“修改字母移动几位”

Plaintext = Plaintext.upper()
Ciphertext = ""


for i in Plaintext:
    if i not in ascii_uppercase:
        Ciphertext += i
    else:
        Ciphertext += chr(((ord(i)-ord("A")-Key) % 26)+ord("A"))
print(Ciphertext)

利用Python脚本实现解密:

from string import ascii_uppercase

Ciphertext = "输入要解密的密文"

Ciphertext = Ciphertext.upper()

def shift(Key):
    Plaintext = ""
    for i in Ciphertext:
        if i not in ascii_uppercase:
            Plaintext += i
        else:
            Plaintext += chr(((ord(i)-ord("A")-Key) % 26)+ord("A"))
    return Plaintext


for Key in range(26):
    print(shift(Key))  //穷举出26个可能

3、关键词加密

关键词加密(keyword cipher)也是一种单表替代加密,与凯撒加密不同之处在于密钥可以更为复杂,加密时需要选择一个关键词,如果这个关键词有重复的字母,去除除第一次出现之外的所有的相同的字母。例如,如果选定的关键词为“success”,则使用“suce”。
将该关键词写在字母表的下方,并用字母表的其他字母按标准的顺序填写余下的空间。这样就构建了字母一一对应的关系,加密时用下面一行中的字母对应替换上面一行的字母;解密时用上面一行中的字母对应替换下面一行的字母。

例子:

Cipher : agqr{yue_stdcgciup_padas}
Key : angstromcf

前10个字母先用key填充,后面的按上面key没有出现的字母顺序展开。

image-20210206154922441

image-20210206154935330

对照上面的表格各个字母对应的字母,对应解密得到 flag:actf{yum_delicious_salad}

4、仿射密码(Affine Cipher)

在仿射加密中,每个字母都对应一个数字(字母aZ分别对应数字025 ),仿射加密法的密钥为0~25之间的数字对(a,b) , a与26的最大公约数必须为1,即GCD(a,26)=1,这就是说,能整除a和26的数只有1,例如a=2就是不可以的,因为GCD(2,26)=2,a=5就可以,因为只有1能整除5和26。p 为明文字母对应的数字, C为密文字母对应的数字。

  • 解密时需要计算(或枚举)密钥数字对中 a 的逆元,也就是 a 对 26 的模反数。
  • 模反数可以简单理解为整数环中的倒数,a 乘以 a 的模反数对 26 取模等于 1。例如 5 对 26 的逆元就是 21。
  • 所以一个数乘以 a,再乘以 a 的逆元,就能算回原来的数

解密时已知密钥对(a,b) ,以及密文c ,可以通过下面的同余式计算出明文p。

p = a-1(c- b) mod 26

例子:

image-20210206160240553

image-20210206160255300

尽管套了三层,还是可以当作普通的仿射加密进行破解。

由于密钥对(a, b)的两个变量有效的值都是小于26的,所以枚举也是完全可以承受的。得到(a,b)之后就可以正常解密了。

仿射加密本质上也是通过密钥对(a, b)生成了一个密码表,明文和密文中的字母具有一一对应的关系, 且a与模
数26互素保证了不重不漏。所以仿射加密也是一种单表替换加密 ,虽然比前面两种生成密码表的方式复杂一-些 ,但也是顶不住针对单表替换的密码分析的。

(5)、单表替代密码分析

26.25. 24…4.3.2.1= 26! = 403291461126605635584000000.

所以枚举的方式获取字母间的对应关系显然是难以承受的;可以利用不同的英文字母在文段中的出现频率特征,来帮助我们判断某个字母被替换成了某个字母的可能性。

image-20210206160642502

词频分析不仅针对单个字母的出现频率,同时有很多连续的两个字母出现频率较高(双联字母 bigrams),也可以辅助我们进行分析。以下是平均在1000个单词中,各双联字母出现的次数:

image-20210206160700635

另外,如果有一个较大的单词库,还可以通过单词的格式,进一步帮助我们缩小可能的范围,例如单词happy,为12334格式,success为1233411格式,那么被进行单表替换后,它的格式并不会发生改变。
这种模式匹配的优点在于即使密文长度较短,也能尽可能找到接近真相的结果。
参考网站:https://quipqiup.com/

(6)维吉尼亚加密

维吉尼亚密码是使用一系列凯撒密码组成密码字母表的加密算法,属于多表密码。为了生成密码,需要使用表格法。这一表格包括了26行字母表,每一行都由前一行向左偏移一位得到。具体使用哪一行字母表进行编译是基于密钥进行的,在过程中会不断地变换。

加密:

  • 明文:ATTACKATDAWN
  • 选择关键词:LEMON,重复关键词,直到长度和明文相同,作为密钥:LEMONLEMONLE
  • 通过等长的明文和密钥,依次查表得到密文:LXFOPVEFRNHR
  • image-20210206160918247

解密:
解密的过程则与加密相反。例如:根据密钥第一个字母 L 所对应的 L 行字母表,发现密文第一个字母 L 位于 A 列,因而明文第一个字母为 A 。密钥第二个字母 E 对应 E 行字母表,而密文第二个字母 X 位于此行 T 列,因而明文第二个字母为 T。以此类推便可得到明文。

维吉尼亚加密可以避免直接的词频分析攻击,密文在统计上没有明显的规律,但是仍然有方法可以对其进行破解。

首先提出破解方法的 Frederick Kasiski 是基于这样一个简单的观察“密钥的重复部分与明文中的重复部分的连接,在密文中也产生一个重复部分”。

如果一个字符串在明文中重复,并且被密钥相同的部分加密,那么在密文中也会出现重复的字符串。

例子:

image-20210206161015110

关键词 “RUN” 的长度为 3,密文串“KIOV”的间距是 9,密文串 “NU”的间距是 6,这些间距都是关键词长度的倍数,这样重复足够多次,可以帮助我们判断关键词的长度。

一旦确定了关键词的长度,余下的问题就只是如何使用该信息去找到真正的关键词了。关键词的长度揭示了密文可以被如何破解成单码加密的一个集合。
关键词的长度为n,那么破解维吉尼亚加密的问题就变成了解决n个单表加密的问题,需要有足够长的密文,然后通过词频分析逐个解决问题。

(7)替换和编码

古典加密还包括很多种形式的简单替换或编码,这些替换也常常出现杂项中,如摩尔斯电码、福尔摩斯跳舞的小人、敲击码、培根密码……

摩尔斯电码:用一个电键可以敲击出点、划以及中间的停顿。

image-20210206161119213

福尔摩斯跳舞的小人:

image-20210206161132703

敲击码:2,3 表示第2行,第3列,表示H

image-20210206161157341

培根密码:

image-20210206161245276

image-20210206161744109

使用 Python 脚本进制转换:

x = 123456         #十进制整数

x_ hex = hex(x)[2:] #十进制转十六进制

x__bin = bin(x) [2:]   #十进制转二进制

print(x_ hex, x_ _bin)              # 1e240 11110001001000000

a = int(x_ hex,16)                #十六进制转+进制

b = int(x_ bin,2)             #二进制转十进制

print(a, b)                        # 123456 123456

字符串(str)类型和字节(bytes)类型相互转换

s = "flag{this_ is_ flag}"   #字符串类型
s_bytes = s.encode()  #字符串类型转字节类型
s_ str = s_ _bytes. decode() #字节类型转字符串类型
print(s_ bytes, S_ _str)
#b'flag{this_ _is_ flag}' flag{this_ _is_ flag} 

整数和字节类型的转换:

这种类型转换在密码方向题目中很常见,整数类型可以直接参与数学计算,字节类型会展示可读的字符

from Crypto. Util. number import *
s = b'flag{this_ is_ flag}' #字节类型
s_ _int = bytes_ .to_ long(s) #字节类型转为整数
s_ _bytes = long_ _to_ _bytes(s_ int) #整数转为字节类型
print(s_ int, S_ bytes)
# 8922333133093133239960474404255406756030333 b' flag{this_ is_ _flag}'

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值