移位密码体制
通俗的来讲,移位密码体制就是通过一个线性变换,即一次方程,是使得在该变换下,明文和密文是一一对应的。下面给出具体的移位的密码体制。 令P=C=K=Z26
(这里的P表示明文空间,C代表密文空间,K代表密文空间)。对0<=K<=25
,任意x,y
属于Z26(26是下标)
,定义:
-
ek(x)=(x+K)mod26
,这个是加密式子,具体是对每一位明文字符x
进行右移K
位得到密文。 -
dk(x)=(y−K)mod26
,这个是解密式子,具体是对每一位密文字符y
进行左移K
位得到明文。
另外当K=3
的时候,此密码体制叫做凯撒密码。
#include<bits/stdc++.h>
using namespace std;
char S[100];
//在下面Begin和End之间补全代码,对输入的字符串进行K位移动加密
int main()
{
int K;
scanf("%d",&K);
cin>>S;
/*********** Begin ***********/
for(int i=0;i<strlen(S);i++)
printf("%c",'a'+((S[i]-'a'+K)%26));
/*********** End ***********/
}
置换密码的密码体制
这里首先简单的讲解一下代换密码体制,大家一定都知道全排列,现在你得到26个英文字典字母的两个不同的排列,那么把这两个排列并到一起,上下对应的字母,就是明文和密文的对应了。 代换密码就是明文中每一个字符被替换成密文中的另外一个字符,代换后的各字母保持原来的位置。对密文进行逆替换就可以恢复出明文。
代码主要通过map函数的一对一的映射实现:
#include<bits/stdc++.h>
using namespace std;
char A[27],B[27],M[100];
map<char,char>MAP;
//在下面Begin和End之间补全代码,对输入的字符串进行代换表置换
int main()
{
cin>>A;
cin>>B;
cin>>M;
/*********** Begin ***********/
for(int i=0;i<26;i++)
MAP[A[i]]=B[i];
for(int i=0;i<strlen(M);i++)
cout<<MAP[M[i]];
/*********** End ***********/
}