Vernam加密解密C++实现

来源:互联网 发布:知识发现与数据挖掘 编辑:程序博客网 时间:2024/05/01 22:33

 


#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main()
{
string plain,ciper,key;
int len; //长度三者一致
void change(string &, vector<int>&);//字符变数字
vector<int> encrypt_compute(vector<int> m,vector<int> k);//加密计算
vector<int> discrypt_compute(vector<int> c,vector<int> k);//解密计算
void re_change( vector<int>&,string &);//数字变字符

int flag; //操作标记
do
{
cout<<"请选择操作:1、加密 2、解密 3、结束:";
cin>>flag;
if(flag==1)
{
cout<<"请输入明文:";
cin>>plain;
cout<<"请输入相同长度的密钥:";
cin>>key;
len = plain.size();
vector<int> p,c,k; //存变换的数字
change(plain, p);
change(key, k); //字母->数字
c = encrypt_compute(p,k);
re_change(c,ciper); //数字->字母
cout<<"密文是:"<<ciper<<endl;

}
if(flag==2)
{
cout<<"请输入密文:";
cin>>ciper;
cout<<"请输入相同长度的密钥:";
cin>>key;
len = ciper.size();
vector<int> p,c,k; //存变换的数字
change(ciper, c);
change(key, k); //字母->数字
p = discrypt_compute(c,k);
plain="";//清空明文原来的值
re_change(p,plain);
cout<<"明文是:"<<plain<<endl;
}
}while(flag!=3);
return 0;
}

void change(string &plain, vector<int>&number) //字母变数字
{
for (unsigned int i=0;i<plain.size();i++)
{
number.push_back(plain[i]-97); //a为0
}
}
vector<int> encrypt_compute(vector<int> m,vector<int> k) //加密计算
{
vector<int> sum;

for(unsigned int i=0; i<m.size(); i++)
{
sum.push_back((m[i]+k[i])%26);
}
return sum;
}
vector<int> discrypt_compute(vector<int> c,vector<int> k) //解密计算
{
vector<int> resum;
int temp;
for(unsigned int i=0; i<c.size(); i++)
{
temp = c[i]-k[i];
if(temp<0) temp+=26;
resum.push_back(temp);
}
return resum;

}
void re_change( vector<int>& sum,string &c) //数字变字符
{
string temp;//用于处理insert函数变量传递
for (unsigned int i=0;i<sum.size();i++)
{
temp=sum[i]+97;
c.insert(i,temp);//a为0
}

}

 

原创粉丝点击