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

ops/2025/1/17 11:20:19/

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代码实现 

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=0for i in range(sss):for j in range(len(y[0])):arr[i,j]=x1[n]n+=1print("替换矩阵\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=0for j in sort_key(key):for i in range(sss):arr[i,j]=x[n]n+=1print(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_1if __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))passelif input_n=="0":print("!!!退出程序!!!")quit()else:print("!!!输入序号错误退出程序!!!")break

运行结果


http://www.ppmy.cn/ops/150788.html

相关文章

基于Verilog的简易音乐节奏游戏设计

基于Verilog的简易音乐节奏游戏设计 #### 一、设计目的 本实验旨在通过设计一个简易的音乐节奏游戏,让学生熟悉Verilog语言在FPGA设计中的应用,掌握时钟分频、状态机设计、按键扫描和音频输出等关键概念。 #### 二、设计原理 1. **时钟分频**:由于FPGA的工作频率通常较高…

Linux(Centos7)安装Mysql/Redis/MinIO

安装Mysql 安装Redis 搜索Redis最先版本所在的在线安装yum库 查看以上两个组件是否是开机自启 安装MinIO 开源的对象存储服务,存储非结构化数据,兼容亚马逊S3协议。 minio --help #查询命令帮助minio --server --help #查询--server帮助minio serve…

【Linux探索学习】第二十六弹——进程通信:深入理解Linux中的进程通信

Linux探索学习: https://blog.csdn.net/2301_80220607/category_12805278.html?spm1001.2014.3001.5482 前言: 在Linux操作系统中,进程通信(IPC)是操作系统的一项核心功能,用于在不同进程之间交换数据或…

cursor重构谷粒商城01——为何要重构谷粒商城

前言:这个系列将使用最前沿的cursor作为辅助编程工具,来快速开发一些基础的编程项目。目的是为了在真实项目中,帮助初级程序员快速进阶,以最快的速度,效率,快速进阶到中高阶程序员。 本项目将基于谷粒商城…

TensorFlow深度学习实战(5)——神经网络性能优化技术详解

TensorFlow深度学习实战(5)——神经网络性能优化技术详解 0. 前言1. 识别 MNIST 手写数字1.1 MNIST 数据集1.2 独热编码1.3 定义神经网络1.4 训练神经网络 2. 构建深度神经网络3. 添加 Dropout 提高模型泛化能力4. 不同优化器对模型性能的影响5. 训练 ep…

Thrustmaster Hotas Warthog飞行操作杆开发

目录 0 摘 要 :简单说一下这篇文章在搞啥 1 背 景 :什么需求以及对开发的背景调查 2 环境配置 :具体需要什么环境,对软件层面的需求 3 硬件测试 :测试遥感器…

指针的进阶

指针的主题,我们在初级阶段的《指针》章节已经接触过了,我们知道了指针的概念: 1. 指针就是个变量,用来存放地址,地址唯一标识一块内存空间。 2. 指针的大小是固定的4/8个字节(32位平台/64位平台&#xff0…

万字图文:SaaS业务架构、价值流、业务能力、业务流程、业务对象、组织架构

大家好,我是汤师爷~ 本文为读者提供一个SaaS业务架构的系统性框架,探讨业务架构分析的核心要素,帮助SaaS企业深入剖析目标客户的业务模式,全面理解他们的业务架构。 无论你是SaaS创业者、产品经理还是架构师,本文内容…