题目描述

有一种方式是使用密钥进行加密的方法,就是对明文的每个字符使用密钥上对应的密码进行加密,最终得到密文

例如明文是abcde,密钥是234,那么加密方法就是a对应密钥的2,也就是a偏移2位转化为c;明文b对应密钥的3,就是b偏移3位转化为e,同理c偏移4位转化为g。这时候密钥已经使用完,那么又重头开始使用。因此明文的d对应密钥的2,转化为f,明文的e对应密钥的3转化为h。所以明文abcde,密钥234,经过加密后得到密文是cegfh。

如果字母偏移的位数超过26个字母范围,则循环偏移,例如字母z偏移2位,就是转化为b,同理字母x偏移5位就是转化为c

要求:

使用三个指针p、q、s分别指向明文、密钥和密文,然后使用指针p和q来访问每个位置的字符,进行加密得到密文存储在指针s指向的位置。

除了变量定义和输入数据,其他过程都不能使用数组下标法,必须使用三个指针来访问明文、密钥和密文。

提示:当指针q已经移动到密钥的末尾,但明文仍然没有结束,那么q就跳回密钥头

输入

第一行输入t表示有t个测试实例

第二行输入一个字符串,表示第一个实例的明文, 字符串的最大长度不超过20

第三行输入一个数字串,表示第一个实例的密钥,数字串的最大长度不超过20

依次输入t个实例

输出

每行输出加密后的密文

输入样例

2
abcde
234
XenOS
56

输出样例

cegfh
CksUX

代码

#include <iostream>
#include <string.h>
using namespace std;
int main()
{int t;cin >> t;char *p, *s;char *q;for(int i = 0; i < t; i++){int j=0;char a[21];char b[21];cin >> a;cin >> b;s = new char[21];p = &a[0];q = &b[0];for (int o = 0; o <= strlen(a); o++) {j = o % strlen(q);if (*(p + o) >= 'a' && *(p + o) <= 'z') {*(s + o) = (*(p + o) + *(q + j) - '0' - 'a') % 26 + 'a';}if (*(p + o) >= 'A' && *(p + o) <= 'Z') {*(s + o) = (*(p + o) + *(q + j) - '0' - 'A') % 26 + 'A';}}for (int o = 0; o < strlen(a); o++) {cout << *(s+o);}cout << endl;delete[]s;}return 0;
}

假如不用指针,我们可以让代码变得更简洁:

#include <iostream>
#include<string.h>
using namespace std;int main()
{char info[20],code[20];int testnum;cin >> testnum;while (testnum--){cin >> info>>code;int j = 0;for (int i = 0; i < strlen(info); i++) {if (code[j] == 0)j = 0;info[i] += code[j]-'0';if (info[i] > 'Z' && info[i] < 'a')info[i] -= 26;if (info[i] > 'z')info[i] -= 26;j++;}cout << info<<endl;}
}

另外提供函数封装版:

