古典密码加解密

Hello World, Hello crypto

Posted by Resulte on June 18, 2020

Classic-crypto-system

古典密码加解密系统,置换密码+栅栏密码,python实现

置换密码

流程介绍

加密:

  • 建立随机化的密文字符表(随机置换表)

  • 逐个字符进行查表替代

  • 输出明文、密文

解密:

  • 输入密文字符表

  • 逐个字符进行查表替代

  • 输出密文、明文

流程图

流程图

执行结果截图

执行结果

代码

import numpy as np
import string

#生成密码本和反密码本
def generate_table():
    # 获取“a”到”z“的顺序字符表
    pT = tuple(string.ascii_lowercase)

    # 建立随机化的密文字符表
    cT = []
    temp = np.random.permutation(26)
    for x in temp:
        cT.append(pT[x])

    # 建立密码本,即明文、密文对照表,这里使用了字典结构
    keyTable = {}
    for x, y in zip(pT, cT):
        keyTable[x] = y
    valueTable = {v: k for k, v in keyTable.items()}

    return [keyTable,valueTable]


if __name__ == '__main__':
    hasTable = False
    keyTable = {}
    valueTable = {}
    while True:
        print("*" * 30)
        print('置换密码实验:1、生成随机密码本   2、加密   3、解密  4、退出:')
        choose = input('请选择序号:')
        if (choose == '1'):
            [keyTable, valueTable] = generate_table()
            hasTable = True
            print('生成随机密码本成功!')

        elif (choose == '2'):  # encode
            if hasTable == False:
                print('请先生成随机密码本')
                continue
            plaintext = input('请输入要加密的消息(仅限英文字母): ')
            result = ''
            for c in plaintext:
                result += keyTable[c]
            print('加密结果: ' + result)

        elif (choose == '3'):  # decode
            if hasTable == False:
                print('请先生成随机密码本')
                continue
            ciphertext = input('请输入要解密的密文: ')
            result = ''
            for c in ciphertext:
                result += valueTable[c]
            print('解密结果: ' + result)

        elif (choose == '4'):
            print('退出成功')
            break

        else:
            print('错误,请选择1、2或3中的一个!')
            continue

栅栏密码

流程介绍

加密:

  • 对待处理消息形成数组或列表

  • 生成密文空间

  • 读取 0、2、4、6…数据到密文空间的 0、1、2、3,…round(n/2)-1

  • 读 取 1 、 3 、 5 、 7… 数 据 到 密 文 空 间 的 round(n/2) 、 round(n/2)+1 、round(n/2)+2…n-1

  • 输出明文、密文

解密:

  • 生成明文空间

  • 读取密文的 0、1、2、3…round(n/2)-1 到明文空间的 0、2、4、6、…

  • 读取密文的 round(n/2)、round(n/2)+1、round(n/2)+2…n-1 到明文空间的 1、 3、5、7…

  • 输出密文、明文

流程图

流程图

执行结果截图

执行结果

代码

if __name__ == '__main__':

    while True:
        print("*" * 30)
        print('栅栏密码实验:1、加密   2、解密  3、退出:')
        choose = input('请选择序号:')

        if (choose == '1'):  # encode
            plaintext = input('请输入要加密的消息: ')
            result = ''
            n = len(plaintext)
            i = 0
            j = 0
            while i < round(n / 2):
                result += plaintext[j]
                i += 1
                j += 2
            j = 1
            while i < n:
                result += plaintext[j]
                i += 1
                j += 2
            print('加密结果: ' + result)

        elif (choose == '2'):  # decode
            ciphertext = input('请输入要解密的密文: ')
            n = len(ciphertext)
            result = [None] * n
            i = 0
            j = 0
            while i < round(n / 2):
                result[j] = ciphertext[i]
                i += 1
                j += 2
            j = 1
            while i < n:
                result[j] = ciphertext[i]
                i += 1
                j += 2
            plaintext = ''
            for item in result:
                plaintext += item
            print('解密结果: ' + plaintext)

        elif (choose == '3'):
            print('退出成功')
            break

        else:
            print('错误,请选择1、2或3中的一个!')
            continue