关于加密算法代码中(int)message[i]的含义及对应代码行作用的技术问询
关于加密算法代码中
(int)message[i]的含义及对应代码行作用的技术问询 以下是老师给出的加密示例代码:
string encrypt(const string message) { srand(time(0)); static int secret = rand() % 32000; string output; int i = 0, a = 0, b = 1, c = 0; for (i = 0; i < message.size(); ++i) { output += ((int)message[i]) - (secret + c); c = a + b; a = b; b = c; } return output; }我还是搞不懂
(int)message[i]是什么意思?还有这一行程序到底在做什么?
一、先搞懂(int)message[i]到底是什么
在C++里,string里的每个元素message[i]是char类型的字符,而char本身其实是个8位的小整数——它对应的就是这个字符的ASCII码值。(int)在这里是强制类型转换,说白了就是把字符转成它对应的ASCII整数。
举个实际例子:如果message[i]是字母'B',它的ASCII码是66,那(int)message[i]的结果就是整数66;要是是数字'5',转换后就是53;空格字符的话就是32,懂了吧?
二、那行核心代码的作用拆解
output += ((int)message[i]) - (secret + c);这行是整个加密的关键,一步步看:
- 第一步:把当前要加密的字符转成ASCII整数,就是前面说的
(int)message[i] - 第二步:算出一个动态变化的偏移值——
secret是个静态随机数(第一次调用函数时生成0到31999之间的数,之后再调用都用同一个值),c是斐波那契数列的项(初始a=0、b=1,每次循环c会变成a+b,然后a和b更新,所以c会依次是1、1、2、3、5、8...),两者加起来就是这次要减的偏移量 - 第三步:用字符的ASCII值减去这个偏移量,得到一个新的整数
- 第四步:这个整数会自动转成
char类型(不管是不是可打印字符),追加到输出字符串output里
总结下来,这行就是用随机密钥+斐波那契动态偏移的方式,把每个字符的ASCII值做减法偏移,实现加密。
额外提个小注意点
这个加密逻辑有个小问题:secret是静态变量,第一次生成后就固定了,后续调用加密函数都会用同一个密钥。而且如果原字符的ASCII值很小(比如空格32),减去大的偏移量会得到负数,转成char后就是不可打印的控制字符,不同系统处理这种字符可能有差异,解密的时候要注意对应上。
备注:内容来源于stack exchange,提问作者Andrew Zhuo
相关产品推荐
相关产品推荐

