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

devtools/2025/1/20 13:20:32/

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/devtools/152094.html

相关文章

source insight函数名注释是什么 source insight如何修改函数名

在程序开发和代码管理中,函数名注释和函数名修改是两个关键环节。Source Insight作为一款功能强大的代码编辑器,提供了丰富的功能来帮助开发者高效完成这些任务。本文将详细探讨“source insight函数名注释是什么 source insight如何修改函数名”,并进一步介绍Source Insigh…

rocketmq基本架构

简介 Name server 负责broker注册、心跳,路由等功能,类似Kafka的ZKname server节点之间不互相通信,broker需要和所有name server进行通信。扩容name server需要重启broker,不然broker不会和name server建立连接producer和consum…

git系列之revert回滚

1. Git 使用cherry-pick“摘樱桃” step 1: 本地切到远程分支,对齐要对齐的base分支,举例子 localmap git pull git reset --hard localmap 对应的commit idstep 2: 执行cherry-pick命令 git cherry-pick abc123这样就会将远程…

RabbitMQ 进阶

文章目录 一、发送者的可靠性 1.1 生产者重试机制:1.2 生产者确认机制: 1.2.1 开启生产者确认:1.2.2 定义 ReturnCallback:1.2.3 定义 ConfirmCallback: 二、MQ 的可靠性 2.1 数据持久化: 2.1.1 交换机持…

PyTorch使用教程(7)-数据集处理

1、基础概念 在PyTorch中,torch.utils.data模块是处理数据集和数据加载的核心工具。以下是该模块中一些基础概念的理解: 1.1 Dataset 定义:Dataset是一个抽象类,用于表示数据集。用户需要通过继承Dataset类并实现其__len__和__…

基于海思soc的智能产品开发(高、中、低soc、以及和fpga的搭配)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 市场上关于图像、音频的soc其实非常多,这里面有高、中、低档,开发方式也不相同。之所以会这样,有价格的因素&am…

AF3 MSAModule类源码解读

AlphaFold3 中的MSAModule 类 是一个用于处理多序列比对(MSA)的模块,核心功能是通过 MSAModuleBlock 堆叠和梯度检查点优化,实现对 MSA 表征和配对表征的高效计算。调用该类最终返回更新后的配对表征z,更新后的z含有MSA特征和目的蛋白质序列信息。 源代码: class MSAMo…

自制游戏——国争

自制小游戏,分享给大家 //0——步兵(k) //1——弓箭手(k) //2——炮兵(k) //3——土地(平方公里) //4——能量(t) //5——钱(元宝…