有一种加密方法为:其使用一个字母串(可以含重复字母,字母个数不超过50)作为密钥。假定密钥单词串为feather,则先去掉密钥单词中的重复字母得到单词串feathr,然后再将字母表中的其它字母以反序追加到feathr的后面:
其中第一行为原始英文字母,第二行为对应加密字母。其它字符不进行加密。编写一个程序,用这种密码加密文件。假定要加密的文件名为encrypt.txt及加密后的文件名为output.txt,并假定输入文件中字母全为小写字母,并且输入密钥也全为小写字母。
【输入形式】
从标准输入中输入密钥串,并从文件encrypt.txt中读入要加密的内容。
【输出形式】
加密后结果输出到文件output.txt中。
【样例输入】
feather
和文件encrypt.txt中内容,例如被加密的文件encrypt.txt中内容为:
c language is wonderful.
【样例输出】
加密后output.txt文件中内容为:
a ufqzjfzh xl gpqthmrju.
【样例说明】
首先将给定的密钥单词去除重复字母,然后按照上面的加密对应表对encrypt.txt文件内容进行加密即可得到加密后的文件,其中只对英文字母进行加密对换,并且假设encrypt.txt中的英文字母全是小写字母。
代码:
#include<iostream>
#include<fstream>
using namespace std;
int main()
{
ifstream infile;
ofstream outfile;
const int buf_size = 256;
const int max = 26;
char c[buf_size],d[buf_size];
char buff[buf_size];
char b[buf_size]{ 'z','y','x','w','v','u','t','s','r','q','p','o','n','m','l','k','j','i','h','g','f','e','d','c','b','a'};
char a[buf_size]{ 'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z' };
infile.open("encrypt.txt", ios::in);
if (!infile) { cout << "file can't open.\n"; }
outfile.open("output.txt", ios::out);
if (!outfile) { cout << "file can't open.\n"; }
int i = 0,j, len = 0,len1=max;
cin >> buff;
while (buff[i] != 0) {
i++; len++; }
for (i = 0; i < len; i++)//去重
{
for (int j = i+1; j < len; j++)
{
if (buff[j] == buff[i])
{
for(int k=j;k<len-1;k++)
buff[k] = buff[k + 1];
j--;
len--;
}
}
}
for (i = 0; i < len1; i++)
{
for (int j = 0; j < len; j++)
{
if (buff[j] == b[i])
{
if (i != len1 - 1)
{
for (int k = i; k < len1 - 1; k++)
b[k] = b[k + 1];
len1--;
i--;
continue;
}
else { b[i] = 0; len1--; }
}
}
}
for (i = 0; i < len1; i++) { buff[len++] = b[i]; }
infile.getline(c, buf_size);
infile.close();
for (i = 0; i < sizeof(c); i++)
{
for ( j = 0; j < len; j++)
{
if (c[i] == a[j])
{
d[i] = buff[j];
break;
}
}
if (j == len)d[i] = c[i];
}
outfile << d;
outfile.close();
return 0;
}