示例代码:随机数应用程序






3.86/5 (4投票s)
本文概述了随机数 API,并演示了如何在 Android* 操作系统上使用不同的 API 生成随机数。
引言
随机数生成器 (RNG) 是一种生成一系列看似不可预测数值的实用程序或设备。RNG 是信息安全应用程序中不可或缺的组件。事实上,一个加密协议可能非常健壮,但由于其底层弱密钥生成方法而遭受广泛攻击。硬件辅助 RNG 可以用来修复这种弱点,从而显著增强加密的健壮性。
本文概述了随机数 API,并演示了如何在 Android* 操作系统上使用不同的 API 生成随机数。
我们建议您在阅读本文档的同时,尝试这些功能并编译代码。
代码和说明
在 Android 中有四种不同的方法来生成随机数。
- java.util.random
- java.security.SecureRandom
- /dev/urandom
- OpenSSL* API
但是,如果您正在使用 RNG 为保护您的数据生成加密密钥,那么普通的 Random 类已知更容易被破解,不应使用。其他三种方法应该能提供强密钥。
java.util.random
使用 Java* 随机数 API 非常简单。调用 Random.nextInt()
将返回一个 4 字节的随机值(有 2^32 种可能的值)。此 API 在您不依赖真正随机数的场合下工作良好。
for (int i = 0; i < lastVal; i += 2) {
dataRandomPoints[i] = (rand.nextInt() % widget_width);
dataRandomPoints[i+1] = (rand.nextInt() % widget_height);
}
java.security.SecureRandom
SecureRandom
类似于 java.util.Random
,您可以调用 SecureRandom.nextInt()
返回一个 4 字节的随机值。SecureRandom
在密码学上是安全的,尽管开发者应该注意到最近的 建议,即在生成随机数之前,使用来自 /dev/urandom 的字节来初始化 SecureRandom
。下面的示例不使用 /dev/urandom 进行初始化。
SecureRandom srand = new SecureRandom();
shouldDraw = (srand.nextInt() % randomMod );
/dev/urandom
Linux* 操作系统(包括 Android)有一个由内核创建的特殊文件,可以向应用程序提供随机数。这是四种实现中最慢的一种,它通过将操作系统各部分(例如设备驱动程序)的噪声纳入 RNG 来生成加密安全的高熵值。我们可以通过读取 /dev/urandom 文件直接从内核级别获取随机数。如果硬件辅助 RNG 可用,/dev/urandom 将会访问它。
unsigned int cKeyBuffer[keysize];
memset(cKeyBuffer, 0, sizeof(unsigned int) * keysize);
FILE *fin;
strcpy(filein, "/dev/urandom");
fin = fopen(filein, "rb");
if (fin != NULL) {
fread(cKeyBuffer, sizeof(int), keysize, fin);
fclose (fin);
}
OpenSSL API
我们还可以使用 OpenSSL API 在原生 (C) 代码中获取随机数。您可以看到,OpenSSL 可以使用来自 /dev/urandom 的字节进行初始化,然后用于生成加密安全的随机数。如果硬件辅助 RNG 可用,OpenSSL API 将会访问它。
int seedbytes = 1024;
unsigned int cKeyBuffer[keysize];
memset(cKeyBuffer, 0, sizeof(unsigned int) * keysize);
if (!opensslIsSeeded) {
if (!RAND_load_file("/dev/urandom", seedbytes)) {
__android_log_print(ANDROID_LOG_ERROR, TAG, "Failed to seed OpenSSL RNG");
return jKeyBuffer;
}
opensslIsSeeded = 1;
}
if (!RAND_bytes((unsigned char *)cKeyBuffer, keysize * sizeof(int))) {
__android_log_print(ANDROID_LOG_ERROR, TAG, "Faled to create OpenSSSL random integers: %ul", ERR_get_error);
}
结论
通过实现本文档中描述的示例代码,您可以快速学习四种不同的生成随机数的方法。
相关文章与资源
注意事项
本文档中的信息是为配合 Intel 产品提供的。本文档不授予任何知识产权的明示或暗示许可,无论是通过禁止反悔还是其他方式。除 Intel 产品销售条款和条件中的规定外,Intel 不承担任何责任,并在此声明不提供与 Intel 产品销售和/或使用相关的任何明示或暗示的保证,包括对特定用途的适用性、适销性或对任何专利、版权或其他知识产权侵权的保证。
除非 Intel 书面同意,否则 Intel 产品不设计也不用于任何可能导致人员伤亡的应用程序。
Intel 可随时对规格和产品描述进行更改,恕不另行通知。设计人员不得依赖未标记为“保留”或“未定义”的任何特性或指令的缺失或特性。Intel 将这些保留用于将来定义,并且对于因其未来更改而导致的任何冲突或不兼容不承担任何责任。此处提供的信息如有更改,恕不另行通知。请勿基于此信息最终确定设计。
本文档中描述的产品可能包含已知为勘误的设计缺陷或错误,这可能导致产品偏离已发布的规范。当前的已表征勘误可应要求提供。
请联系您当地的英特尔销售办事处或您的经销商以获取最新的规范,并在下订单前进行咨询。
订购号和本文档中引用的文件副本,或其他 Intel 文档,可通过致电 1-800-548-4725 或访问:http://www.intel.com/design/literature.htm 获取。
性能测试中使用的软件和工作负载可能已针对仅在 Intel 微处理器上进行的性能进行了优化。性能测试(如 SYSmark* 和 MobileMark*)是使用特定的计算机系统、组件、软件、操作和功能测量的。这些因素的任何更改都可能导致结果发生变化。您应查阅其他信息和性能测试,以帮助您全面评估您考虑购买的产品,包括该产品与其他产品结合使用时的性能。
本文档中重印的任何软件源代码均根据软件许可证提供,并且只能根据该许可证的条款使用或复制。
英特尔、英特尔徽标和 Atom 是英特尔公司在美国和/或其他国家/地区的商标。
版权所有 © 2014 英特尔公司。保留所有权利。
*其他名称和品牌可能被声明为他人的财产。
要了解更多关于安卓开发者的英特尔工具,请访问英特尔® 安卓开发者专区。