高难算法,你能看懂吗?回答正确另给200分

Semigod 2003-10-16 08:46:29
有下面两个函数,谁能知道第二个函数所做的操作是什么样的操作,有什么意义,或数学原理(我能看懂的部分已经加上了注释):

BYTE data1[] = {0, 1, 2, 4, 5, 7, 8, 10, 11, 12, 16, 22, 23, 26};
DWORD data2[256]; // 地址为 48CBE0
BOOL bNotInitialized = TRUE;

void sub_429A40()
{
int var_4, var_18;
int iArraySize = sizeof(data1);
int bitMask = 0;
for (int j = 0; j < iArraySize; j ++)
{
int iTmp = 1;
bitMask |= iTmp <<(0x1F - data1[j]);
}
// 在上面的操作完成后
// bitMask 应该是: 111011011011100010000011001000000
// 即 0x0EDB88320
for (j = 0; j < 0x100; j++)
{
var_4 = j;
for (int i= 0; i < 8; i++)
{
var_18 = (var_4 & 1)?var_4>>1:(var_4 >> 1) ^ bitMask ;
var_4 = var_18;
}
data2[j] = var_4;
}
// data2里的值应该是:
// data2[i] = i / 2; i为0-255之间的奇数
// data2[j] = (j / 2) xor 0x0EDB88320; j为0-255之间的偶数
bNotInitialized = FALSE;
}

// iUnknown 调用时为 0
int sub_429B18(int iUnknown, LPBYTE pData, int iSize)
{
if (pData )
{
; 初始化
if (bNotInitialized)
sub_429A48();

iUnknown ^= -1;
// 若 iUnknown 调用时为 0, 则
// 此时 iUnknown = -1;
while (iSize >= 8)
{
iUnknown = (iUnknown >> 8) ^ data2[(* pData ^ iUnknown) & 0xFF];
iUnknown = (iUnknown >> 8) ^ data2[(iUnknown ^ (*++pData)) & 0xFF]
iUnknown = (iUnknown >> 8) ^ data2[(iUnknown ^ (*++pData)) & 0xFF]
iUnknown = (iUnknown >> 8) ^ data2[(iUnknown ^ (*++pData)) & 0xFF]
iUnknown = (iUnknown >> 8) ^ data2[(iUnknown ^ (*++pData)) & 0xFF]
iUnknown = (iUnknown >> 8) ^ data2[(iUnknown ^ (*++pData)) & 0xFF]
iUnknown = (iUnknown >> 8) ^ data2[(iUnknown ^ (*++pData)) & 0xFF]
iUnknown = (iUnknown >> 8) ^ data2[(iUnknown ^ (*++pData)) & 0xFF]
pData ++;
iSize -= 8;
}
if (iSize)
{
do
{
(iUnknown >> 8) ^ dword data2[(*pData ^ iUnknown) & 0xFF]
++ pData;
-- iSize;
}
while (iSize);
}
return iUnknown ^ -1;
}
return 0;
}

...全文
61 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
Semigod 2003-10-22
  • 打赏
  • 举报
回复
结贴。分析结果是CRC代码
flagfly 2003-10-17
  • 打赏
  • 举报
回复
应该是为了生成类似数字签名的东东。
也有可能就是生成一个随机数
Semigod 2003-10-17
  • 打赏
  • 举报
回复
up 一下,请高手赐教!!!200分不够可以再加
Semigod 2003-10-17
  • 打赏
  • 举报
回复
再UP!请关注
Semigod 2003-10-16
  • 打赏
  • 举报
回复
这段代码并不算复杂,只是这操作让人不易理解
wj59 2003-10-16
  • 打赏
  • 举报
回复
研究中。。。。。。
whoo 2003-10-16
  • 打赏
  • 举报
回复
哈希散列吧。
Semigod 2003-10-16
  • 打赏
  • 举报
回复
另补充一句:第二个函数好像是返回一个数字,所以我觉得这个函数是在生成一种CRC校验码!不知道这里有冇对CRC方法比较了解的高手
Semigod 2003-10-16
  • 打赏
  • 举报
回复
楼上的提到的我确实是忘掉了,非常感谢。不知道这个加密算法的数学模型是什么样子的。哪位数学学得好的大虾指点一下?
whoo 2003-10-16
  • 打赏
  • 举报
回复
加密吧。
int sub_429B18(int iUnknown, LPBYTE pData, int iSize)

==〉

int Encrypt(int iPasswordSeed, char* pszSource, int iSourceSize);

void sub_429A40() 用于省成伪随机码,用作加密序列。

data1 伪随机序列生成种子, 用于声称data2序列。
data2序列 和 输入的 iUnknown 一起作用加密输入的 pData.

btw:
// data2[i] = i / 2; i为0-255之间的奇数
// data2[j] = (j / 2) xor 0x0EDB88320; j为0-255之间的偶数

这个地方你忘了i 还要循环8次的。
flagfly 2003-10-16
  • 打赏
  • 举报
回复
mark
FlyYang 2003-10-16
  • 打赏
  • 举报
回复
你这样贴出来,代码不好看

---------
++C++
---------
tonyzhengjq 2003-10-16
  • 打赏
  • 举报
回复
好好学习!
crystal_heart 2003-10-16
  • 打赏
  • 举报
回复
up
Semigod 2003-10-16
  • 打赏
  • 举报
回复
高手在哪里?

16,467

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