(列置换密码)(Column Permutation Cipher)(含代码)

2023-11-24 21:30

本文主要是介绍(列置换密码)(Column Permutation Cipher)(含代码),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


前言1-密码学的相关介绍

密码学(在西欧语文中,源于希腊语kryptós“隐藏的”,和gráphein“书写”)是研究如何隐密地传递信息的学科。在现代特别指对信息以及其传输的数学性研究,常被认为是数学和计算机科学的分支,和信息论也密切相关。著名的密码学者Ron Rivest解释道:“密码学是关于如何在敌人存在的环境中通讯”,自工程学的角度,这相当于密码学与纯数学的异同。密码学是信息安全等相关议题,如认证、访问控制的核心。密码学的首要目的是隐藏信息的涵义,并不是隐藏信息的存在。密码学也促进了计算机科学,特别是在于电脑与网络安全所使用的技术,如访问控制与信息的机密性。密码学已被应用在日常生活:包括自动柜员机的芯片卡、电脑使用者存取密码、电子商务等等。
密码是通信双方按约定的法则进行信息特殊变换的一种重要保密手段。依照这些法则,变明文为密文,称为加密变换;变密文为明文,称为脱密变换。密码在早期仅对文字或数码进行加、脱密变换,随着通信技术的发展,对语音、图像、数据等都可实施加、脱密变换。

在通信过程中,待加密的信息称为明文,已被加密的信息称为密文,仅有收、发双方知道的信息称为密钥。在密钥控制下,由明文变到密文的过程叫加密,其逆过程叫脱密或解密。在密码系统中,除合法用户外,还有非法的截收者,他们试图通过各种办法窃取机密(又称为被动攻击)或窜改消息(又称为主动攻击)。

密钥:分为加密密钥和解密密钥。
明文:没有进行加密,能够直接代表原文含义的信息。
密文:经过加密处理处理之后,隐藏原文含义的信息。
加密:将明文转换成密文的实施过程。
解密:将密文转换成明文的实施过程。
密码算法:密码系统采用的加密方法和解密方法,随着基于数学密码技术的发展,加密方法一般称为加密算法,解密方法一般称为解密算法。
直到现代以前,密码学几乎专指加密(encryption)算法:将普通信息(明文,plaintext)转换成难以理解的资料(密文,ciphertext)的过程;解密(decryption)算法则是其相反的过程:由密文转换回明文;加解密包含了这两种算法,一般加密即同时指称加密(encrypt或encipher)与解密(decrypt或decipher)的技术。
加解密的具体运作由两部分决定:一个是算法,另一个是密钥。密钥是一个用于加解密算法的秘密参数,通常只有通讯者拥有。历史上,密钥通常未经认证或完整性测试而被直接使用在密码机上。
密码协议(cryptographic protocol)是使用密码技术的通信协议(communication protocol)。近代密码学者多认为除了传统上的加解密算法,密码协议也一样重要,两者为密码学研究的两大课题。在英文中,cryptography和cryptology都可代表密码学,前者又称密码术。但更严谨地说,前者(cryptography)指密码技术的使用,而后者(cryptology)指研究密码的学科,包含密码术与密码分析。密码分析(cryptanalysis)是研究如何破解密码学的学科。但在实际使用中,通常都称密码学(英文通常称cryptography),而不具体区分其含义。
口语上,编码(code)常意指加密或隐藏信息的各种方法。然而,在密码学中,编码有更特定的意义:它意指以码字(code word)取代特定的明文。例如,以‘苹果派’(apple pie)替换‘拂晓攻击’(attack at dawn)。编码已经不再被使用在严谨的密码学,它在信息论或通讯原理上有更明确的意义。
在汉语口语中,电脑系统或网络使用的个人帐户口令(password)也常被以密码代称,虽然口令亦属密码学研究的范围,但学术上口令与密码学中所称的钥匙(key)并不相同,即使两者间常有密切的关连。

传统密码体质
密码系统图示

传统密码体质密码系统图示

密码系统定义

一个密码系统是一个五元组(P,C,K,E,D),
P:明文集
C:密文集
K:密钥集
E:加密算法集
D:解密算法集
密码学 Cryptography
加密 Encryption
解密 Decryption

前言2-本文列置换密码的介绍

置换密码(Permutation Cipher)又叫换位密码(Transposition Cipher),其特点就是保持明文的所有字符不变,打乱明文字符的位置和次序。常见的置换密码有两种:列置换密码和周期置换密码。
本文特点:提供的代码实现了不退出程序框多次使用列置换密码的加解密


一、列置换密码理论加解密过程

加密过程

