如何在C中使用ISAAC

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

我从这里下载了isaac64,但在使用时遇到了一些问题。 我必须注释 isaac64.c 中的部分代码,因为它包含 main 函数。但我无法使用它......我无法正确初始化它并获取随机数,你能帮助我吗?我找不到任何例子。

randinit(TRUE); 
for(i=0;i<10;i++) {
    printf("%lx\n",rand());
}

每次运行此代码时,我都会得到相同的值。我不知道如何设置种子。

c random cryptography
1个回答
3
投票

此版本的 ISAAC 是一个“参考实现”,这意味着它旨在被引用,但不是特别用户友好或不适合生产。 C 中有许多更易于使用的“加密安全随机数生成器”。特别是,在大多数操作系统上,只需从 /dev/random 读取字节就足够了。


main

函数演示了如何使用该库。它已经用

#ifdef
注释掉了。 我发现
使用 ISAAC 周围的 Perl 包装器作为指南
也有帮助。 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

,或
“熵”。如果您提供相同的种子,您将得到相同的结果。这就是为什么 ISAAC 是一个“伪”随机数生成器,它只能从现有的随机性中产生更多看似随机的数字。 Math::Random::ISAAC 中讨论了从哪里获取种子。 如果这些对您来说是新概念,并且如果这是生产代码,我会强烈建议您直接阅读/dev/random

。这个 ISAAC 实现非常粗糙,而且密码学“非常容易”出错。

/dev/random已经为你处理好这一切了。


如果您必须使用自己的伪随机库,请使用实施良好且记录良好的库,例如 OpenSSL
如果您要完成此操作,我建议您调整 
Perl 包装器中的代码版本

,因为至少作者已对其进行了清理,使其值得发布。

© www.soinside.com 2019 - 2024. All rights reserved.