蓝桥杯 加密
2016-05-23 20:11
190 查看
2. 加密
在对文本进行简单加密的时候,可以选择用一个n位的二进制数,对原文进行异或运算。
解密的方法就是再执行一次同样的操作。
加密过程中n位二进制数会循环使用。并且其长度也可能不是8的整数倍。
下面的代码演示了如何实现该功能。
请仔细阅读,填写空缺的代码(下划线部分)。
注意:请把填空的答案(仅填空处的答案,不包括题面)存入考生文件夹下对应题号的“解答.txt”中即可。
直接写在题面中不能得分。
[cpp] view
plain copy
#include <cstdio>
#include <cstring>
#include <cstdlib>
using namespace std;
void f(char* buf, unsigned char* uckey, int n)
{
int i;
for(i=0; i<n; i++)
buf[i] = buf[i] ^ uckey[i];
}
int main(int argc, char* argv[])
{
char p[] = "abcd中国人123"; // 待加密串
char* key = "11001100010001110"; //以串的形式表达的密匙,运算时要转换为按位存储的形式。
int np = strlen(p);
int nk = strlen(key);
unsigned char* uckey = (unsigned char*)malloc(np);
// 密匙串需要按位的形式循环拼入 uckey中
int i;
for(i=0; i<np*8; i++)
{
if(key[i%nk]=='1')
uckey[i/8]=uckey[i/8]|(1<<(i%nk)); // 填空1
else
uckey[i/8]=uckey[i/8]&~(1<<(i%nk)); // 填空2
}
f(p, uckey, strlen(p));
printf("%s\n", p);
f(p, uckey, strlen(p));
printf("%s\n", p);
free(uckey);
return 0;
}
思想是:用key码循环重复填充出一个与p串等长的uckey串,用uckey与p求异或加密。
在对文本进行简单加密的时候,可以选择用一个n位的二进制数,对原文进行异或运算。
解密的方法就是再执行一次同样的操作。
加密过程中n位二进制数会循环使用。并且其长度也可能不是8的整数倍。
下面的代码演示了如何实现该功能。
请仔细阅读,填写空缺的代码(下划线部分)。
注意:请把填空的答案(仅填空处的答案,不包括题面)存入考生文件夹下对应题号的“解答.txt”中即可。
直接写在题面中不能得分。
[cpp] view
plain copy
#include <cstdio>
#include <cstring>
#include <cstdlib>
using namespace std;
void f(char* buf, unsigned char* uckey, int n)
{
int i;
for(i=0; i<n; i++)
buf[i] = buf[i] ^ uckey[i];
}
int main(int argc, char* argv[])
{
char p[] = "abcd中国人123"; // 待加密串
char* key = "11001100010001110"; //以串的形式表达的密匙,运算时要转换为按位存储的形式。
int np = strlen(p);
int nk = strlen(key);
unsigned char* uckey = (unsigned char*)malloc(np);
// 密匙串需要按位的形式循环拼入 uckey中
int i;
for(i=0; i<np*8; i++)
{
if(key[i%nk]=='1')
uckey[i/8]=uckey[i/8]|(1<<(i%nk)); // 填空1
else
uckey[i/8]=uckey[i/8]&~(1<<(i%nk)); // 填空2
}
f(p, uckey, strlen(p));
printf("%s\n", p);
f(p, uckey, strlen(p));
printf("%s\n", p);
free(uckey);
return 0;
}
思想是:用key码循环重复填充出一个与p串等长的uckey串,用uckey与p求异或加密。
相关文章推荐
- [算法]很特别的一个动态规划入门教程
- echart图表的各种参数介绍
- Java网络编程入门
- 第12周阅读程序(4)
- 九度OJ-1088剩下的树
- 2016.5.21【初中部 NOIP提高组 】模拟赛A 总结
- BZOJ2733 永无乡
- StringBuffer 与 StringBuilder
- uva 442 Matrix Chain Multiplication
- HDU 1214 圆桌会议
- 斜堆
- C++中skipws、ws两者有什么区别
- 【经典算法】:把String变为double型的方法
- <TextArea> 中存在\t \n \r 的解决方法
- selenium webdriver+testng自定义html测试报告
- 安卓测试
- C++读写文件
- 如何处理异常? catch Exception OR catch Throwable
- Linux的IO模型
- express-session(express4.0与express 3.0的区别)