最近项目中用到数据加密解密的功能,由于Android、iOS以及服务器端都需要用到这个功能。而不同平台上加密出来的密文是不一样的,这样导致互相之间密文无法使用。于是决定使用C/C++完成加密解密,其他平台调用的方式进行处理。
加密解密实现
AES加密的具体实现过程本文暂不讨论,实现代码是直接从openssl源码中抽出来。
加密解密调用以下两个方法:
int aes_encrypt(char * in, char* key, char * out) 加密//明文,密钥,密文
int aes_decrypt(char * in, char* key, char * out) 解密//密文,密钥,明文
明文需要从外部获取;一般情况下key需要自定义,所以也是外部获取;out是加密或者解密的结果,需要返回给调用者。
所以接下来需要做的就是获取外部数据,交给加密解密方法处理,返回结果到外部。
编写java本地方法
java调用c/c++代码是通过JNI来实现,在java中需要声明native方法。
AESUtil.java
public classAESUtil{public nativeString encrypt(String plainText, String key);public nativeString decrypt(String cipherText, String key);
}
javac编译AESUtil.java生成class文件AESUtil.class。
javah AESUtil生成AESUtil.h,该文件将会作为头文件包含到c项目中去。
打开AESUtil.h,代码如下:
/*DO NOT EDIT THIS FILE - it is machine generated*/#include
/*Header for class AESUtil*/#ifndef _Included_AESUtil#define _Included_AESUtil#ifdef __cplusplusextern "C"{#endif
/** Class: AESUtil
* Method: encrypt
* Signature: (Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;*/JNIEXPORT jstring JNICALL Java_AESUtil_encrypt
(JNIEnv*, jobject, jstring, jstring);/** Class: AESUtil
* Method: decrypt
* Signature: (Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;*/JNIEXPORT jstring JNICALL Java_AESUtil_decrypt
(JNIEnv*, jobject, jstring, jstring);
#ifdef __cplusplus
}#endif
#endi