正文

凯撒密码2008-10-25 20:37:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/goal00001111/39101.html

分享到:

/*  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);    }}

阅读(6015) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册