1.将明文p以设定的固定分组宽度m按行写出,即每行有m个字符;若明文长度不是m的整数倍,则不足部分用双方约定的方式填充(代码使用字符’x’进行填充),如双方约定用空格代替空缺处字符,不妨设最后得字符矩阵[Mp]n×m

2.按1,2…,m的某一置换σ交换列的位置次序得字符矩阵[Mp]n×m

3.把矩阵按[Mp]n×m列的顺序依次读出得密文序列c。

解密过程

1.将密文c以分组宽度n按列写出得到字符矩阵[Mp]n×m

2.按加密过程用的置换σ的逆置换σ-1交换列的位置次序得字符矩阵[Mp]n×m

3.把矩阵[Mp]n×m按1,2…,n行的顺序依次读出得明文p

举例说明

列置换密码

1.加密举例:

P=abcdefgh,分组宽为m=4,得2行4列矩阵M:
M=(a b c de f g h)
设置换x=(1 3)(2 4)
则M'=(c d a bg h e f)
则密文序列C=cgdhaebf

2.解密举例:

将密文C以分组宽度m按照写出字符矩阵,的n行m列M';
按1,2,……,m的逆置换交换列的位置次序,得字符矩阵M;
将M按行的顺序依次独处明文序列P。
密文序列C=cgdhaebf
M'=(c d a b g h e f)
逆置换x'=(1 3)(2 4)
M=(a b c de f g h)

二、代码部分

1.引入库

代码如下(示例):

#include<bits/stdc++.h>

2.主函数部分

代码如下(示例):

    while(!flag){int i;cout << "*************************" << endl;cout << "*********欢迎使用********" << endl;cout << "*************************" << endl;cout << "       1.选择加密"<< endl;cout << "       2.选择解密"<< endl;cout << "       3.退出" << endl;cout << "*************************" << endl;cout << "*********欢迎使用********" << endl;cout << "*************************" << endl;cin >> i;if(i == 3){flag = true;}else if( i & 1){once_encrypt();}else{once_decrypt();}}

3.整体代码

