维吉尼亚算法 加解密 类封装
题目描述
【实验目的】
-
学习维吉尼亚算法的原理
-
学习维吉尼亚算法的实现
【实验原理】
- 算法原理
a) Vigenere密码是由法国密码学家Blaise de Vigenere于1858年提出的一种代换密码,它是多表代换密码的典型代表。
b) 定义:设m为某一固定的正整数,P、C和K分别为明文空间、密文空间和密钥空间,并且P=K=C=(Z26)m,对一个密钥k=(k1,k2,…,km),定义维吉尼亚密码的加解密算法如下:
Vigenere密码加密算法: ek(x1,x2,…,xm)=(x1+k1,x2+k2,…,xm+km)
Vigenere密码解密算法: dk(y1,y2,…,ym)=(y1-k1,y2-k2,…,ym-km)。
其中k=(k1,k2,…,km)是一个长为m的密钥字,密钥空间的大小为26m,所以对一个相对小的m,穷举密钥也需要很长的时间。如m=7,则密钥空间大小超过8×109,所以手工搜索非常困难。当明文的长度超过m时,可将明文串按长度m分局,然后对每一组使用密钥k加密。
- 算法参数
Vigenere密码算法主要有c、m、k三个个参数。c为密文,m是明文,k为密钥。
输入
第一行输入明文
第二行输入密钥
输出
第一行输出密文
第二行输出密文解密后得到的明文
输入样例1
xipuyangguang
best
输出样例1
ymhnzefzhysgh
xipuyangguang
接口使用
构造函数VirginiaPassword(原始文本:可以用来加密或解密)
加密方法encode(key:加密密钥),返回加密密文
解密方法decode(key:解密密钥),返回解密密文
代码实现 类封装
#include<iostream>
using namespace std;
//维吉尼亚算法
//功能推测:明文和密文大小写相同
class VirginiaPassword {
string plaintext;
public:
VirginiaPassword(string text) {
plaintext = text;
}
string encode(string key) { //加密
int mlen = plaintext.length(); //注意要求:加密小写输出大写,所以采用先减ascii到26以内再加回去的方法
int klen = key.length();
//循环次数不确定,所以用while,同时避免双循环
int count = 0;
while (count != mlen) {
plaintext[count] = (plaintext[count] - 'a' + (key[count % klen] - 'a')) % 26 + 'a';
count++;
}
return plaintext;
}
string decode(string key){ //解密
int mlen = plaintext.length(); //注意要求:加密小写输出大写,所以采用先减ascii到26以内再加回去的方法
int klen = key.length();
int count = 0;
while (count != mlen) {
plaintext[count] = (plaintext[count] - 'a' - (key[count % klen] - 'a')+26) % 26 + 'a';
count++;
}
return plaintext;
}
};
int main()
{
string text,key;
while (cin >> text >> key) { //循环输入直到输入文件流结束
VirginiaPassword m(text);
cout << m.encode(key)<<endl;
cout << m.decode(key) << endl;
}
}