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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/587562.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

5G阅信助力互联网行业:XX出行-出票通知,案例分析

XX出行日常有大量业务通知短信下发&#xff0c;用户触达频次和用户打开率都比较高&#xff0c;但原短信无法带来附加营销增值&#xff0c;通过阅信增值服务消息将两者结合起来&#xff0c;可实现业务的多渠道引流&#xff0c;开拓了新的渠道和方式。 项目概述&#xff1a; 1. 项…

Github项目推荐-vocal-separate

项目地址 vocal-separate: 项目简述 这是一个音乐和人声分离的项目&#xff0c;基于python开发。有图形化操作界面&#xff0c;看起来还不错。 项目截图

python弹奏《起风了》

代码是很大的! 其实就是python用ctypes调用Win API import ctypes import threading import time winmm = ctypes.windll.winmmclass Scale:Rest = 0C8 = 108B7 = 107A7s = 106A7 = 105G7s = 104G7 = 103F7s = 102F7 = 101E7 = 100D7s = 99D7 = 98C7s = 97C7 = 96B6 = 95A6s…

蓝桥杯python比赛历届真题99道经典练习题 (71-76)

【程序71】 题目:编写input()和output()函数输入,输出5个学生的数据记录。 1.程序分析: 2.程序源代码: 使用list来模拟结构(不使用class) stu = [string,string,list]N = 3 #stu# num : string# name : string# score[4]: list student = [] for i in range(5):stud…

C练习——判断三角形并求面积

题目&#xff1a;从健盘任意输入三角形的三边长为a,b,c,编程判断a,b,c的值能否构成一个三角形&#xff0c;若能构成三角形&#xff0c;则计算并输出三角形的面积&#xff0c;否则提示不能构成三角形。 已知构成三角形的条件是&#xff1a;任意两边之和大于第三边。 解析&#…

React实现抽屉组件

简介 本文将会基于react实现简单的抽屉组件功能&#xff0c;当列表页点击时候&#xff0c;会显示抽屉详情。 Drawer.js 抽屉组件&#xff0c;通过父组件传递isOpen状态来开启或关闭抽屉。 export const Drawer ({isOpen, children}) > {const [visible, setVisible] u…

基于自定义权重的支持向量机,基于自定义权重的SVM

目录 支持向量机SVM的详细原理 SVM的定义 SVM理论 Libsvm工具箱详解 简介 参数说明 易错及常见问题 完整代码和数据下载链接: 基于自定义权重的支持向量机,基于自定义权重的SVM资源-CSDN文库 https://download.csdn.net/download/abc991835105/88637048 SVM应用实例, 基于支…

再见2023,你好2024

再见2023&#xff0c;你好2024 生活1月 悲伤与治愈2~4月 运动与偏爱5月 体验与美食6月 婚礼与热爱7~8月 就医与别离9~11月 陪伴与暖房12月 体验&新生 运动追剧读书总结 生活 生活是一个修罗场&#xff0c;来世间一场&#xff0c;要经历丰腴有趣的人生。去体验各种滋味&…

Android : 使用GestureDetector 进行手势识别—简单应用

示例图&#xff1a; GestureDetector 介绍&#xff1a; GestureDetector 是 Android 开发中用于识别和处理手势的一个类。它允许开发者检测用户在触摸屏上的各种手势&#xff0c;如滑动、长按、双击等。通过使用 GestureDetector&#xff0c;您可以轻松地为应用程序添加手势识…

【Web API系列】使用异步剪贴板API(async clipboard)的图像的编程复制和粘贴

文章目录 前言一、将数据写入剪切板1. WriteText()2. Write()3. 监听复制事件 二、从剪切板读取数据1.readText()2.read()3. 处理粘贴的文件4. 监听读剪切板事件 三、申请权限政策集成 四、功能检测五、处理多个 MIME 类型 前言 访问系统剪贴板的传统方法是通过 document.exec…

Python---多进程---多线程

总结 1- 多进程&#xff1a;计算机分配资源的最小单位。 2- 多线程&#xff1a;CPU进行任务切换的最小单位。 3- 线程不能独立存在&#xff0c;必须存在在进程中。 4- 多进程中&#xff0c;多个子进程和主进程间&#xff0c;不会共享全局变量 5- 多线程中&#xff0c;多个子线…

考研后SpringBoot复习1

考研后SpringBoot复习 Hello World入门 复习的版本为SpringBoot2的版本 创建maven项目 在pom文件中导入SpringBoot的依赖同时引入web开发的启动器 <!--声明springboot父项目--><parent><groupId>org.springframework.boot</groupId><artifactId>…

【大模型的前世今生】从自然语言处理说起

自然语言处理&#xff08;Natural Language Processing&#xff0c;简称NLP&#xff09;被誉为人工智能皇冠上的明珠&#xff0c;是计算机科学和人工智能领域的一个重要方向。它主要研究人与计算机之间&#xff0c;使用自然语言进行有效通信的各种理论和方法。简单来说&#xf…

AcWing算法提高课-2.3.1矩阵距离

算法提高课整理 CSDN个人主页&#xff1a;更好的阅读体验 本文同步发表于 CSDN | 洛谷 | AcWing | 个人博客 原题链接 题目描述 给定一个 01 矩阵&#xff0c;求矩阵中每个元素离 1 的最短曼哈顿距离。 输入格式 第一行两个整数 n , m n,m n,m。 接下来一个 n n n 行 …

hadoop hive spark flink 安装

下载地址 Index of /dist ubuntu安装hadoop集群 准备 IP地址主机名称192.168.1.21node1192.168.1.22node2192.168.1.23node3 上传 hadoop-3.3.5.tar.gz、jdk-8u391-linux-x64.tar.gz JDK环境 node1、node2、node3三个节点 解压 tar -zxvf jdk-8u391-linux-x64.tar.gz…

分布式文件系统的介绍

什么是分布式文件系统 跨越多个服务器或者多个位置的文件系统。其中涉及的技术包括数据的复制、数据的分片和路由,由于用户可能存储大文件、图片或者其他类似的需求性文件,因此需要设计不同的系统方便用户访问的存取。 任何设备通过任何网络位置访问文件,就像访问到自己的文…

GitHub Copilot 快速入门指南

GitHub Copilot 快速入门指南 GitHub Copilot 是由 GitHub 推出的一款人工智能编程助手&#xff0c;基于 OpenAI 提供的 GPT-3 技术构建。GitHub Copilot 能够根据你编写的注释和代码自动生成代码建议&#xff0c;并且支持多种编程语言。本文将作为一个快速入门指南&#xff0…

华清远见作业第十六天

思维导图&#xff1a; 双向循环链表头插入&#xff1a; 代码&#xff1a; Doublelist insert_head(Doublelist head,datatype element) {//创建新节点sDoublelist screate_node();if(NULLs){return head;}s->dataelement;//数据存储//判断链表是否为空if(NULLhead){heads;…

性能测试-jmeter:安装 / 基础使用

一、理解jmeter 官网-Apache JMeter-Apache JMeter™ JMeter是一款开源的性能测试工具&#xff0c;主要用于模拟大量用户并发访问目标服务器&#xff0c;以评估服务器的性能和稳定性。 JMeter可以执行以下任务序号用途描述1性能测试通过模拟多个用户在同一时间对服务器进行请…

limit查询报错问题

分页时候 limit 后面的公式是 (pageNum-1)*pageSize,pageSize 但是在数据库查询时候 当然在.XML中也不能像下面这么写,如果要计算 在业务层或者控制层计算好再传值进来