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

相关推荐

  1. Android集成OpenSSL实现解密-JNI实现

    2023-12-29 08:06:04       58 阅读
  2. 基于openssl实现AES ECB解密

    2023-12-29 08:06:04       23 阅读
  3. jni,android

    2023-12-29 08:06:04       39 阅读
  4. rust学习(openssl rsa解密文件)

    2023-12-29 08:06:04       33 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-29 08:06:04       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-29 08:06:04       101 阅读
  3. 在Django里面运行非项目文件

    2023-12-29 08:06:04       82 阅读
  4. Python语言-面向对象

    2023-12-29 08:06:04       91 阅读

热门阅读

  1. PyTorch中各种求和运算

    2023-12-29 08:06:04       60 阅读
  2. 讲解机器学习中的 K-均值聚类算法及其优缺点。

    2023-12-29 08:06:04       62 阅读
  3. 浏览器强缓存和协商缓存

    2023-12-29 08:06:04       60 阅读
  4. LeetCode [24] 两两交换链表中的节点

    2023-12-29 08:06:04       67 阅读
  5. Kotlin 派生类

    2023-12-29 08:06:04       51 阅读
  6. Go面试题学习

    2023-12-29 08:06:04       65 阅读
  7. Leetcode 509 斐波那契数

    2023-12-29 08:06:04       46 阅读
  8. 什么是ETL?

    2023-12-29 08:06:04       54 阅读