样本代码:随机数应用

下载 PDF 文档

下载样本代码

Christopher Bird,软件应用工程师

应用来源:
英特尔 SSG

简介

随机数生成器(RNG)是一种可为值无法预测的间隔生成一串数字的实用程序或设备。 RNG 是信息安全应用不可或缺的组件。 事实上,加密协议具备强大的功能,但是由于底层的密钥生成方式薄弱而受到广泛的攻击。 硬件辅助的 RNG 可修复该弱点,从而显著提高加密的功能。

本文概括介绍了随机数 API,并展示了如何使用不同的 API 在 Android* 操作系统上生成随机数。

我们建议您对这些特性进行尝试,并按照本文的内容编译代码。

代码及介绍

在 Android 中生成随机数有四种方式。

  • java.util.random
  • java.security.SecureRandom
  • /dev/urandom
  • OpenSSL* API

但是,如果您使用 RNG 生成加密密钥来保护数据,典型的随机类更容易遭到攻击,因此不应使用这种方式。 其他三种方式可提供强大的密钥。

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 文件进行读取,我们可以直接从内核层面获取随机数。   /dev/urandom 将访问硬件辅助 RNG(如果可用)。

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 的字节生成,然后用于生成密码安全的随机数。 OpenSSL API 将访问硬件辅助的 RNG(如果可用)。

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);
}

结论

通过按照本文中介绍的样本实施代码,您可以快速了解如何使用四种不同的方式来生成随机数。

作者介绍

Christopher Bird 是英特尔软件和解决方案事业部(SSG)、开发人员关系部门、英特尔® 凌动™ 处理器高接触性软件支持团队的一员。

相关文章与资源:

声明

本文件中包含关于英特尔产品的信息。 本文件不构成对任何知识产权的授权,包括明示的、暗示的,也无论是基于禁止反言的原则或其他。 英特尔不承担任何其他责任。英特尔在此作出免责声明:本文件不构成英特尔关于其产品的使用和/或销售的任何明示或暗示的保证,包括不就其产品的(i)对某一特定用途的适用性、(ii)适销性以及(iii)对任何专利、版权或其他知识产权的侵害的承担任何责任或作出任何担保。

除非经过英特尔的书面同意认可,英特尔的产品无意被设计用于或被用于以下应用:即在这样的应用中可因英特尔产品的故障而导致人身伤亡。


英特尔有权随时更改产品的规格和描述,恕不另行通知。 设计者不应信赖任何英特产品所不具有的特性,设计者亦不应信赖任何标有保留权利摂或未定义摂说明或特性描述。 对此,英特尔保留将来对其进行定义的权利,同时,英特尔不应为因其日后更改该等说明或特性描述而产生的冲突和不相容承担任何责任。 此处提供的信息可随时更改,恕不另行通知。 请勿根据本文件提供的信息完成一项产品设计。

本文件所描述的产品可能包含使其与宣称的规格不符的设计缺陷或失误。 这些缺陷或失误已收录于勘误表中,可索取获得。

在发出订单之前,请联系当地的英特尔营业部或分销商以获取最新的产品规格。

如欲获得本文涉及的带编号文档的副本或其他英特尔文献,可致电 1-800-548-4725,或访问: http://www.intel.com/design/literature.htm

在性能检测过程中涉及的软件及其性能只有在英特尔微处理器的架构下方能得到优化。 SYSmark* 和 MobileMark* 等性能测试均使用特定的计算机系统、组件、软件、操作和功能进行测量。 上述任何要素的变动都有可能导致测试结果的变化。 请参考其他信息及性能测试(包括结合其他产品使用时的运行性能)以对目标产品进行全面评估。

对本文件中包含的软件源代码的提供均依据相关软件许可而做出,任何对该等源代码的使用和复制均应按照相关软件许可的条款执行。

英特尔、Intel 标识、Atom 和凌动是英特尔公司在美国和其他国家(地区)的商标。

英特尔公司 © 2014 年版权所有。 所有权保留。

* 其他的名称和品牌可能是其他所有者的资产。

有关编译器优化的更完整信息,请参阅优化通知