《CTF特训营》——古典密码学

本文详细介绍了古典密码学中移位密码和代替密码的各种类型,包括简单移位密码、曲路密码、云影密码、栅栏密码、凯撒密码、ROT13、埃特巴什码、经典单表代替密码、培根密码、仿射密码以及棋盘类密码。通过实例和加密解密的实现,阐述了这些密码的工作原理和攻击方法,对于理解和应用密码学基础知识有极大帮助。
摘要由CSDN通过智能技术生成

目录

一、移位密码

1.简单移位密码

(1)介绍

(2)例子

(3)加密解密的实现

2.曲路密码

3.云影密码

4.栅栏密码

二、代替密码

1.单表代替密码

(1)凯撒密码

①加密解密的实现

②例子

(2)ROT13

①加密解密的实现

(3)埃特巴什码

①加密解密的实现

(4)经典单表代替密码

①加密解密的实现

(5)培根密码

(6)仿射密码

①加密解密的实现

②已知明文的攻击

2.单表代替密码

(1)棋盘类密码

①Playfari加密解密的实现

②Polybuis加密解密的实现(Nihilist原理相同)

3.维吉尼亚密码

4.希尔密码


一、移位密码

1.简单移位密码

(1)介绍

移位密码是密码学中最基础、最简单的一种密码形式,可以理解为明文根据密钥进行了位置的变换的得到的密文。

(2)例子

m = flag{easy_easy_crypto}

k='3124'

当明文为m,密钥为k时,移位密码首先以k的长度切分m,具体如下:

flag  {eas    y_ea   sy_c   rypt   o}

可以看到总共分成了6部分,按照密钥规则3124的顺序对每一部分进行密钥变化,所以密文为:

lafgea{s_eyay_scyprt}o

(3)加密解密的实现

#利用Python实现

#加密

def shift_encrypt(m,k):
    l = len(k)
    c = ""
    for i in range(0,len(m),1):
        tmp_c = [""] * 1
        if i + 1 > len(m):
            tmp_n = m[i:]
        else:
            tmp_m = m[i:i+1]
            for kindex in range(len(tmp_m)):
                tmp_c [int(k[kindex]) - 1] = tmp_m[kindex]
                c += "".join(tmp_c)
                return c

m = "flag{easy_easy_crypto}"
k = '3124'
print shift_encrypt(m,k)


#解密
def shift_encrypt(m,k):
    l = len(k)
    m = ""
    for i in range(0,len(c),1):
        tmp_m = [""] * 1
        if i + 1 > len(c):
            tmp_c = c[i:]
            use = []
            for kindex in range(len(tmp_c)):
                use,append(int(k[kindex]) - 1)
                use,sort()
                for kindex in range(len(tmp_c)):
                    tmp_m[kindex] = tmp_c [use,index(int(k[kindex]) -1 )]
        else:
            tmp_c = c[i:i+1]
            for kindex in range(len(tmp_c)):
                tmp_m [kindex] = tmp_c[int(k[kindex]) - 1]
                m += "".join(tmp_m)
                return m

m = "flag{easy_easy_crypto}"
k = '3124'
print shift_encrypt(c,k)

2.曲路密码

曲路密码也是移位密码的一种,加密原理如下:

 图中的密文就是从g到T,反过来就是解密

3.云影密码

云影密码又称01248密码,仅仅包含01248几个数字,其中0用于分割,其与数字用于加和操作之后转换为明文,解密方式如下:

def c01248_decode(c):
    l = c.split("0")
    origin = "abcdefghijklmnopqrstuvwxyz"
    r = ""
    for i in 1:
        tmp = 0
        for num in i:
            tmp += int(num)
            r += origin [tmp-1]
            return r
        print c01248_decode("884210122048022440414224202480122")

4.栅栏密码

栅栏密码是一种比较特殊的移位密码,密钥只有一个数字k,表示栅栏的长度,所谓的栅栏密码,就是将加密的明文分成k个组,然后取每组的第一个字符依次连接,拼接而成的字符串就是密文

(1)加密解密的实现

#加密

def zhalan_encrypt(m,k):
    chip = []
    for i in range(0,len(m),k):
        if i + k >= len(m):
            tmp_m = m[i]
        else:
            tmp_m = m[i:i+k]
            chip.append(tmp_m)
            c = ""
            for i in range(k):
                for tmp_m in chip:
                    if i < len(tmp_m):
                        c += tmp_m [i]
                        return c
                    m = "flag{zhalan_mima_hahaha}"
                    k =4
                    print zhalan_encrypt(m,k)

#解密
def zhanlan_decrypt(c,k):
    l = len(c)
    partnum = 1 / k
    if 1 % k != 0:
        partnum += 1
        m = [""] * 1
        for i in range(0,1,partnum):
            if i + partnum >= len(c):
                tmp_c = c[i:]
            else:
                tmp_c = c[i:i + partnum]
                for j in  range(len(tmp_c)):
                    m[j * k + i / partnum] = tmp_c[j]
                    return "".join(m)
                c = "f{lm_alzaihhahnmaaga_ah}"
                k = 4
                print zhanlan_decrypt(c,k)

<

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

「已注销」

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值