@coolbober

Почему не шифруется текст?

Пытаюсь вставить шифрующий модуль, написанный на С/С++ в android приложение. Вроде вставил, вроде все работает, но приложение не работает.

native-lib.cpp
#include <jni.h>
#include <string>
#include "gost34-12-15.h"
#include "gost34-13-15.h"
#include "main.cpp"
#include <android/log.h>

std::string jstring2string (JNIEnv * env, jstring jStr);

extern "C" JNIEXPORT jstring JNICALL
Java_com_example_maxim_onlyforc_MainActivity_stringFromJNI(
        JNIEnv *env,
        jobject obj, jstring msg) {

    jstring msg2= crypto(env, msg);
    std::string text = jstring2string(env, msg2) + " проверка";
    return env->NewStringUTF(text.c_str());
}

std::string jstring2string (JNIEnv * env, jstring jStr) {

    if (!jStr)
        return "";

    const jclass stringClass = env->GetObjectClass(jStr);
    const jmethodID getBytes = env->GetMethodID(stringClass, "getBytes", "(Ljava/lang/String;)[B");
    const jbyteArray stringJbytes = (jbyteArray) env->CallObjectMethod(jStr, getBytes, env->NewStringUTF("UTF-8"));

    size_t length = (size_t) env->GetArrayLength(stringJbytes);
    jbyte* pBytes = env->GetByteArrayElements(stringJbytes, NULL);

    std::string ret = std::string((char *)pBytes, length);
    env->ReleaseByteArrayElements(stringJbytes, pBytes, JNI_ABORT);

    env->DeleteLocalRef(stringJbytes);
    env->DeleteLocalRef(stringClass);
    return ret;
}


main.cpp
#include <jni.h>
#include <string>
#include "gost34-12-15.h"
#include "gost34-13-15.h"

unsigned char* jstring2char(JNIEnv * env, jstring);
jbyteArray StringToJByteArray(JNIEnv * env, const std::string &nativeString);

jstring crypto(JNIEnv *env, jstring msg)
{
    // Открытый текст для ГОСТ 34.13-15 \\
    byte* text = jstring2char(env, msg);

    byte key[] = {                                                                      // ключ
                0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff, 0x00, 0x11,
                0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0xfe, 0xdc, 0xba, 0x98, 0x76,
                0x54, 0x32, 0x10, 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef};

    byte IV[] = {0x12, 0x34, 0x56, 0x78, 0x90, 0xab, 0xce, 0xf0, 0xa1, 0xb2,            //синхр. посылка
                 0xc3, 0xd4, 0xe5, 0xf0, 0x01, 0x12, 0x23, 0x34, 0x45, 0x56, 0x67,
                 0x78, 0x89, 0x90, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19};

    init128Gost34_12_15(key);
    encrypt_decrypt_OFB(IV, text, sizeof (text));
    close128Gost34_12_15();
    closeGost34_13_15(IV);
    jstring newText = (*env).NewStringUTF((const char*) text);
    byte* text2 = jstring2char(env, newText);
    return newText;
}

unsigned char* jstring2char (JNIEnv * env, jstring jStr) {

    const jclass stringClass = env->GetObjectClass(jStr);
    const jmethodID getBytes = env->GetMethodID(stringClass, "getBytes", "(Ljava/lang/String;)[B");
    const jbyteArray stringJbytes = (jbyteArray) env->CallObjectMethod(jStr, getBytes, env->NewStringUTF("UTF-8"));

    int len = env->GetArrayLength(stringJbytes);
    unsigned char* buf = new unsigned char[len];
    env->GetByteArrayRegion(stringJbytes, 0, len, reinterpret_cast<jbyte*>(buf));
    return buf;
}

jbyteArray StringToJByteArray(JNIEnv * env, const std::string &nativeString) {
    jbyteArray arr = env->NewByteArray(nativeString.length());
    env->SetByteArrayRegion(arr,0,nativeString.length(),(jbyte*)nativeString.c_str());
    return arr;
}


В Java файле все стандартно (т.е. там файл практически не менял после создания проекта с поддержкой С/С++). Подключаемые библиотеки тоже не кидаю, так как сам по себе шифрующий модуль работал и на Qt и на Visual Studio. Т.е. дело не в нем.

Итого на экран должен выводить зашифрованный текст + слово проверка. Но он выводит почему-то просто открытый текст и я совсем не понимаю почему. В чем проблема?
  • Вопрос задан
  • 82 просмотра
Пригласить эксперта
Ответы на вопрос 1
Konachan700
@Konachan700
Вот это выглядит подозрительно - text2 не используется.
jstring newText = (*env).NewStringUTF((const char*) text);
    byte* text2 = jstring2char(env, newText);
    return newText;
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через TM ID
Похожие вопросы
BTlabs Москва
от 60 000 руб.
Blogman Оренбург
от 20 000 до 110 000 руб.
Frogogo Москва
от 100 000 руб.