#include<bits/stdc++.h>using namespace std;const int N = 1e5;int i,j,l,k,m,num[N];
char key[N],plantext[N],plantext2[N],cipher[N];
int cnt;
bool flag;
//Multiple column permutationvoid do_key()
{l=strlen(key);for(i=0;i<l;i++){num[i]=0;for(j=0;j<l;j++){if(key[j]<=key[i]){num[i]=num[i]+1;}if(key[j]==key[i]&&j>i)num[i]=num[i]-1;}}
}void do_plaintext()
{k=strlen(plantext);i=0;for(m=k%l;m<l;m++){plantext[k+i]='x';  //空缺补xi++;}if(k%l==0)m=k/l;elsem=k/l+1;
}void encrypt()
{for(i=0;i<m;i++){for(j=0;j<l;j++){cipher[i*l+j]=plantext[i*l+num[j]-1];}}for(i=0;i<l;i++){for(j=0;j<m;j++)printf("%c",cipher[j*l+i]);}printf("\n");
}void decrypt()
{for(i=0;i<m;i++){for(j=0;j<l;j++){cipher[i*l+j]=plantext[i*l+num[j]-1];}}for(i=0;i<m;i++){for(j=0;j<l;j++){plantext2[i*l+num[j]-1]=cipher[i*l+j];}}plantext2[(i-1)*l+j]='\0';cout << plantext2 << endl;
}void once_encrypt()
{cout << "请输入密钥:" << endl;cin >> key;do_key();cout << "请输入明文信息:" << endl;cin >> plantext;do_plaintext();cout << "加密结果:" << endl;encrypt();cout << endl;
}void once_decrypt()
{cout << "请输入密钥:" << endl;cin >> key;do_key();cout << "请输入密文信息:" << endl;cin >> plantext;do_plaintext();cout << "解密结果:" << endl;decrypt();cout << endl;
}int main()
{while(!flag){int i;cout << "*************************" << endl;cout << "*********欢迎使用********" << endl;cout << "*************************" << endl;cout << "       1.选择加密"<< endl;cout << "       2.选择解密"<< endl;cout << "       3.退出" << endl;cout << "*************************" << endl;cout << "*********欢迎使用********" << endl;cout << "*************************" << endl;cin >> i;if(i == 3){flag = true;}else if( i & 1){once_encrypt();}else{once_decrypt();}}return 0;
}

4.使用流程

将代码复制进C++运行环境即可编译运行


总结

今天上午听了密码学的列置换密码的部分课程,想用代码实现一下。
本文介绍了密码学中的(列置换密码)(Column Permutation Cipher)(含代码),并且进行了代码的实现,读者可运行代码进行操作。

参考资料

[1]百度百科-密码学

这篇关于(列置换密码)(Column Permutation Cipher)(含代码)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/422578

相关文章

活用c4d官方开发文档查询代码

当你问AI助手比如豆包,如何用python禁止掉xpresso标签时候,它会提示到 这时候要用到两个东西。https://developers.maxon.net/论坛搜索和开发文档 比如这里我就在官方找到正确的id描述 然后我就把参数标签换过来

poj 1258 Agri-Net(最小生成树模板代码)

感觉用这题来当模板更适合。 题意就是给你邻接矩阵求最小生成树啦。~ prim代码:效率很高。172k...0ms。 #include<stdio.h>#include<algorithm>using namespace std;const int MaxN = 101;const int INF = 0x3f3f3f3f;int g[MaxN][MaxN];int n

【测试】输入正确用户名和密码,点击登录没有响应的可能性原因

目录 一、前端问题 1. 界面交互问题 2. 输入数据校验问题 二、网络问题 1. 网络连接中断 2. 代理设置问题 三、后端问题 1. 服务器故障 2. 数据库问题 3. 权限问题: 四、其他问题 1. 缓存问题 2. 第三方服务问题 3. 配置问题 一、前端问题 1. 界面交互问题 登录按钮的点击事件未正确绑定,导致点击后无法触发登录操作。 页面可能存在

计算机毕业设计 大学志愿填报系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点赞 👍 收藏 ⭐评论 📝 🍅 文末获取源码联系 👇🏻 精彩专栏推荐订阅 👇🏻 不然下次找不到哟~Java毕业设计项目~热门选题推荐《1000套》 目录 1.技术选型 2.开发工具 3.功能

代码随想录冲冲冲 Day39 动态规划Part7

198. 打家劫舍 dp数组的意义是在第i位的时候偷的最大钱数是多少 如果nums的size为0 总价值当然就是0 如果nums的size为1 总价值是nums[0] 遍历顺序就是从小到大遍历 之后是递推公式 对于dp[i]的最大价值来说有两种可能 1.偷第i个 那么最大价值就是dp[i-2]+nums[i] 2.不偷第i个 那么价值就是dp[i-1] 之后取这两个的最大值就是d

pip-tools:打造可重复、可控的 Python 开发环境,解决依赖关系,让代码更稳定

在 Python 开发中,管理依赖关系是一项繁琐且容易出错的任务。手动更新依赖版本、处理冲突、确保一致性等等,都可能让开发者感到头疼。而 pip-tools 为开发者提供了一套稳定可靠的解决方案。 什么是 pip-tools? pip-tools 是一组命令行工具,旨在简化 Python 依赖关系的管理,确保项目环境的稳定性和可重复性。它主要包含两个核心工具:pip-compile 和 pip

D4代码AC集

贪心问题解决的步骤: (局部贪心能导致全局贪心)    1.确定贪心策略    2.验证贪心策略是否正确 排队接水 #include<bits/stdc++.h>using namespace std;int main(){int w,n,a[32000];cin>>w>>n;for(int i=1;i<=n;i++){cin>>a[i];}sort(a+1,a+n+1);int i=1

html css jquery选项卡 代码练习小项目

在学习 html 和 css jquery 结合使用的时候 做好是能尝试做一些简单的小功能,来提高自己的 逻辑能力,熟悉代码的编写语法 下面分享一段代码 使用html css jquery选项卡 代码练习 <div class="box"><dl class="tab"><dd class="active">手机</dd><dd>家电</dd><dd>服装</dd><dd>数码</dd><dd

生信代码入门:从零开始掌握生物信息学编程技能

少走弯路,高效分析;了解生信云,访问 【生信圆桌x生信专用云服务器】 : www.tebteb.cc 介绍 生物信息学是一个高度跨学科的领域,结合了生物学、计算机科学和统计学。随着高通量测序技术的发展,海量的生物数据需要通过编程来进行处理和分析。因此,掌握生信编程技能,成为每一个生物信息学研究者的必备能力。 生信代码入门,旨在帮助初学者从零开始学习生物信息学中的编程基础。通过学习常用

husky 工具配置代码检查工作流:提交代码至仓库前做代码检查

提示:这篇博客以我前两篇博客作为先修知识,请大家先去看看我前两篇博客 博客指路:前端 ESlint 代码规范及修复代码规范错误-CSDN博客前端 Vue3 项目开发—— ESLint & prettier 配置代码风格-CSDN博客 husky 工具配置代码检查工作流的作用 在工作中,我们经常需要将写好的代码提交至代码仓库 但是由于程序员疏忽而将不规范的代码提交至仓库,显然是不合理的 所