【C++】密钥加密法(指针应用)
题目描述
有一种方式是使用密钥进行加密的方法,就是对明文的每个字符使用密钥上对应的密码进行加密,最终得到密文
例如明文是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++】密钥加密法(指针应用)相关推荐
- 密钥加密法(指针应用)
题目描述 有一种方式是使用密钥进行加密的方法,就是对明文的每个字符使用密钥上对应的密码进行加密,最终得到密文 例如明文是abcde,密钥是234,那么加密方法就是a对应密钥的2,也就是a偏移2位转化为 ...
- C++实验课指针笔记2
照旧,最后两道题需要记录一下 文章目录 [id:16][20分]D. 动态矩阵(指针与堆内存分配) [id:18][20分]E. 密钥加密法(指针应用## 1.引入库 总结 [id:16][20分]D ...
- AES,DES,3DES的区别
DES 1977年1月,美国政府颁布:采纳IBM公司设计的方案作为非机密数据的正式数据加密标准(DES Data Encryption Standard) . 目前在国内,随着三金工程尤其是金卡工程的 ...
- DES/3DES/AES加密及区别
DES 1977年1月,美国政府颁布:采纳IBM公司设计的方案作为非机密数据的正式数据加密标准(DES Data Encryption Standard) . 目前在国内,随着三金工程尤其是金卡工程的 ...
- 全国计算机等级考试(三级网络)基本概念与名词解释
一.计算机基础知识部分 1. 计算机系统发展历程:电子管计算机.晶体管计算机.集成电路计算机.大规模及超大规模集成电路计算机. 2. 电子计算机时代开始的标志:以美国1 ...
- 计算机等级考试(三级网络)基本概念与名词解释
计算机等级考试(三级网络)基本概念与名词解释 作者:yt125 发表时间: 2005/07/26 22:04 点击:1329次 发帖得万元! 活动官方论坛 修改 精华 删除 置顶 来源 ...
- java基础知识精华总结 java面试题 深圳酷琪 kuuqii.com 电脑配件软件 硬件一体化采购平台
1.文件拷贝,把一个文件的内容拷贝到另外一个文件里 package order; import java.io.File; import java.io.FileInputStream; import ...
- 3DES文件加密程序
参照<<密码学引论>> 第二版 张焕国 王张宜编著这本书,用MFC编写的框架,实现的使用3DES对文件进行加解密的程序 转载请说明来源 : enjoy5512的博客 http: ...
- DES/3DES/AES区别
DES/3DES/AES区别 公元前400年,古希腊人发明了置换密码.1881年世界上的第一个电话保密专利出现.在第二次世界大战期间,德国军方启用"恩尼格玛"密码机,密码学在战争中 ...
最新文章
- 下面为初学者分享一下SQL 数据库学习资料
- 如何优化网站结构才促使网站排名“节节高”?
- Hlg 1407 【最小点权覆盖】.cpp
- 电气:电能扰动质量数据集模拟生成(matlab)
- android win7 共享网络打印机,win7系统设置共享网络打印机的操作方法
- 一步步将 SAP Commerce Mock 应用部署到 SAP BTP Kyma Runtime
- 使用c#接入华为云-内容审核
- tensor backward_Pytorch中的backward函数
- 20190905:(leetcode习题)爬楼梯
- python文件、存储、压缩
- 在Mac OS X中配置Apache + PHP + MySQL 很详细
- linux常用命令技巧
- C# 快递单批量打印
- 微博文摘——女人与ITIL
- mac 怎么抓取 iphone 手机 日志
- 从阿里云dms导出mysql无法导入_MySQL数据库怎么导入数据?怎么用DMS导入数据?...
- 微信朋友圈的软文写作技巧
- 纯JS+HTML+CSS实现表格增删改查翻页--模板文件管理
- 华为v3鸿蒙系统_安卓系统:鸿蒙系统,正式再见
- 在python中解压rar文件