几种古典密码代码实现

最近在备考软考信息安全工程师,学习到密码学部分,为了记忆更加深刻,将已经掌握并且觉得比较有趣的密码算法用Python来实现,简单记录一下。

古典密码接触到置换密码、代替密码和代数密码三种,其中置换密码相对简单,靠眼睛就可以完成加解密,所以没有必要实现了,代替密码主要有加法密码、乘法密码和仿射密码,仿射密码研究的是Vigenre密码,该密码是16世纪法国密码学家Vigenre使用过的密码,代数密码研究的是Vernam密码,该密码是美国电话电报公司的Gillbert Vernam在1917年为电报通信设计的一种非常方便的密码(我最喜欢这组密码)。

加法密码

# coding:utf-8
# 加法密码实现
# 当前仅支持大写字符串加解密
# 秋风木叶 2019-3-10

# 字符串转单字符列表,再转为数字序列便于计算
def stoc(str):
    ch_list = []
    for i in str:
        ch_list.append(i) 
    return [ord(i)-65 for i in ch_list]

# Int to Chr
# 将数字序列还原成大写字母序列
def itoc(list_int):
    A = [chr(i+65) for i in list_int]
    ch = ""
    for i in A:
        ch += i
    return ch

# 计算密文序列
def Encrypt(Message,k,n):
    print('>>>使用加法密码算法进行加密(k={}, n={})'.format(k,n))
    return itoc([i+k%n for i in stoc(Message)])

# 计算明文序列
def Decrypt(Ciphertext,k,n):
    # 解密方式1:通过构建密码表进行查表解密
    # 解密方式2:通过加密逆运算计算明文
    DecryptionType = 2
    if(DecryptionType == 1):
        print('>>>构建密码表:')
        A = [i for i in range(0,n)]
        print('>>>明文字母表:{}'.format(itoc(A)))
        B = Encrypt(itoc(A),k,n)
        print('>>>密文字母表:{}'.format(B))
        CiphertextTables = dict(zip(B,A))
        print('>>>构建密码表进行查表解密')
        return itoc([CiphertextTables[i] for i in Ciphertext])
    else:
        print('>>>通过加密逆运算进行解密(k的逆元为:{})'.format(-k))
        return itoc([c-k+n %n for c in stoc(Ciphertext)])

if __name__=='__main__':
    # 当前仅支持大写字母串
    A = ('ABCDEF')
    print('输入的明文字符串为:{}'.format(A))
    B = Encrypt(A,7,26)
    print('加密后的密文:{}'.format(B))
    C = Decrypt(B,7,26)
    print('解密后的明文:{}'.format(C))

以上代码的执行结果:

输入的明文字符串为:ABCDEF
>>>使用加法密码算法进行加密(k=7, n=26)
加密后的密文:HIJKLM
>>>通过加密逆运算进行解密(k的逆元为:-7)
解密后的明文&#
  • 8
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值