样本代码:数据加密应用

下载 PDF 文档

下载样本代码

Christopher Bird,软件应用工程师

应用来源:
英特尔 SSG

简介

加密非常重要,因为对于您不希望任何人访问的数据,它能够帮助您确保其安全。 加密一直是安全领域的热门话题。 随着越来越多的移动设备开始存储宝贵信息,加密对于确保信息的安全变得至关重要。

本文介绍了可通过 Java* 或 OpenSSL* 使用的数据加密 API。 这两种解决方案都可以在 Android* 操作系统上使用。

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

数据加密代码及介绍

如果您想要在 Android 上加密数据,可以选择以下两种选择: Java Crypto API 和 OpenSSL API。 我们将为您介绍如何使用这两种方式加密数据。

Java Crypto API

在 Android 上使用 Java Crypto API 非常简单。  首先,您需要为该加密生成一个密钥。 javax.crypto 软件包中包含的 KeyGenerator 类可帮助您完成该任务。

	mKey = null;
	try {
		kgen = KeyGenerator.getInstance("AES");
		mKey = kgen.generateKey();

	} catch (NoSuchAlgorithmException e) {
		e.printStackTrace();
	}

 

然后,您可以使用生成的密钥为数据文件加密。 这可以通过向 javax.crypto 创建的 AES 密码传送多数据块的字节来完成。

// open stream to read origFilepath. We are going to save encrypted contents to outfile
	InputStream fis = new FileInputStream(origFilepath);		
	File outfile = new File(encFilepath);
	int read = 0;
	if (!outfile.exists())
		outfile.createNewFile();
		
	FileOutputStream encfos = new FileOutputStream(outfile);
	// Create Cipher using "AES" provider
	Cipher encipher = Cipher.getInstance("AES");
	encipher.init(Cipher.ENCRYPT_MODE, mKey);
	CipherOutputStream cos = new CipherOutputStream(encfos, encipher);
		
	// capture time it takes to encrypt file
	start = System.nanoTime();
	Log.d(TAG, String.valueOf(start));
		
	byte[] block = new byte[mBlocksize];
		
	while ((read = fis.read(block,0,mBlocksize)) != -1) {
		cos.write(block,0, read);
	}
	cos.close();
	stop = System.nanoTime();
		
	Log.d(TAG, String.valueOf(stop));
	seconds = (stop - start) / 1000000;// for milliseconds
	Log.d(TAG, String.valueOf(seconds));
		
	fis.close();

 

OpenSSL API

在 Android 上的 OpenSSL 中加密数据时,需要编写能够在 Java 中通过 JNI 调用访问的原生 C 代码。 它需要的任务更多,但是相应地您也可以获得更高的性能。 

首先,我们来生成该密钥和 iv。

unsigned char cKeyBuffer[KEYSIZE/sizeof(unsigned char)];
unsigned char iv[] = "01234567890123456";
int opensslIsSeeded = 0;
if (!opensslIsSeeded) {
	if (!RAND_load_file("/dev/urandom", seedbytes)) {
		return -1;
	}
	opensslIsSeeded = 1;
}

if (!RAND_bytes((unsigned char *)cKeyBuffer, KEYSIZE )) {
}

 

然后,您可以使用生成的密钥(cKeyBuffer)为文件加密。 通过输入密钥和 iv 来初始化 EVP。 然后向 EVP_EncryptUpdate 函数传送多数据块的字节。 文件最后一个数据块的字节需要传送至 EVP_EncryptFinal_ex 函数。


if (!(EVP_EncryptInit_ex(e_ctx, EVP_aes_256_cbc(), NULL, cKeyBuffer, iv ))) {
	ret = -1;
	printf( "ERROR: EVP_ENCRYPTINIT_EXn");
}
	
// go through file, and encrypt
if ( orig_file != NULL ) {
   	origData = new unsigned char[aes_blocksize];
    	encData = new unsigned char[aes_blocksize+EVP_CIPHER_CTX_block_size(e_ctx)]; // potential for encryption to be 16 bytes longer than original

	printf( "Encoding file: %sn", filename);

	bytesread = fread(origData, 1, aes_blocksize, orig_file);
	// read bytes from file, then send to cipher
	while ( bytesread ) {


		if (!(EVP_EncryptUpdate(e_ctx, encData, &len, origData, bytesread))) {
			ret = -1;
			printf( "ERROR: EVP_ENCRYPTUPDATEn");
		}
		encData_len = len;

		fwrite(encData, 1, encData_len, enc_file );
		// read more bytes
		bytesread = fread(origData, 1, aes_blocksize, orig_file);
	}
	// last step encryption
	if (!(EVP_EncryptFinal_ex(e_ctx, encData, &len))) {
		ret = -1;
		printf( "ERROR: EVP_ENCRYPTFINAL_EXn");
	}
	encData_len = len;

	fwrite(encData, 1, encData_len, enc_file );

	// free cipher
	EVP_CIPHER_CTX_free(e_ctx);

 

结论

通过按照本文介绍的样本来实施代码,您可以快速了解如何使用 Java Crypto API 和 OpenSSL API 为运行 Android 的英特尔® 处理器平台上的数据加密。

作者介绍

Christopher Bird 是英特尔软件和解决方案事业部(SSG)、开发人员关系部门、英特尔® 凌动™ 处理器创新技术工程团队的一员。 

相关文章与资源:

声明

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

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


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

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

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

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

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

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

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

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

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

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