正文

凯撒密码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);
    }
}

阅读(5641) | 评论(0)


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

评论

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