/* Name: Copyright: Author: Date: 25-10-08 20:34 Description: 凯撒密码(caeser)是罗马扩张时期朱利斯o凯撒(Julius Caesar)创造的,用于加密通过信使传递的作战命令。它将字母表中的字母移动一定位置而实现加密。注意26个字母循环使用,z的后面可以堪称是a。 凯撒密码的加密算法极其简单。其加密过程如下:在这里,我们做此约定:明文记为m,密文记为c,加密变换记为E(key1,m)(其中key1为密钥),解密变换记为D(key2,m)(key2为解密密钥)(在这里key1=key2,不妨记为key)。凯撒密码的加密过程可记为如下一个变换:c≡m+key (mod n) (其中n为基本字符个数)同样,解密过程可表示为:m≡c+key (mod n) (其中n为基本字符个数)*/#include <iostream>#include <fstream>#include <vector>#include <string>using namespace std;bool ReadFile(vector<string> & article, char * fileName);bool WriteFile(const vector<string> & article, char * fileName);void Encrypt(const vector<string> & proclaimedInWriting, vector<string> & cryptograph, int key);void Decode(const vector<string> & cryptograph, vector<string> & proclaimedInWriting, int key);int main(void){ vector<string> article, proclaimedInWriting, cryptograph; int k = 3; if (ReadFile(article, "原文.txt")) //读取文章 { Encrypt(article, cryptograph, k); //转换为密文 } if (WriteFile(cryptograph, "密文.txt")) //写入数据 { for (int i=0; i<cryptograph.size(); i++) { cout << cryptograph[i] << endl; } } cryptograph.resize(0); if (ReadFile(cryptograph, "密文.txt")) //读取文章 { Decode(cryptograph, proclaimedInWriting, k); //转换为明文 } if (WriteFile(proclaimedInWriting, "明文.txt")) //写入数据 { for (int i=0; i<proclaimedInWriting.size(); i++) { cout << proclaimedInWriting[i] << endl; } } system("pause"); return 0;}//从文件中读取数据 bool ReadFile(vector<string> & article, char * fileName){ ifstream in(fileName); if (!in) { return false; } string buf; while (getline(in, buf, '\n')) { article.push_back(buf); } in.close(); return true;}//写数据到文件 bool WriteFile(const vector<string> & article, char * fileName){ ofstream out(fileName); if (!out) { return false; } for (int i=0; i<article.size(); i++) { out << article[i] << endl; } out.close(); return true;}/*函数功能:使用凯撒密码原理,对明文进行加密,返回密文 函数名:Encrypt输入值:const vector<string> & proclaimedInWriting,存储了明文的字符串数组 vector<string> & cryptograph,用来存储密文的字符串数组 int keyey,加密密匙,正数表示后移,负数表示前移 返回值:无返回值,但是要将新的密文字符串返回 */ void Encrypt(const vector<string> & proclaimedInWriting, vector<string> & cryptograph, int key){ const int MAX = 256; //字符个数 for (int i=0; i<proclaimedInWriting.size(); i++) { string buf; for (int j=0; j<proclaimedInWriting[i].size(); j++) { buf += (proclaimedInWriting[i][j] + key) % MAX; } cryptograph.push_back(buf); }}/*函数功能:使用凯撒密码原理,对密文进行解密,返回明文 函数名:Decode输入值:vector<string> & proclaimedInWriting,用来存储明文的字符串数组 const vector<string> & cryptograph,存储了密文的字符串数组 int keyey,解密密匙,正数表示前移,负数表示后移(与加密相反) 返回值:无返回值,但是要将新的明文字符串返回 */ void Decode(const vector<string> & cryptograph, vector<string> & proclaimedInWriting, int key){ const int MAX = 256; //字符个数 for (int i=0; i<cryptograph.size(); i++) { string buf; for (int j=0; j<cryptograph[i].size(); j++) { buf += (cryptograph[i][j] - key + MAX) % MAX; } proclaimedInWriting.push_back(buf); }}

评论