移位密码算法、凯撒密码 类封装
前言:最近的作业,随便搜了一下网上没有一下质量较高成品较好的加解密算法封装,在此分享自己的代码,仅供参考
具体 加解密结果转换大小写 可以自行在代码中修改
题目原题
【实验目的】
1) 学习移位密码的原理
2) 学习移密码的实现
【实验原理】
-
算法原理
a) 移位密码就是对26个字母进行移位操作,可以移动任意位数,这样就实现了对明文的加密,移位操作简单易行,因此,加密解密比较简单。
b) 移位密码的基本思想:移位密码算法 c=m+k(mod 26),k可以使0<k<26的任意整数。加密算法:x=x+k(mod26),解密算法x=x-k(mod 26)。当K=3,时,为凯撒密码。 -
算法参数
移位密码算法主要有c、m、k 三个参数。c 为密文,m 是明文,k 为密钥。 -
算法流程
算法流程如下。如图所示
输入
第一行输入表明是加密还是解密,0是加密,1是解密;
第二行是加密或解密密钥,是0<k<26之间的一个整数;
第三行是明文或密文。
输出
输出是明文或密文。
输入样例
0
6
wearesztuers
1
6
CKGXKYFZAKXY
输出样例
CKGXKYFZAKXY
wearesztuers
接口使用:
构造函数CaesarPassword(原始文本:可以用来加密或解密)
加密方法encode(key:加密密钥),返回加密密文
解密方法decode(key:解密密钥),返回解密密文
主函数:
见输入,这里演示了各加密,解密一次的结果
凯撒密码/移位密码(类封装)
#include<iostream>
using namespace std;
//移位密码:或叫凯撒密码
//功能推测:题目虽然没有讲但是我们可以从输入输出发现明文和密文大小写相反,可以在
class CaesarPassword {
string plaintext;
public:
CaesarPassword(string text) {
plaintext = text;
}
string encode(int key) { //加密:c=m+k(mod 26)
int len = plaintext.length(); //注意要求:加密小写输出大写,所以采用先减ascii到26以内再加回去的方法
for (int i = 0; i < len; i++) {
if (plaintext[i] >= 'a' && plaintext[i] <= 'z') { //密文是小写,转化密文为大写
plaintext[i] = (plaintext[i] - 'a' + key % 26) % 26 + 'A'; //由于减法后可能是负数,模完后可能还是负的,需要手动加26在模正
}
else plaintext[i] = (plaintext[i] - 'A' + key % 26) % 26 + 'a';
}
return plaintext;
}
string decode(int key) { //解密:m=c-k(mod 26)
int len = plaintext.length();
for (int i = 0; i < len; i++) {
if (plaintext[i] >= 'a' && plaintext[i] <= 'z') { //密文是小写,转化密文为大写
plaintext[i] = (plaintext[i] - 'a' - key % 26 + 26) % 26 + 'A'; //由于减法后可能是负数,模完后可能还是负的,需要手动加26在模正
}
else plaintext[i] = (plaintext[i] - 'A' - key % 26 + 26) % 26 + 'a';
}
return plaintext;
}
};
int main()
{
//cout << -10%3; //根据模的结果可知,负数模完后不会变为正数,所以在解密(减法)需要我们手动+一个周期,强制模正
string text;
int type, key;
while (cin >> type >> key >> text) {
CaesarPassword m(text);
if (type == 0)cout << m.encode(key) << endl;
else cout << m.decode(key) << endl;
}
}