Openssl AES_encrypt/AES_decrypt仅返回消息的一部分

Openssl AES_encrypt/AES_decrypt仅返回消息的一部分,openssl,java-native-interface,Openssl,Java Native Interface,我不知道为什么下面的代码会返回“Hello native!Th”而不是“Hello native!这是来自jni加载!\n”,有人可以提示它吗 #include "helloJNI.h" #include "openssl/aes.h" #define LEN 1024 jstring jni_text(JNIEnv *env, jclass clz) { AES_KEY aesKey; int result; const char origin[] = "Hello

我不知道为什么下面的代码会返回“Hello native!Th”而不是“Hello native!这是来自jni加载!\n”,有人可以提示它吗

#include "helloJNI.h"
#include "openssl/aes.h"

#define LEN 1024

jstring jni_text(JNIEnv *env, jclass clz)
{
    AES_KEY aesKey;
    int result;
    const char origin[] = "Hello native! This is from jni load!\n";
    char out[LEN];
    char outout[LEN];
    memset(out, '\0', sizeof(out));
    memset(outout, '\0', sizeof(outout));
    result = AES_set_encrypt_key((const unsigned char *)"abc123", 256, &aesKey);
    LOGE("encypt key result %d\n", result); /* is 0 */
    AES_encrypt((const unsigned char *)origin, (unsigned char *)out, &aesKey);
    LOGE("after encrypt, chars is %s\n", out);
    result = AES_set_decrypt_key((const unsigned char *)"abc123", 256, &aesKey);
    LOGE("decrypt key result %d\n", result); /* is 0 */
    AES_decrypt(out, outout, &aesKey);
    LOGE("after decrypt, chars is %s\n", outout);
    return (*env)->NewStringUTF(env, outout); /* return "Hello native! Th" */
}

每次调用AES_encrypt加密一个AES块…16字节。这就是为什么在一次调用中,加密缓冲区中正好有16个字符

AES\u加密((const unsigned char*)来源,(unsigned char*)输出,&aesKey)

AES_encrypt
对16字节块进行操作。16是AES的块大小

实际上,您截断了邮件

AES_解密(pout、out和aesKey)

在这里,你只解密了16个“是”。缓冲区的其余部分已用0回填。0用作ASCII-Z终止符


您正在ECB模式下有效地操作密码。ECB模式可能不适合您的需要。ECB模式只有在一个密钥下加密一条消息时才是安全的。否则,攻击者会发现同一消息已加密两次

此外,只有当消息小于块大小时,它才是安全的。如果消息大于块大小,则ECB模式可能泄漏信息


您可能应该使用CBC模式。您还应该使用
EVP.*
函数,而不是
AES\u encrypt
AES\u decrypt
。请参见OpenSSL wiki上的


如果只加密数据,则缺乏完整性和真实性保证。所以密码文本是可延展的,这通常是一件坏事。在这种情况下,最好使用EAX、CCM或GCM等模式。为此,请参阅。

为什么要为此编写JNI?这一切都可以用Java直接完成。谢谢,我是新手,这些信息非常有用!