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
- #include
- 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
- #include
- 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
- #include
- 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;
- }
输出: