前面,已经对于一个vs 2019 的jni环境的搭建已经做了说明。
免费机票 Jni:使用openssl库进行rsa加密解密 (环境搭建篇)
安装Openssl
windows安装:
百度网盘下载
链接:https://pan.baidu.com/s/10WlgBJ3J25oIH4JXVgWLOA
提取码:ABCD
无脑安装版,略过。这里你要记住你安装好的位置。例如我的是 C:\Program Files\OpenSSL-Win64
Centos安装:
这里我是在网上摘抄的。安装这些就不写了,不是本篇重点
mkdir /opt/openssl -p
cd /opt/openssl
wget http://www.openssl.org/source/openssl-1.0.2j.tar.gz
tar -zxf openssl-1.0.2j.tar.gz
./config --prefix=/usr/local/openssl
make & make install
vs 2019 中引入openssl库
1、右键项目,选择Properties,之后把 openssl的安装目录下的include加到以下位置(偷懒直接贴图)
2、添加openssl的lib到lib directories中
3、添加libssl.lib和libcrypto.lib 到link中
至此,你的openssl环境基本搭建好了
RSA加密解密
公钥加密
注意:准备的公钥需要以 “-----BEGIN PUBLIC KEY-----\n"开头,以”\n-----END PUBLIC KEY-----\n"结尾,里面的’\n’表示换号符
注意:准备的私钥需要以 “-----BEGIN RSA PRIVATE KEY-----\n"开头,以”\n-----END RSA PRIVATE KEY-----\n"结尾,里面的’\n’表示换号符
Jni的转换操作类,主要是为了方便java跟c++的类型转换方便
MyJniConvertUtils.h
#pragma once
#include <iostream>
#include <jni.h>
#include <string.h>
class MyJniConvertUtils
{
public:
static int toCharArray(JNIEnv* env, jbyteArray byteArray, char*& dest);
static int toCharArray(JNIEnv* env, jstring param, char*& dest);
static jbyteArray toJbyteArray(JNIEnv* env, const char* data, const int length);
static std::string getProperty(JNIEnv* env, std::string key);
static std::string toString(const char* chars, const int length);
static jstring toJString(JNIEnv* env, const std::string input);
static std::string toString(JNIEnv* env, jstring param);
};
MyJniConvertUtils.cpp
#include "MyJniConvertUtils.h"
#include <string.h>
jstring MyJniConvertUtils::toJString(JNIEnv* env, const std::string input) {
const char* cs = input.c_str();
jclass strClass = (env)->FindClass("Ljava/lang/String;");
jmethodID ctorID = (env)->GetMethodID(strClass, "<init>", "([BLjava/lang/String;)V");
jbyteArray bytes = (env)->NewByteArray(strlen(cs));
(env)->SetByteArrayRegion(bytes, 0, strlen(cs), (jbyte*)cs);
jstring encoding = (env)->NewStringUTF("UTF8");
return (jstring)(env)->NewObject(strClass, ctorID, bytes, encoding);
}
int MyJniConvertUtils::toCharArray(JNIEnv* env, jbyteArray byteArray, char*& dest) {
jbyte* bytes;
bytes = env->GetByteArrayElements(byteArray, 0);
int byteLength = env->GetArrayLength(byteArray);
int length = byteLength + 1;
dest = new char[length];
memset(dest, 0, length);
memcpy(dest, bytes, byteLength);
env->ReleaseByteArrayElements(byteArray, bytes, 0);
return length;
}
int MyJniConvertUtils::toCharArray(JNIEnv* env, jstring param, char*& dest) {
</