_xiaodoudou 2015-04-03 03:36 采纳率: 0%
浏览 3680

循环异或加密\qiu解答

利用异或运算来加密是简单的加密算法之一。现在我们在此基础上稍稍改变一下,循环异或加密的原理是,将缓冲区中的第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];
}
}
}

  • 写回答

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 画图