65.9K
CodeProject 正在变化。 阅读更多。
Home

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

2014 年 9 月 18 日

CPOL

4分钟阅读

viewsIcon

12080

本文概述了随机数 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 英特尔公司。保留所有权利。

*其他名称和品牌可能被声明为他人的财产。

要了解更多关于安卓开发者的英特尔工具,请访问英特尔® 安卓开发者专区

© . All rights reserved.