如何在C中使用ISAAC

时间:2015-10-28 22:54:14

标签: c random cryptography

我从here下载了isaac64,但我在使用方面遇到了一些问题。 我不得不在isaac64.c中评论部分代码,因为它包含main函数。但我无法使用它...我无法正确初始化它并得到随机数,你能帮助我吗?我找不到任何例子。

    randinit(TRUE); 
    for(i=0;i<10;i++){
    printf("%lx\n",rand());
    }
每次运行此代码时,我都会得到相同的值。我不知道如何设定种子。

1 个答案:

答案 0 :(得分:3)

这个版本的ISAAC是一个&#34;参考实现&#34;这意味着它意在被提及,但不是特别用户友好或准备生产。 C中有任意数量的cryptographically secure random number generators更容易使用。特别是,在大多数操作系统上,简单地从/dev/random读取字节就足够了。

main函数演示了如何使用该库。它已经用#ifdef注释掉了。我发现using the Perl wrapper around ISAAC as a guide也有帮助。

int main()
{
    /* Initialize the structure to 0 */
    randctx ctx;
    ctx.randa = ctx.randb = ctx.randc = (ub4)0;

    /* Initialize the seed */
    for (ub4 i=0; i<256; ++i) {
        ctx.randrsl[i] = i;
    }

    /* Initialize the random numbers from the seed */
    randinit(&ctx, TRUE);

    /* Print 10 pseudo random numbers */
    for(int i=0; i<10; i++) {
        printf("%.8lx\n", rand(&ctx));
    }
}

您必须提供seed "entropy"。如果您提供相同的种子,您将获得相同的结果。这就是ISAAC是一个 psuedo 随机数生成器的原因,它只能从现有的随机性中产生更多随机看似的数字。有a discussion of where to get your seed from in Math::Random::ISAAC

如果这些是您的新概念,如果是生产代码,我强烈建议您只需阅读/dev/random 。这种ISAAC实现非常粗糙,加密非常容易 出错。 /dev/random已经为您处理了所有这些事情。

如果您必须使用自己的伪随机库,请使用经过良好实施和记录的库,如OpenSSL

如果您要完成此操作,我建议您调整the version of the code from the Perl wrapper,因为至少作者已将其清理为有价值的发布。