Easy Crypto 专题总结

古典密码:

1.1概念:

古典密码是密码学中的其中一个类型,其大部分加密方式都是利用【置换式密码】或【代换式密码】,有时则是两者的混合。虽然其历史中经常使用,但现代已经很少使用,大部分的已经不再使用了。

1.2古典密码的分类:

古典密码主要分为两大类:

1.2.1 置换式密码

置换:根据一定的规则对原文进行重新排列,像洗牌一样。

1.2.2代换式密码

代换:使用一个一一映射代换表(即只能一对一,不能一对多或者多对一)建立一个替换规则。例如下表:

常见的代换式密码:凯撒密码维吉尼亚密码等等。

接下来会主要介绍一下这几种常见的古典密码。

1.3常见古典密码介绍:

单表代换密码

1.3.1 凯撒密码(Caeser)

在历史上,由于凯撒曾经使用这种密码与其将军们来联系,所以用凯撒来命名这种密码。

根据图片来了解加密原理。凯撒密码一般适用于26个英文字母。根据偏移量来进行加密。如图所示,当偏移量=3。即是A-D,B-E。

python代码如下:

加密:

string = input("Enter a string\n")
string= str.upper(string)
for x in string:
    if(x==' '):
        print(' ',end='')
    elif(ord(x)-ord('A')+3 >= 26 ):
        print(chr(ord(x)-26+3), end='')
    else:
        print (chr(ord(x)+3), end='')

解密:

string = input('Enter Decode text: ')
string = str.upper(string)
 
for x in string:
    if(x==' '):
        print(' ',end='')
    elif(ord(x)-ord('A')-3<0):
        print(chr(ord(x)-3+26), end='')
    else:
        print(chr(ord(x)-3), end='')

1.3.2 仿射密码

数学公式为:

 而在放射密码的求解中需要求解逆元。

python代码如下:

'''
仿射密码
m = 52
字符集为小写和大写字母
'''
import string
def encrypt(k1,k2,message):
    dic = string.ascii_letters
    c = []
    for i in message:
        if i.islower():
            num = ord(i)-ord('a')
            c.append(dic[(num*k1+k2)%52])
        elif i.isupper():
            num = ord(i)-ord('A')+26
            c.append(dic[(num*k1+k2)%52])
        else:
            c.append(i)
    print(''.join(c))

def decrypt(k1,k2,message):
    for i in range(52):
        if k1*i%52==1:
            inv = i
            break
    dic = string.ascii_letters
    m = []
    for i in message:
        if i.islower():
            num = ord(i)-ord('a')
            m.append(dic[inv*(num-k2)%52])
        elif i.isupper():
            num = ord(i)-ord('A')+26
            m.append(dic[inv*(num-k2)%52])
        else:
            m.append(i)
    print(''.join(m))

message = 'gVEXGT iDIT' #待加密或解密的消息
a = 5 # key的范围0~51之间
b = 29 # key的范围0~51之间
# encrypt(a,b,message)
decrypt(a,b,message)

真题:Buuctf 小学生的密码学

在线解密网站:http://www.atoolbox.net/Tool.php?

1.3.3 四方密码

介绍:

四方密码是一种对称式加密法,由法国人Felix Delastelle(1840年–1902年)发明。

这种方法将字母两个一组,然后采用多字母替换密码。 [1] 

四方密码用4个5×5的矩阵来加密。每个矩阵都有25个字母(通常会取消Q或将I,J视作同一样,或改进为6×6的矩阵,加入10个数字)。

例子:

选两个密钥,example和keyword。去掉重复的字母。就是example变成exampl。余下的字母顺序存入矩阵即可

加密矩阵放右上和左下。

加密步骤。把字符串按两个字母一组分开

Helloworld

He ll ow or ld

找第一组第一个字母在左上角矩阵的位置:

找第一组第二个字母在右下角矩阵的位置:

先找和一个字母同横的,和第二个字母同直的

第一个字母同直,第二个字母同横的

得到he加密后为FY

如此可得接下来,最后就是

he lp me ob iw an ke no bi

FY GM KY HO BX MF KK KI MD

真题:Buuctf 四面八方

在线解密网站:http://ctf.ssleye.com/four.htm

1.3.4 培根密码

培根密码直接根据表中的字母进行转换。

密文一般只含有a和b字母

真题:攻防世界crypto新手-不仅仅是morse

在线解密网站:https://tool.bugku.com/peigen/

图表

1.3.5 标准银河字母

标准银河字母(Standard Galactic Alphabet)出自游戏《指挥官基恩》系列。是系列中使用的书写系统。这是一个简单的替代暗号,用不同的符号取代拉丁字母。SGA可以在不同的语言中使用,比如在游戏《Minecraft》,《指挥官基恩》中。

对于该类密码,只需要对照图表进行翻译即可:

1.3.6 圣堂武士密码:

圣堂武士密码(Templar Cipher)是共济会的“猪圈密码”的一个变种,一直被共济会圣殿骑士用。

直接根据图片上的直接翻译出字母即可:

1.3.7 猪圈密码:

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

直接图片替换字母即可


真题:Buuctf 萌萌哒的八戒   ​​​​​​​[MRCTF2020]古典密码知多少

1.3.8 当铺密码:

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

王:该字外面有 6 个出头的位置,所以该汉字对应的数字就是 6;

口:该字外面没有出头的位置,那就是0;

人:该字外面有 3 个出头的位置,所以该汉字对应的数字就是 3;

以此类推 ....

下面是一段由当铺密码组成的字符:

密文:王夫 井工 夫口 由中人 井中 夫夫 由中大

对应:67 84 70 123 82 77 125

1.3.9跳舞的小人

这个密码在《福尔摩斯探案全集》里出现过,当时是利用字频分析破解该密码,具体加密如下图:

1.3.10希尔密码

希尔密码(Hill Cipher)是运用基本矩阵论原理的替换密码,由Lester S. Hill在1929年发明。每个字母当作26进制数字:A=0, B=1, C=2... 一串字母当成n维向量,跟一个n×n的矩阵相乘,再将得出的结果MOD26。

在线解密网站:http://www.atoolbox.net/Tool.php?

python代码如下:

import numpy as np
m = 'YOURPINNOISFOURONETWOSIX'  #明文
a = np.matrix([[11,2,19],[5,23,25],[20,7,17]])  #密钥LCTFXZUHR
num_m = []
temp = []
count = 1
for i in m:  #将明文分为三个一组
    temp.append(ord(i)-ord('A'))
    if count % 3 == 0:
        num_m.append(temp)
        temp = []
    count += 1
mat_m = [np.matrix(i).T for i in num_m]  #将明文分组转换为向量形式
mat_c = [a * i % 26 for i in mat_m]  #得到密文分组的向量形式
num_c = []
temp = []
for i in mat_c:  #将密文向量转换为列表形式,且合并到一个列表
    temp = i.tolist()
    for j in range(3):
        num_c.append(temp[j][0])
c = [chr(i+ord('A')) for i in num_c]
print(''.join(c))  #连接成字符串,输出密文

未待完续。。。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值