利用异或运算来加密是简单的加密算法之一。现在我们在此基础上稍稍改变一下,循环异或加密的原理是,将缓冲区中的第i个字节异或上第i+1个字节,并将结果放入第i+1个字节的位置,如果第i字节已经是缓冲区的最后一个字节,那么将它与第1个字节异或,结果放入第1个字节的位置,完成最后一个字节后,算是一轮结束。举例来说,有如下3个字节大小的缓冲区0x01 0x02 0x03,那么,将0x01与0x02异或,结果放入原先0x02的位置,将0x02位置的新数据与0x03异或,结果放入0x03的位置,将0x03位置的新数据与0x01异或,结果放入0x01的位置,如此算是一轮循环完毕,如果继续上面的步骤,还可以做第二轮,第三轮循环异或,数据将被加密。解密是方法也就是加密方法的逆运算。现在请实现一个这样的加密函数,函数原型如下:
void EnSpin(BYTE* lpBuffer,DWORD dwSize,DWORD dwLoopTimes);
其中lpBuffer是调用方传入的缓冲区指针,dwSize表明该缓冲区的大小,dwLoopTimes表示要做几轮循环,比如当dwLoopTimes=2时,则对缓冲区做两轮循环异或。
要求:下面有一个该函数的实现,请理解该实现的意图,并补充完整空缺处的下标表达式。
void EnSpin(BYTE* lpBuffer,DWORD dwSize,DWORD dwLoopTimes)
{
for (DWORD n = 0; n < dwLoopTimes; n++)
{
for (DWORD i = 0; i < dwSize; i++)
{
lpBuffer[ ___________________ ] ^= lpBuffer[i];
}
}
}
循环异或加密\qiu解答
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
2条回答 默认 最新
- stateOfBullshit 2015-04-04 13:34关注
这个问题基本上是比较直接的,但是就有一处有一点点tricky:
看起来lpBuffer[ ___________________ ] 中应该填写i+1(将i+1和i的数据亦或并放进i+1的位置里),但是当i走到最后一位(i= dwSize-1时)如何将lpBuffer[ ___________________ ] 中的索引值归0(因为最后一位要和第一位亦或嘛)?对于这种问题,个人偏好原因喜欢用数学公式来解决。
注意:这里认为i、dwSize都是整数,不是浮点数
i+1-(i/(dwSize-1))*dwSize
这个公式就是解决上面说的“tricky”,在i取值由0~dwSize-2中,(i/(dwSize-1))的结果一直是0(两个整数除法结果只取整数部分),此时括号里的索引就是我们说的最直接的情况=i+1;而i到了缓冲区最后呢?i=dwSize-1,这个时候,只有这个时候(i/(dwSize-1))的结果=1,索引的值就是i+1-dwSize=dwSize-1+1-dwSize=0.
最后一位和第一位亦或存入第一位。再开始加密第二轮。解决 无用评论 打赏 举报
悬赏问题
- ¥15 用windows做服务的同志有吗
- ¥60 求一个简单的网页(标签-安全|关键词-上传)
- ¥35 lstm时间序列共享单车预测,loss值优化,参数优化算法
- ¥15 Python中的request,如何使用ssr节点,通过代理requests网页。本人在泰国,需要用大陆ip才能玩网页游戏,合法合规。
- ¥100 为什么这个恒流源电路不能恒流?
- ¥15 有偿求跨组件数据流路径图
- ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值
- ¥15 我想咨询一下路面纹理三维点云数据处理的一些问题,上传的坐标文件里是怎么对无序点进行编号的,以及xy坐标在处理的时候是进行整体模型分片处理的吗
- ¥15 一直显示正在等待HID—ISP
- ¥15 Python turtle 画图