#include <iostream>
#include <cstring>
using namespace std;
char* encrypted(char* m, char* n) {          //m为明文,n为密钥,返回res为密文char* res = new char[21];/*加密过程*/int lenm = strlen(m), lenn = strlen(n),i=0,j=0;//cout << lenm <<"   " << lenn << endl;for (i = 0; i < lenm; i++) {if (*(n+j)==0)j = 0;*(res+i) = *(m + i) + *(n + j) - '0';          //如果可以不按题目要求,可以直接修改指针指向的数据,不必拷贝到新内存区if (*(res + i) >= 'Z' && *(res + i) <= 'a')*(res + i) -= 26;else if (*(res + i) >= 'z' )*(res + i) -= 26;//cout << *(res + i);j++;}*(res + i) = 0;             //注意要加结束符号'\0',即ascii码“0”,作为字符串结尾方便打印//cout << endl;return res;
}int main()
{int t;cin >> t;while (t--) {char* str1 = new char[21];         //这里可以直接 char str1[21] 替代。char* str2 = new char[21];         //同上,分配动态内存,动态内存存放在堆空间中cin >> str1 >> str2;char* pres = encrypted(str1, str2);int n = 0;                          //输出密文//cout<<pres<<endl;while (*(pres + n) != 0) {          // 这里可以直接 cout << pres<<endl;cout << *(pres + n);            //因为有结束符'\0',输出整个字符数组n++;}cout << endl;           delete[]str1;delete[]str2;}return 0;
}

声明:答案仅供参考,代码仅代表通过了oj测试样例,不代表逻辑的绝对严谨,如有疑问欢迎提出。

更新日志:文章将保持更新纠错
最后一次更新2022/9/12

【C++】密钥加密法(指针应用)相关推荐

  1. 密钥加密法(指针应用)

    题目描述 有一种方式是使用密钥进行加密的方法,就是对明文的每个字符使用密钥上对应的密码进行加密,最终得到密文 例如明文是abcde,密钥是234,那么加密方法就是a对应密钥的2,也就是a偏移2位转化为 ...

  2. C++实验课指针笔记2

    照旧,最后两道题需要记录一下 文章目录 [id:16][20分]D. 动态矩阵(指针与堆内存分配) [id:18][20分]E. 密钥加密法(指针应用## 1.引入库 总结 [id:16][20分]D ...

  3. AES,DES,3DES的区别

    DES 1977年1月,美国政府颁布:采纳IBM公司设计的方案作为非机密数据的正式数据加密标准(DES Data Encryption Standard) . 目前在国内,随着三金工程尤其是金卡工程的 ...

  4. DES/3DES/AES加密及区别

    DES 1977年1月,美国政府颁布:采纳IBM公司设计的方案作为非机密数据的正式数据加密标准(DES Data Encryption Standard) . 目前在国内,随着三金工程尤其是金卡工程的 ...

  5. 全国计算机等级考试(三级网络)基本概念与名词解释

    一.计算机基础知识部分 1.         计算机系统发展历程:电子管计算机.晶体管计算机.集成电路计算机.大规模及超大规模集成电路计算机. 2.         电子计算机时代开始的标志:以美国1 ...

  6. 计算机等级考试(三级网络)基本概念与名词解释

    计算机等级考试(三级网络)基本概念与名词解释 作者:yt125 发表时间: 2005/07/26 22:04 点击:1329次 发帖得万元!   活动官方论坛 修改  精华  删除  置顶  来源   ...

  7. java基础知识精华总结 java面试题 深圳酷琪 kuuqii.com 电脑配件软件 硬件一体化采购平台

    1.文件拷贝,把一个文件的内容拷贝到另外一个文件里 package order; import java.io.File; import java.io.FileInputStream; import ...

  8. 3DES文件加密程序

    参照<<密码学引论>> 第二版 张焕国 王张宜编著这本书,用MFC编写的框架,实现的使用3DES对文件进行加解密的程序 转载请说明来源 : enjoy5512的博客 http: ...

  9. DES/3DES/AES区别

    DES/3DES/AES区别 公元前400年,古希腊人发明了置换密码.1881年世界上的第一个电话保密专利出现.在第二次世界大战期间,德国军方启用"恩尼格玛"密码机,密码学在战争中 ...

最新文章

  1. 下面为初学者分享一下SQL 数据库学习资料
  2. 如何优化网站结构才促使网站排名“节节高”?
  3. Hlg 1407 【最小点权覆盖】.cpp
  4. 电气:电能扰动质量数据集模拟生成(matlab)
  5. android win7 共享网络打印机,win7系统设置共享网络打印机的操作方法
  6. 一步步将 SAP Commerce Mock 应用部署到 SAP BTP Kyma Runtime
  7. 使用c#接入华为云-内容审核
  8. tensor backward_Pytorch中的backward函数
  9. 20190905:(leetcode习题)爬楼梯
  10. python文件、存储、压缩
  11. 在Mac OS X中配置Apache + PHP + MySQL 很详细
  12. linux常用命令技巧
  13. C# 快递单批量打印
  14. 微博文摘——女人与ITIL
  15. mac 怎么抓取 iphone 手机 日志
  16. 从阿里云dms导出mysql无法导入_MySQL数据库怎么导入数据?怎么用DMS导入数据?...
  17. 微信朋友圈的软文写作技巧
  18. 纯JS+HTML+CSS实现表格增删改查翻页--模板文件管理
  19. 华为v3鸿蒙系统_安卓系统:鸿蒙系统,正式再见
  20. 在python中解压rar文件

热门文章

  1. 程序设计作业_函数实验_体测成绩判定系统
  2. Vegas媒体生成器功能介绍
  3. AOP的底层原理:动态代理
  4. 查看mysql存储引擎及修改默认存储引擎
  5. MPC学习笔记1:基于状态空间模型的预测控制(1)
  6. 一些十分有用的字符串相关的函数,在写串口解析,TCP HTTP通信时有用
  7. 简历解析步骤(第一步)技术与实现(1)识文字,取信息
  8. 博士申请 | 美国加州大学圣克鲁兹分校王鑫教授招收NLP/CV方向全奖博士生
  9. 检测服务器端口是否被封(墙)
  10. 基于Java的学生课程管理系统的设计和实现