• 不能说的秘密:加密信件


    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++表示为:

    1. char c = 'a';
    2. c = c + 3;//加密过程
    3. c == 'd';//经过加密之后,字符变量由'a'变成了 'd'

    有些字母([x~z])后面没有字母了,这时候需要循环移动到前面的字母。

    例如:

    x -> a

    y -> b

    z -> c

    这种情况,可以用下面的C++代码来实现:

    1. char c = 'x';//假设字符c是 x y z中的一个
    2. c = 'a' + (c - 'x');//当我们得到加密后结果的时候,我只需要看字符'a'需要往后移动几次,这可以通过 c-'x'来得到

    解密过程

    解密过程考虑的问题和加密相反,参考加密过程即可。

    字母在计算机中用char表示,std::string用来存放连续的多个char

    我们可以把字符串存放在std::string中。使用字符串的下标操作来获取以及修改字符串中的每个字符。

    具体的修改方法就是先判断字符的范围,再根据上面的规律来做转换。

    本文需要的知识点包括:

    C++变量和基本类型 引用类型 输出变量 换行显示 namespace 修改变量的值(变量与常量)

    算术表达式 关系运算符和逻辑运算符 for循环语句 if语句 函数定义与调用 向函数传递参数

    输入变量(cin 及字符串类型string) 数组 vector

    1. #include
    2. #include
    3. using namespace std;
    4. void encode(string& original)
    5. {
    6. for (size_t i = 0; i < original.size(); ++i)
    7. {
    8. char c = original[i];
    9. if ('a' <= c && c <= 'w')
    10. {
    11. original[i] = c + 3;//往后走3个字母
    12. }
    13. else if ('x' <= c && c <= 'z')
    14. {
    15. original[i] = c - 'x' + 'a';//从字母a开始往后走
    16. }
    17. }
    18. }
    19. void decode(string& mail)
    20. {
    21. for (size_t i = 0; i < mail.size(); ++i)
    22. {
    23. char c = mail[i];
    24. if ('d' <= c && c <= 'z')
    25. {
    26. mail[i] = c - 3;//往前退3个字母
    27. }
    28. else if ('a' <= c && c <= 'c')
    29. {
    30. mail[i] = c - 'a' + 'x';//从字母x开始往后走
    31. }
    32. }
    33. }
    34. int main()
    35. {
    36. string mail("i love you.");
    37. encode(mail);
    38. cout<<"encoded:" << mail << endl;
    39. decode(mail);
    40. cout << "decoded:" << mail << endl;
    41. return 0;
    42. }

    程序输出如下:

    加密后的密文和解密后的明文

    解法2:增加大小写支持:

    1. #include
    2. #include
    3. using namespace std;
    4. void encode(string& original)
    5. {
    6. for (size_t i = 0; i < original.size(); ++i)
    7. {
    8. char c = original[i];
    9. if (('A' <= c && c <= 'W')||('a' <= c && c <= 'w'))
    10. {
    11. original[i] = c + 3;//往后走3个字母
    12. }
    13. else if (('X' <= c && c <= 'Z')||('x' <= c && c <= 'z'))
    14. {
    15. original[i] = c - 'X' + 'A';//从字母a开始往后走
    16. }
    17. }
    18. }
    19. void decode(string& mail)
    20. {
    21. for (size_t i = 0; i < mail.size(); ++i)
    22. {
    23. char c = mail[i];
    24. if(('D' <= c && c <= 'Z')||('d' <= c && c <= 'z'))
    25. {
    26. mail[i] = c - 3;//往前退3个字母
    27. }
    28. else if(('A' <= c && c <= 'C')||('a' <= c && c <= 'c'))
    29. {
    30. mail[i] = c - 'A' + 'X';//从字母x开始往后走
    31. }
    32. }
    33. }
    34. int main()
    35. {
    36. string mail("I love you.");
    37. encode(mail);
    38. cout << "encoded:" << mail << endl;
    39. decode(mail);
    40. cout << "decoded:" << mail << endl;
    41. return 0;
    42. }

    程序输出如下:

    加密后的密文和解密后的明文

    解法3:同类型字母统一处理:

    1. #include
    2. #include
    3. using namespace std;
    4. void encode(string& original)
    5. {
    6. int length = 26;
    7. for (size_t i = 0; i < original.size(); ++i)
    8. {
    9. char c = original[i];
    10. char start = ('a' <= c && c <= 'z') ? 'a' : 'A';
    11. if (('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z'))
    12. {
    13. original[i] = (c - start + 3) % length + start;//往后走3个字母
    14. }
    15. }
    16. }
    17. void decode(string& mail)
    18. {
    19. int length = 26;
    20. for (size_t i = 0; i < mail.size(); ++i)
    21. {
    22. char c = mail[i];
    23. char start = ('a' <= c && c <= 'z') ? 'a' : 'A';
    24. if (('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z'))
    25. {
    26. mail[i] = (c - start - 3 + length/*重新变成正数*/) % length + start;//往前退3个字母
    27. }
    28. }
    29. }
    30. void test(string str)
    31. {
    32. cout << "original:" << str << endl;
    33. encode(str);
    34. cout << "encoded :" << str << endl;
    35. decode(str);
    36. cout << "decoded :" << str << endl;
    37. cout << endl;
    38. }
    39. int main()
    40. {
    41. 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");
    42. 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");
    43. test("I love you.");
    44. return 0;
    45. }

    输出:

  • 相关阅读:
    前端使用github pages 部署自己的网站
    Transformer:开源机器学习项目,上千种预训练模型 | 开源日报 No.66
    MyBatis构建SQL
    2019年计网408
    易基因|ONT:三代原核甲基化在痤疮杆菌噬菌体表观遗传印迹中的工程选择性研究
    1055 集体照(测试点3, 4, 5)
    Dolphinscheduler3.0源码分析
    【前端笔记】git的使用
    如何判断一个英文单词中是否存在重复字母
    【笔试实战】LeetCode题单刷题-编程基础 0 到 1【一】
  • 原文地址:https://blog.csdn.net/ClamReason/article/details/126866108