C++_信息论维吉尼亚编码

要点:1、输入密钥及明文文本,对明文文本进行预处理(将所有字母改为大写并去除文本中的标点符号和空格)后再加密;

          2、将加密后的密文保存为txt文本文档。

#include <iostream>
#include <fstream>
#include <string>
#include <vector>

using namespace std;

void getKey(string key, vector<int> &key_num);   
string pre(string ptxt);                         
void encrypt(vector<int> &key_num, int &index, string PTXT); 

int main()
{
	string key;           
	vector<int> key_num;  
	string ptxt;          
	string PTXT;          
	string tmp;
	int index = 0;        
	ofstream fout;       

	cout << "请输入密钥:  ";
	cin >> key;
	getline(cin, tmp);
	getKey(key, key_num);
	fout.open("encryption.txt");
	fout << "密钥: " << key << endl;

	cout << "输入明文换行后即进行加密" << endl;
	while (getline(cin, ptxt)) {
		PTXT = pre(ptxt);
		cout << "*明文*       " << ptxt << endl;
		fout << "*明文*       " << ptxt << endl;
		cout << "*预处理明文* " << PTXT << endl;
		fout << "*预处理明文* " << PTXT << endl;
		encrypt(key_num, index, PTXT);
	}
	fout.close();
	return 0;
}

void getKey(string key, vector<int> &key_num)
{
	int l = key.size();
	for (int i = 0; i < l; i++) {
		if (key[i] >= 'a')
			key_num.push_back(int(key[i]) - 97);
		else
			key_num.push_back(int(key[i]) - 65);
	}
}

string pre(string ptxt)
{
	string PTXT = "";
	int l = ptxt.size();
	for (int i = 0; i < l; i++) {
		if (ptxt[i] == ' ')
			continue;
		else if (ptxt[i] >= 'a')
			PTXT = PTXT + char(ptxt[i] - 32);
		else
			PTXT = PTXT + ptxt[i];
	}
	return PTXT;
}

void encrypt(vector<int> &key_num, int &index, string PTXT)
{
	ofstream fout;                   //输出文本
	fout.open("encryption.txt");
	int d = key_num.size();           //加密周期
	cout << "*密文*       ";
	for (int i = 0; i < PTXT.size(); i++, index++) {
		if (index == d)
			index = 0;
		int shift = key_num[index];   //当前位移数
		int p = PTXT[i] - 'A';        //当前明文字符下标
		int c = (p + shift) % 26;     //当前密文字符下标
		char ctxt = c + 'A';          //当前密文字符
		cout << ctxt;
		fout << ctxt;
	}
	cout << endl;
	fout << endl;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值