当前位置: 首页 > news >正文

Android集成OpenSSL实现加解密-JNI实现

  1. 定义JNI方法

     companion object{init {System.loadLibrary("jnitest")}}external fun encryptAES(data :ByteArray): ByteArray?external fun decryptAES(data :ByteArray): ByteArray?
    
  2. 使用OpenSSL方法实现AES加密和解密

     #include "include/openssl/aes.h"const char* key_data = "0123456789abcdef";extern "C"JNIEXPORT jbyteArray JNICALLJava_com_test_jnitest_TestLib_encryptAES(JNIEnv *env, jobject thiz, jbyteArray data_) {size_t len = strlen(key_data);  // 数据长度unsigned char* unsigned_key_data = new unsigned char[len];  // 分配内存空间// 将数据复制到内存空间中memcpy(unsigned_key_data, key_data, len);jbyte *data = env->GetByteArrayElements( data_, NULL);jsize data_length = env->GetArrayLength( data_);// 创建 AES 上下文对象AES_KEY aes_key;if (AES_set_encrypt_key(unsigned_key_data, len * 8, &aes_key) < 0) {return NULL;}// 分配加密结果缓冲区int out_size = data_length + AES_BLOCK_SIZE;unsigned char *encrypted_data = (unsigned char *) malloc(out_size);if (encrypted_data == NULL) {return NULL;}// 执行加密操作AES_cbc_encrypt((unsigned char *) data, encrypted_data, data_length, &aes_key,unsigned_key_data, AES_ENCRYPT);// 将加密结果转换为 Java 中的 byte 数组返回jbyteArray result = env->NewByteArray( out_size);env->SetByteArrayRegion( result, 0, out_size, (jbyte *) encrypted_data);// 释放内存free(encrypted_data);env->ReleaseByteArrayElements( data_, data, JNI_ABORT);return result;}extern "C"JNIEXPORT jbyteArray JNICALLJava_com_test_jnitest_TestLib_decryptAES(JNIEnv *env, jobject thiz, jbyteArray data_) {size_t len = strlen(key_data);  // 数据长度unsigned char* unsigned_key_data = new unsigned char[len];  // 分配内存空间// 将数据复制到内存空间中memcpy(unsigned_key_data, key_data, len);jbyte *data = env->GetByteArrayElements( data_, NULL);jsize data_length = env->GetArrayLength( data_);// 创建 AES 上下文对象AES_KEY aes_key;if (AES_set_decrypt_key(unsigned_key_data, len * 8, &aes_key) < 0) {return NULL;}// 分配解密结果缓冲区int out_size = data_length - AES_BLOCK_SIZE;unsigned char *decrypted_data = (unsigned char *) malloc(out_size);if (decrypted_data == NULL) {return NULL;}// 执行解密操作AES_cbc_encrypt((unsigned char *) data, decrypted_data, data_length, &aes_key,unsigned_key_data, AES_DECRYPT);// 将解密结果转换为 Java 中的 byte 数组返回jbyteArray result = env->NewByteArray( out_size);env->SetByteArrayRegion( result, 0, out_size, (jbyte *) decrypted_data);// 释放内存free(decrypted_data);env->ReleaseByteArrayElements( data_, data, JNI_ABORT);return result;}
    
  3. 应用

     var testLib = TestLib()var encrpy = testLib.encryptAES("HelloWorld!!!!!!".toByteArray())encrpy?.let {var decrpy = testLib.decryptAES(it)decrpy?.let {Log.i(TAG, String(it))}}
    

相关文章:

  • 2023-12-19 LeetCode每日一题(寻找峰值 II)
  • 如何实现WinApp的UI自动化测试?
  • SpringBoot当中的Singleton和Prototype详解
  • linux x86 setup_arch代码注释
  • 2023-12-17 LeetCode每日一题(使用最小花费爬楼梯)
  • Linux操作系统( YUM软件仓库技术 )
  • 【数值分析】choleskey分解,matlab实现
  • OpenEular23.09(欧拉)操作系统为企业搭建独立的K8S集群环境,详细流程+截图
  • DS|队列
  • Docker 容器命令总汇
  • 【温故而知新】探讨下对vue的mixin的理解
  • springcloud微服务篇--6.网关Gateway
  • Mybatis 传参的方式
  • 计算机组成原理-总线概述
  • 【数据结构——二叉树】二叉树及其应用2023(头歌习题)【合集】
  • Angular2开发踩坑系列-生产环境编译
  • Asm.js的简单介绍
  • C++类中的特殊成员函数
  • ES6, React, Redux, Webpack写的一个爬 GitHub 的网页
  • flask接收请求并推入栈
  • Flex布局到底解决了什么问题
  • JavaScript 一些 DOM 的知识点
  • Js基础知识(四) - js运行原理与机制
  • Linux各目录及每个目录的详细介绍
  • MYSQL 的 IF 函数
  • Spark VS Hadoop:两大大数据分析系统深度解读
  • springMvc学习笔记(2)
  • 快速体验 Sentinel 集群限流功能,只需简单几步
  • 理解 C# 泛型接口中的协变与逆变(抗变)
  • 浏览器缓存机制分析
  • 前嗅ForeSpider教程:创建模板
  • 使用阿里云发布分布式网站,开发时候应该注意什么?
  • 王永庆:技术创新改变教育未来
  • 吴恩达Deep Learning课程练习题参考答案——R语言版
  • 优秀架构师必须掌握的架构思维
  • “十年磨一剑”--有赞的HBase平台实践和应用之路 ...
  • 策略 : 一文教你成为人工智能(AI)领域专家
  • ​​​​​​​ubuntu16.04 fastreid训练过程
  • #FPGA(基础知识)
  • #Spring-boot高级
  • $.each()与$(selector).each()
  • (145)光线追踪距离场柔和阴影
  • (笔记)Kotlin——Android封装ViewBinding之二 优化
  • (亲测有效)解决windows11无法使用1500000波特率的问题
  • (一)kafka实战——kafka源码编译启动
  • (转)Linux下编译安装log4cxx
  • .bat批处理(二):%0 %1——给批处理脚本传递参数
  • .MSSQLSERVER 导入导出 命令集--堪称经典,值得借鉴!
  • .net mvc actionresult 返回字符串_.NET架构师知识普及
  • .Net 基于MiniExcel的导入功能接口示例
  • .NET/C# 中你可以在代码中写多个 Main 函数,然后按需要随时切换
  • .NET版Word处理控件Aspose.words功能演示:在ASP.NET MVC中创建MS Word编辑器
  • .NET企业级应用架构设计系列之应用服务器
  • .NET业务框架的构建
  • .net用HTML开发怎么调试,如何使用ASP.NET MVC在调试中查看控制器生成的html?