i love you.
这么直接的表达,被人看到了可不好。
怎么办呢?加密。接收到信息的人再解密。
只要双方知道加密解密的规则,就可以做到哪怕信息泄露了,别人也不知道写的是什么。
比如下面这个简单的加密规则:每个字母使用其字母表后面的第3个字母替代,最后x变成a,y变成b,z变成c。
也就是:(1)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
要变成:(2)d e f g h i j k l m n o p q r s t u v w x y z a b c
这样经过加密之后,上面的明文"i love you."(未经过加密的信息)就变成了下面的密文(加密后的信息):
l oryh brx.
加密过程
如果要实现上面的加密,解密过程,我们只需要根据规律,把字母做对应的转换即可。
利用C++字符类型的加减法运算即可实现加密解密
例如,字母 a([a~w]),经过加密,变成 a + 3 = d
可以用C++表示为:
char c = 'a';
c = c + 3;//加密过程
c == 'd';//经过加密之后,字符变量由'a'变成了 'd'。

有些字母([x~z])后面没有字母了,这时候需要循环移动到前面的字母。
例如:
x -> a
y -> b
z -> c
这种情况,可以用下面的C++代码来实现:
char c = 'x';//假设字符c是 x y z中的一个
c = 'a' + (c - 'x');//当我们得到加密后结果的时候,我只需要看字符'a'需要往后移动几次,这可以通过 c-'x'来得到

解密过程
解密过程考虑的问题和加密相反,参考加密过程即可。
字母在计算机中用char表示,std::string用来存放连续的多个char。
我们可以把字符串存放在std::string中。使用字符串的下标操作来获取以及修改字符串中的每个字符。
具体的修改方法就是先判断字符的范围,再根据上面的规律来做转换。
本文需要的知识点包括:
C++变量和基本类型 引用类型 输出变量 换行显示 namespace 修改变量的值(变量与常量)
算术表达式 关系运算符和逻辑运算符 for循环语句 if语句 函数定义与调用 向函数传递参数
输入变量(cin 及字符串类型string) 数组 vector
#include <iostream>
#include <string>
using namespace std;
void encode(string& original)
{
for (size_t i = 0; i < original.size(); ++i)
{
char c = original[i];
if ('a' <= c && c <= 'w')
{
original[i] = c + 3;//往后走3个字母
}
else if ('x' <= c && c <= 'z')
{
original[i] = c - 'x' + 'a';//从字母a开始往后走
}
}
}
void decode(string& mail)
{
for (size_t i = 0; i < mail.size(); ++i)
{
char c = mail[i];
if ('d' <= c && c <= 'z')
{
mail[i] = c - 3;//往前退3个字母
}
else if ('a' <= c && c <= 'c')
{
mail[i] = c - 'a' + 'x';//从字母x开始往后走
}
}
}
int main()
{
string mail("i love you.");
encode(mail);
cout<<"encoded:" << mail << endl;
decode(mail);
cout << "decoded:" << mail << endl;
return 0;
}
程序输出如下:

加密后的密文和解密后的明文
解法2:增加大小写支持:
#include <iostream>
#include <string>
using namespace std;
void encode(string& original)
{
for (size_t i = 0; i < original.size(); ++i)
{
char c = original[i];
if (('A' <= c && c <= 'W')||('a' <= c && c <= 'w'))
{
original[i] = c + 3;//往后走3个字母
}
else if (('X' <= c && c <= 'Z')||('x' <= c && c <= 'z'))
{
original[i] = c - 'X' + 'A';//从字母a开始往后走
}
}
}
void decode(string& mail)
{
for (size_t i = 0; i < mail.size(); ++i)
{
char c = mail[i];
if(('D' <= c && c <= 'Z')||('d' <= c && c <= 'z'))
{
mail[i] = c - 3;//往前退3个字母
}
else if(('A' <= c && c <= 'C')||('a' <= c && c <= 'c'))
{
mail[i] = c - 'A' + 'X';//从字母x开始往后走
}
}
}
int main()
{
string mail("I love you.");
encode(mail);
cout << "encoded:" << mail << endl;
decode(mail);
cout << "decoded:" << mail << endl;
return 0;
}
程序输出如下:

加密后的密文和解密后的明文
解法3:同类型字母统一处理:
#include <iostream>
#include <string>
using namespace std;
void encode(string& original)
{
int length = 26;
for (size_t i = 0; i < original.size(); ++i)
{
char c = original[i];
char start = ('a' <= c && c <= 'z') ? 'a' : 'A';
if (('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z'))
{
original[i] = (c - start + 3) % length + start;//往后走3个字母
}
}
}
void decode(string& mail)
{
int length = 26;
for (size_t i = 0; i < mail.size(); ++i)
{
char c = mail[i];
char start = ('a' <= c && c <= 'z') ? 'a' : 'A';
if (('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z'))
{
mail[i] = (c - start - 3 + length/*重新变成正数*/) % length + start;//往前退3个字母
}
}
}
void test(string str)
{
cout << "original:" << str << endl;
encode(str);
cout << "encoded :" << str << endl;
decode(str);
cout << "decoded :" << str << endl;
cout << endl;
}
int main()
{
test("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");
test("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");
test("I love you.");
return 0;
}
输出:

728

被折叠的 条评论
为什么被折叠?



