当前位置: 首页 > article >正文

python密码学列置换加密解密程序

1.置换密码

        置换密码(Permutation Cipher)又叫换位密码(Transposi-tionCipher),它根据一定的规则重新排列明文,以便打破明文的结构特性。置换密码的特点是保持明文的所有字符不变,只是利用置换打乱了明文字符的位置和次序。
最常见的置换密码有两种:

1.列置换密码(明文P遵照密钥的规程按列换位并且按列读出序列得到密文C);
2.周期置换密码(将明文P按固定长度m分组,然后对每组按1,2…,m的某个置换重排位置从而得到密文C)。

2.列置换

2.1加密过程

将明文P以设定的固定分组宽度m按行写出,即每行有m个字符。若明文长度不是m的整数倍,则不足部分用双方约定的方式填充,如双方约定用空格代替空缺处字符,不妨设最后得字符矩阵;
按1,2…,m的某一置换交换列的位置次序得字符矩阵;
把矩阵按列1,2…,n的顺序依次读出得密文序列C。

3.加密解密程序流程图

4.python代码实现 

import math  
import random
import numpy as np
import copy
## 随机密钥生成
def keys():
    d=[s for s in range(10) ]
    number=random.randint(3, 8)
    keys=[]
    for i in range(number):
        s=random.choice(d)
        keys.append(s)
        d.remove(s)
    print("密钥:\n",keys)
    keys_n=[]
    for k in sorted(keys):
        keys_n.append(keys.index(k))
    return keys,keys_n
## 行置换矩阵生成
def arrs(x,y,):### x为内容,为密钥
    sss=math.ceil(len(x)/len(y[0]))
    x1=x+["0" for i in range(((sss*len(y[0]))-len(x)))]
    arr = np.zeros((sss,len(y[0]))).astype('str')
    n=0
    for i in range(sss):
        for j in range(len(y[0])):
            arr[i,j]=x1[n]
            n+=1
    print("替换矩阵\n",arr)
    mi=''
    for j in y[1]:
        for i in range(sss):
            mi+=arr[i,j]
    print("加密密文\n",mi)
    #return arr
#nnnn=keys()
#print(nnnn[1])
#sss=input("hhhhh")
#print(arrs(sss,nnnn,))
### 解密函数
def jm(x,key):
    sss=int(len(x)/len(key))
    arr = np.zeros((sss,len(key))).astype('str')
    n=0
    for j in sort_key(key):
        for i in range(sss):
            arr[i,j]=x[n]
            n+=1
    print(arr)
    mi=''
    for i in range(sss):
        for j in range(len(key)):
            mi+=arr[i,j]
    mi_1=mi.replace("0",'')
    print("解密明文:\n",mi_1.lower())
def sort_key(x):
    key_sort=[]
    for k in sorted(x):
        key_sort.append(x.index(k))
    return key_sort
def list_key(key):
    list_1=[]
    for i in key:
        list_1.append(i)
    return list_1

if __name__=="__main__":
    while True:
        print('''********************欢迎进入加密解密程序*************************
                        1.明文加密
                        2.密文解密
                        0.退出程序
                                                                                    ''')
        input_n=input("请输入序号:")
        if input_n=="1":
            nnnn=keys()
            sss=input("请输入明文:")
            arrs(list(sss.upper()),nnnn)
        elif input_n=="2":
            mi_wen=input("请输入密文:")
            mi_keys=input("请输入密钥:")
            jm(list(mi_wen.upper()),list_key(mi_keys))
            pass
        elif input_n=="0":
            print("!!!退出程序!!!")
            quit()
        else:
            print("!!!输入序号错误退出程序!!!")
            break

运行结果


http://www.kler.cn/a/510965.html

相关文章:

  • MySQL 与 Redis 数据一致性 2
  • 【专题二 二叉树中的深搜】98. 验证二叉搜索树
  • Hadoop•用Web UI查看Hadoop状态词频统计
  • 口令攻击和钓鱼攻击
  • Web端实时播放RTSP视频流(监控)
  • [Qt]常用控件介绍-多元素控件-QListWidget、QTableWidget、QQTreeWidget
  • PySide6(PyQT5)的QMessageBox获取被点击按钮的三种方法
  • BGP边界网关协议(Border Gateway Protocol)路由引入、路由反射器
  • 数据库高可用方案-06-监控与报警
  • 【机器学习:三十一、推荐系统:从基础到应用】
  • [Qualcomm]Qualcomm MDM9607 SDK代码下载操作说明
  • 医疗集群系统中基于超融合数据库架构的应用与前景探析
  • ABP - 缓存模块(1)
  • 搭建一个基于Spring Boot的校园台球厅人员与设备管理系统
  • 运动相机拍视频过程中摔了,导致录视频打不开怎么办
  • Redis概述
  • FPGA产业全景扫描
  • vid2vid-zero:使用Stable Diffusion进行零样本视频编辑
  • VMware Workstation Pro 17免费开放,再也不用到处找license了
  • Mac开启任何来源安装配置环境变量
  • GitLab集成Jira
  • 【Excel超实用,VLOOKUP函数,通过excel数据精准匹配,将一个excel文件的某列数据,用另一个excel文件快速填充】
  • git是什么及Linux git操作
  • [EAI-018] π0: A Vision-Language-Action Flow Model for General Robot Control
  • Pytorch 自学笔记(三):利用自定义文本数据集构建Dataset和DataLoader
  • Qt——界面优化