如何让 VB6 PRNG 从特定种子生成字节输出,以及如何在 C 中复制?

问题描述 投票:0回答:0

长期读者和潜伏者,第一次张贴。

我希望得到一些关于我一直没有解决的老问题的帮助。我试图弄清楚如何使用 VB6 PRNG 从 Randomize() 函数提供的两字节种子生成字节输出。我正在尝试复制 C 中的代码并用我自己的 2 个字节作为种子,比如 0x12FF。

我希望创建一个 8 字节输出,该输出源自具有特定种子的 PRNG 的 8 个单字节输出(而不是一个 8 字节输出)。输出最好是十六进制的,例如:

0xFF 0x1A 0x2B 0x3C 0x4D 0x5E 0x6F 0x1A

我知道 VB6 PRNG 有一个巨大的缺陷,我的实验旨在证明这个缺陷以及为什么不应该使用这样的 PRNG 来避免重复输出。

我似乎能找到的唯一文档是如何生成整数输出,这对我没有用,除非以某种方式使用整数输出来生成字节输出。我不熟悉输出,如果能得到任何帮助,我将不胜感激。

下面是我的整数输出示例。

#include <stdio.h>
#include <math.h>

int main(int argc, char* argv[])
{
unsigned long       rndVal;

rndVal = 0x50000L; // default VB6 value of 327680, can I set this to a 2 byte value such as 0x12FF?
int i;
float rndFloat;

for (i=0;i<8;i++)
    {
    rndVal = (rndVal * 0x43fd43fdL + 0xc39ec3L) & 0xffffffL;
    rndFloat = (float)rndVal / (float)16777216.0;
    printf("Value is %.15f\n",rndFloat);
    }
return 0;
}
        

我可以清楚地看到如何通过修改 rndVal 值来使用我自己的种子,如何将其输出转换为字节输出,就像 VB6 所做的那样,或者这是否需要完全重新思考?

任何帮助将不胜感激!

c random cryptography vb6 reverse-engineering
© www.soinside.com 2019 - 2024. All rights reserved.