Python实现信息安全简单加密算法

Python实现单表替代密码(凯撒)密码和矩阵换位密码

1、替代密码
替代密码算法的原理是使用替代法进行加密,就是对明文中的字符用其他字符替代后形成密文。例如,明文字母 a, b, c, d, 用 d, e, f , g 做对应替换后形成密文。
2、置换密码
置换密码算法的原理是不改变明文字符,只将字符在明文中的排列顺序改变,从而实现明文信息的加密。置换密码也叫换位密码。

具体实现代码如下:

import math
class Ciper:
    """
    凯撒密码和矩阵换位密码
    by xk
    """


    def caesar_coder(self):
        """
        凯撒密码加密函数
        """
        self.plaintext = input("请输入明文:")
        self.key = int(input("请输入密钥:"))
        self.ciphertext = ''
        # ord()和chr()函数分别用来将字符转换为ASCII码和将ASCII码转为字符
        for alp in self.plaintext:
            if ord(alp) + self.key > ord('z'):
                self.ciphertext = self.ciphertext + chr(ord('a') - 1 + (ord(alp) + self.key) % ord('z'))
            else:
                self.ciphertext = self.ciphertext + chr(ord(alp) + self.key)

        print("凯撒密码密文为:",self.ciphertext)

        return 0

    def caesar_decoder(self):
        """
        凯撒密码解密函数
        """
        self.plaintext = ''
        self.ciphertext = input("请输入密文:")
        self.key = int(input("请输入密钥:"))
        for alp in self.ciphertext:
            if ord(alp) - self.key < ord('a'):
                self.plaintext = self.plaintext + chr(ord('z') + 1 - (self.key - (ord(alp)-ord('a'))))
            else:
                self.plaintext = self.plaintext + chr(ord(alp) - self.key)
                #roeuha
        print("解码明文为:",self.plaintext)
        return 0



    def matrix_coder(self):
        """
        矩阵置换密码加密函数
        """
        self.plaintext = list(input("请输入你的明文:").replace(" ", ""))
        self.key = list(input("请输入你的密钥(字母不能重复):").replace(" ", ""))
        # 计算层数
        hang = math.ceil(len(self.plaintext)/len(self.key))
        #密钥的长度
        key_length = len(self.key)
        #需要补充的长度
        tianchong = (len(self.key) - len(self.plaintext) % len(self.key)) % len(self.key)
        for i in range(tianchong):
            self.plaintext.append('a')

        plain_list = [] #明文数组(填充a)
        print("明文矩阵如下:")
        for i in range(hang):
            start_i = i*key_length
            stop_i = i*key_length + key_length
            plain_list.append(self.plaintext[start_i:stop_i])
            print(self.plaintext[start_i:stop_i])

        key_list = sorted(self.key)
        cipher_list = [[0 for i in range(key_length)] for j in range(hang)]

        #加密处理
        for i in range(hang):
            for j,key_value in enumerate(self.key):
                cipher_list[i][j] = plain_list[i][key_list.index(key_value)]

        print("加密矩阵为:")
        for i in range(hang):
            print(cipher_list[i])
        return 0

    def matrix_decoder(self):
        """
        矩阵置换密码解密函数
        """
        self.ciphertext = list(input("请输入你的密文:").replace(" ", ""))
        self.key = list(input("请输入你的密钥(字母不能重复):").replace(" ", ""))
        #计算层数
        hang = math.ceil(len(self.ciphertext) / len(self.key))
        #密钥排序
        key_list = sorted(self.key)
        # 密钥的长度
        key_length = len(self.key)
        plain_list = [[0 for i in range(len(self.key))] for j in range(hang)]
        cipher_list = []
        print("密文矩阵为:")
        for i in range(hang):
            start_i = i*key_length
            stop_i = i*key_length + key_length
            cipher_list.append(self.ciphertext[start_i:stop_i])
            print(self.ciphertext[start_i:stop_i])
        #解密处理
        for i in range(hang):
            for j, key_value in enumerate(key_list):
                plain_list[i][j] = cipher_list[i][self.key.index(key_value)]
        print("明文矩阵为:")
        for i in range(hang):
            print(plain_list[i])
        return 0



if __name__ == '__main__':
    caesar = Ciper()
    matrix = Ciper()
    print("凯撒密码加密和解密:")
    print("执行加密")
    caesar.caesar_coder()
    print("执行解密")
    caesar.caesar_decoder()

    print("矩阵置换密码加密和解密:")
    print("执行加密")
    matrix.matrix_coder()
    print("执行解密")
    matrix.matrix_decoder()

运行结果如下所示:
在这里插入图片描述
在这里插入图片描述
希望能帮到你!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值