不能说的秘密:加密信件

C++自学精简教程 目录(必读)

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;
}

输出:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

C++程序员Carea

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值