置换密码

news/2024/11/29 6:25:31/

 置换密码又称换位密码,是根据一定的规则重新排列明文,以便打破明文的结构特性。置换密码的特点是保持明文的 所有字符不变,只是利用置换打乱了明文字符的位置和次序。也就是说,改变了明文的结构,不改变明文的内容。

例如:明文:asdfghjklmnbvc

密钥:31524

首先把弄清密钥长度,然后将密文分组即

明文矩阵: 

     a s d f g

     h j k l m

     n b v c

不足的用空格代替

得到密文:dkvahngm sjbflc; 

其中解密密钥得到方式为用密钥的顺序(12345)写出下方正常排序的(12345)例1-2,2-4,3-1····

              3 1 5 2 4

              1 2 3 4 5

解密密钥:2 4 1 5 3

解密的时候也是一样,先求出转换为矩阵有多少行,然后先将列排满然后再将行排满;

例如上面的密文 dkvahngm sjbflc,加上空格共有15个字符所以分为3行5列,得到矩阵:

           d a g s f

           k h m j l

           v n  b c ;

然后用解密密钥逐行输出:第一行:asdfg

                第二行:hjklm

                第三行:nbvc  ;

若有空格则跳过输出。

代码:

/*日期:2018.3.29*/
/*编译:李威鹏*/
/*作用:置换密码的实现*/
/*使用函数:头文件:<conio.h><stdio.h><string.h><stdlib.h><algorithm>函数名:加密函数,解密函数*/
#include<stdio.h>
#include<conio.h>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
using namespace std;
char mingwen[10000],miwen[10000],mingwenjuzhen[1000][1000],miwenjuzhen[1000][1000],miyao[10000];
void shouye()
{system("cls");printf("欢迎使用置换密码转换程序!\n");printf("请选择使用功能:\n");printf("1:加密  2:解密\n");printf("  0:终止程序\n");
}
void jiemi();
void jiami()
{system("cls");printf("请输入明文\n");scanf("%s",mingwen);printf("请输入数字密钥n(0<n<10)\n");int n,l,k=0,l1=0,i,j,q=1,w=0,aa=0,bb=0,a[10000]= {0};scanf("%d",&n);while(n){k++;miyao[k]=n%10;n/=10;}printf("密钥为:\n");for(i=k; i>=1; i--){a[k-i+1]=miyao[i];printf("%d ",miyao[i]);}printf("\n");l=strlen(mingwen);if(l%k!=0)//计算矩阵行数aa=l/k+1;elseaa=l/k;if(aa==1){printf("密文为:\n\n");for(i=1; i<=k; i++){for(j=0; j<l; j++){if(a[i]==j+1){printf("%c",mingwen[j]);}}}}else{for(i=0; i<aa;){if(i==aa-1)break;for(j=0; j<l; j++){mingwenjuzhen[i+1][q++]=mingwen[j];w++;if(w==k){i++;w=0;q=1;}}}printf("密文为:\n\n");for(i=k; i>=1; i--){for(j=1; j<=aa; j++){printf("%c",mingwenjuzhen[j][miyao[i]]);}}}printf("\n\n");printf("解密密钥为:\n");for(i=1; i<=k; i++){for(j=1; j<=k; j++){if(i==a[j]){printf("%d ",j);}}}printf("\n");printf("是否继续?\n");printf("1:继续  2:解密  3:返回主菜单\n");int mm;scanf("%d",&mm);if(mm==1)jiami();if(mm==2)jiemi();if(mm==3)shouye();
}
void jiemi()
{system("cls");printf("请输入密文:\n");getchar();gets(miwen);int i,j,m,l,k=0,b[1000]= {0},aa=0,q=1,w=0,bb=0;char s1[1000]= {0};l=strlen(miwen);//密文长度printf("请输入解密密钥m(0<m<10)\n");scanf("%d",&m);while(m){k++;miyao[k]=m%10;m/=10;}printf("解密密钥为:\n");for(i=k; i>=1; i--){b[k-i+1]=miyao[i];printf("%d ",miyao[i]);}printf("\n");if(l%k==0)//计算矩阵行数aa=l/k;elseaa=l/k+1;if(aa==1){for(i=0; i<l; i++){if(miwen[i]==' ')continue;elses1[bb++]=miwen[i];}printf("明文为:\n\n");for(i=1; i<=k; i++){for(j=0; j<l; j++){if(b[i]==j+1)printf("%c",s1[j]);}}}else{for(i=0; i<l;){for(j=0; j<k; j++){for(int r=0; r<aa; r++){miwenjuzhen[r+1][j+1]=miwen[i];i++;}}}printf("明文是:\n\n");for(i=1; i<=aa; i++){for(j=1; j<=k; j++){if(miwenjuzhen[i][b[j]]==' ')continue;elseprintf("%c",miwenjuzhen[i][b[j]]);}}printf("\n\n");}printf("密钥为:\n");for(i=1; i<=k; i++){for(j=1; j<=k; j++){if(i==b[j]){printf("%d ",j);}}}printf("\n是否继续?\n");printf("1:继续  2:加密  3:返回主菜单\n");int mm;scanf("%d",&mm);if(mm==1)jiemi();if(mm==2)jiami();if(mm==3)shouye();
}
void choose()
{int test=1;while(test)//对于菜单的选择{printf("请输入选择:\n");int n;scanf("%d",&n);if(n==1){jiami();}else if(n==2){jiemi();}else if(n==0){printf("欢迎使用!!\n");test=0;return;}else{printf("输入错误!\n请重新输入!");choose();}}
}
int main()
{shouye();choose();return 0;
}

 


http://www.ppmy.cn/news/660606.html

相关文章

4.5 置换矩阵

4.5 置换矩阵 是不是任意可逆矩阵都可进行 L D U LDU LDU 分解呢&#xff1f;其实不能&#xff0c;消元操作需要除以对角元素 a i i a_{ii} aii​ &#xff0c;当其为 0 0 0 时&#xff0c;则会失败。这时可在下面行中选择任一对角元素不为 0 0 0 的行&#xff0c;对调这两…

重点!!!页面置换算法(最佳置换算法(OPT) 、先进先出置换算法(FIFO) 、最近最久未使用置换算法(LRU) 、时钟置换算法(CLOCK) 、改进型的时钟置换算法)

文章目录 前言知识总览最佳置换算法&#xff08;OPT&#xff09;先进先出置换算法&#xff08;FIFO&#xff09;最近最久未使用置换算法&#xff08;LRU)时钟置换算法&#xff08;CLOCK)改进型的时钟置换算法知识回顾与重要考点 前言 此篇文章是我在B站学习时所做的笔记&#…

近世代数--置换群--置换permutation分解成什么?置换的级如何计算?

近世代数--置换群--置换permutation分解成什么&#xff1f;置换的级如何计算&#xff1f; 置换的分解置换的级计算 博主是初学近世代数&#xff08;群环域&#xff09;&#xff0c;本意是想整理一些较难理解的定理、算法&#xff0c;加深记忆也方便日后查找&#xff1b;如果有错…

置换群 理解

http://blog.163.com/myq_952/blog/static/863906320110211731329/ 置换的概念是什么&#xff1f;一个有限集合的一一变换叫做置换,一对对置换组成了置换群。对于一个集合a(a[1],a[2],a[3]...a[n]) 通过置换可以变成 (b[a[1]],b[a[2]],b[a[3]]...b[a[n]]) b的作用就是置换(可以…

置换矩阵(permutation matrix)

左行&#xff1a;一个矩阵或向量左乘一个 permutation matrix&#xff0c;交换的是该矩阵或向量的行&#xff1b;右列&#xff1a;一个矩阵或向量右乘一个 permutation matrix&#xff0c;交换的是该矩阵或向量的列&#xff1b; P,A,B 分别为三阶方阵&#xff0c;其中 P 为置换…

置换与合一

置换(substitution) 1、假元推理&#xff1a;由合式公式 W1 和 W1−>W2 产生合式公式 W2 的运算。 2、全称化推理&#xff1a;由合式公式( ∀x)W(x) 产生合式公式W(A)&#xff0c;其中A为任意常量符号。 3、一个表达式的项可为变量符号、常量符号或函数表达式。函数表达式…

【页面置换】页面置换算法的设计

页面置换算法的模拟实现 一、设计目的和要求 1.设计目的 《操作系统实验》课程设计是学习完《操作系统原理》及实验课程后进行的一次较全面的综合练习。其目的在于加深对操作系统的理论、方法和基础知识的理解&#xff0c;掌握操作系统结构、实现机理和各种典型算法&#xff0…

置换群简介

2020暑假集训博客 7.16 关于置换群题目&#xff1a; 首先介绍一下什么是置换群&#xff0c;不说一些繁琐的概念。 首先给你一个序列&#xff0c;假如&#xff1a; s {1 2 3 4 5 6} 然后给你一个变换规则 t {6 3 4 2 1 5} 就是每一次按照t规则变换下去 比如这样 第一次&#x…