博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android学习JNI,使用JNI实现字符串加密
阅读量:6916 次
发布时间:2019-06-27

本文共 2456 字,大约阅读时间需要 8 分钟。

本节学习使用C语言加密字符串,大家都知道使用JAVA实现的加密都能够反编译的,而使用C写的加密是非常难被反编译的。所以我们使用JNI学习怎样使用C实现对字符串的加密。

首先:我们实现一个界面

布局文件就补贴出了。

其次:在MainActivity中添加一个加密和解密的本地方法

//加密本地方法public native String encodeFromC(String text, int length);//解密本地方法public native String decodeFromC(String text, int length);
当加密的button按下时:

public void encode(View v)    {    	String passwd = et.getText().toString();    	et.setText(encodeFromC(passwd, passwd.length()));    }
将加密的字符显示到EditText上

当解密的button按下时,将EditText中的字符解密。然后显示解密后的字符

public void decode(View v)    {    	String passwd = et.getText().toString();    	et.setText(decodeFromC(passwd, passwd.length()));    }
最后:实现本地方法

#include 
#include
//把java的字符串转换成c的字符串,使用反射char* Jstring2CStr(JNIEnv* env, jstring jstr){ char* rtn = NULL; //1:先找到字节码文件 jclass clsstring = (*env)->FindClass(env,"java/lang/String"); jstring strencode = (*env)->NewStringUTF(env,"GB2312"); //2:通过字节码文件找到方法ID jmethodID mid = (*env)->GetMethodID(env,clsstring, "getBytes", "(Ljava/lang/String;)[B"); //3:通过方法id,调用方法 jbyteArray barr= (jbyteArray)(*env)->CallObjectMethod(env,jstr,mid,strencode); // String .getByte("GB2312"); //4:得到数据的长度 jsize alen = (*env)->GetArrayLength(env,barr); //5:得到数据的首地址 jbyte* ba = (*env)->GetByteArrayElements(env,barr,JNI_FALSE); //6:得到C语言的字符串 if(alen > 0) { rtn = (char*)malloc(alen+1); //"\0" memcpy(rtn,ba,alen); rtn[alen]=0; } (*env)->ReleaseByteArrayElements(env,barr,ba,0); // return rtn;}/* * Class: com_demo_passwd_MainActivity * Method: encodeFromC * Signature: (Ljava/lang/String;I)Ljava/lang/String; */JNIEXPORT jstring JNICALL Java_com_demo_passwd_MainActivity_encodeFromC (JNIEnv *env, jobject obj, jstring passwd, jint length){ //1:将java的字符串转化为c语言 char* cstr = Jstring2CStr(env, passwd); int i = 0; //2:给C语言字符加1 for(i = 0; i < length; i++) { *(cstr + i) += 1; } //3:将c语言字符串转化为java字符串 return (*env)->NewStringUTF(env, cstr);}/* * Class: com_demo_passwd_MainActivity * Method: decodeFromC * Signature: (Ljava/lang/String;I)Ljava/lang/String; */JNIEXPORT jstring JNICALL Java_com_demo_passwd_MainActivity_decodeFromC(JNIEnv *env, jobject obj, jstring passwd, jint length){ //1:将java的字符串转化为c语言 char* cstr = Jstring2CStr(env, passwd); int i = 0; //2:给C语言字符减1 for(i = 0; i < length; i++) { *(cstr + i) -= 1; } //3:将c语言字符串转化为java字符串 return (*env)->NewStringUTF(env, cstr);}
显示效果:

当在输入框中输入:abcdefg

解密:

你可能感兴趣的文章
hibernate N+1问题
查看>>
CA是如何颁发证书的
查看>>
浅谈移动端 View 的显示过程
查看>>
方差分析引论
查看>>
时间序列的概念、种类及编制原则
查看>>
NA笔记-帧中继2-P to P_EIGRP
查看>>
计算距离
查看>>
数据结构---哈希表(KV模式)(除留余数法)
查看>>
spark-local 模式 提示 /tmp/hive hdfs 权限不够的问题
查看>>
我的友情链接
查看>>
MYSQL-5.7.11安装记录
查看>>
我的友情链接
查看>>
检查文件下面时候存在ini文件
查看>>
纵向比较ISIS、OSPF
查看>>
我的友情链接
查看>>
毕业后的五年拉开大家差距的原因在哪里?
查看>>
scala中的空
查看>>
我的友情链接
查看>>
python文件操作中write与writelines的区别
查看>>
基于linux 的mysql的主从同步配置读写分离
查看>>