Python实现置换密码

什么是置换密码?

置换密码是一种通过变换矩阵大小选出的顺序组合,而密钥仅仅是便于记忆,因此,置换密码比较简单,经不起穷举攻击(穷举攻击无视顺序),但可以把此种方法与其他密码结合可以得到相对安全且高效的密码。       --百度百科

置换密码的表示

基于python实现的置换算法:

实现文件的读写(生成随机数并存入到文件中):

def Create_file():
    thislist1 = []
    thislist2 = []
    num1 = random.randint(5, 50)
    num2 = random.randint(num1,2 * num1)

    for i in range(0, num1):
        random_num1 = random.randint(0, 50)
        random_hex = hex(random_num1)[2:]
        thislist1.append(random_hex)

    for i in range(0, num2):
        thislist2.append(i)
    random.shuffle(thislist2)

    with open("ReplaceData.txt", "w") as f:
        f.write("Plaintext:")
        for i in thislist1:
            f.write("{} ".format(i))
        f.write("\n")
    with open("ReplaceData.txt", "a") as f:
        f.write("Keys:")
        for j in thislist2:
            f.write("{},".format(j))

加密过程:

def replace(plaintext, keys) -> list:
    thislist = []
    for i in keys:
        thislist.append(plaintext[i])
    return thislist

解密过程:
 

def decrypt_cipher(cipher, k) -> list:
    m = [None] * len(cipher)
    for i in range(len(cipher)):
        m[k[i]] = cipher[i]
    return m

完整代码:

import random


def Create_file():
    thislist1 = []
    thislist2 = []
    num1 = random.randint(5, 50)
    num2 = random.randint(num1,2 * num1)

    for i in range(0, num1):
        random_num1 = random.randint(0, 50)
        random_hex = hex(random_num1)[2:]
        thislist1.append(random_hex)

    for i in range(0, num2):
        thislist2.append(i)
    random.shuffle(thislist2)

    with open("ReplaceData.txt", "w") as f:
        f.write("Plaintext:")
        for i in thislist1:
            f.write("{} ".format(i))
        f.write("\n")
    with open("ReplaceData.txt", "a") as f:
        f.write("Keys:")
        for j in thislist2:
            f.write("{},".format(j))


def replace(plaintext, keys) -> list:
    thislist = []
    for i in keys:
        thislist.append(plaintext[i])
    return thislist


def GUI_front(plainttext, keys):
    print("相当于置换:")

    print("| ", end="")

    for i in plainttext:
        print("{} ".format(i), end="")

    print("|")
    print("| ", end="")

    for i in keys:
        print("{} ".format(i), end="")
    print("|")


def decrypt_cipher(cipher, k) -> list:
    m = [None] * len(cipher)
    for i in range(len(cipher)):
        m[k[i]] = cipher[i]
    return m


if __name__ == '__main__':
    Create_file()
    plaintext = []
    keys = []
    list_tmp = []
    keys_tmp = []

    with open("ReplaceData.txt", "r") as file:
        for line1 in file:
            if "Plaintext:" in line1:
                list_tmp = line1.split("Plaintext:")[1].strip()
                list_tmp = list_tmp.split(" ")
    with open("ReplaceData.txt", "r") as file:
        for line2 in file:
            if "Keys:" in line2:
                keys_tmp = line2.split("Keys:")[1].strip()
                keys_tmp = keys_tmp.split(",")[:-1]
                #去掉文件结尾的逗号,不知道还有什么解决办法

    # print(type(keys_tmp))
    # print(keys_tmp)
    for i in keys_tmp:
        i = int(i)
        keys.append(i)
    print(len(keys))
    if keys.__len__() >= list_tmp.__len__():
        for i in range(0, len(keys)):
            plaintext.append(list_tmp[i % len(list_tmp)])

    if len(keys) > len(plaintext):
        keys = keys[:len(plaintext)]
    elif len(keys) < len(plaintext):
        # Extend keys to match the length of plaintext
        keys_extension = keys * (len(plaintext) // len(keys)) + keys[:len(plaintext) % len(keys)]
        keys = keys_extension

    GUI_front(plaintext, keys)

    print("加密后的序列为:", end="")
    encrypted = replace(plaintext, keys)
    for i in encrypted:
        print("{} ".format(i),end="")

    print("\n解密后的序列为:", end="")
    decrypted = decrypt_cipher(encrypted, keys)
    for i in decrypted:
        print("{} ".format(i),end="")

GUI函数那里只是方便查看输出!

结果演示:

文件演示:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值