AES_encrypt/AES_decrypt只返回信息的一部分

 2023-01-20    263  

问题描述

我不知道为什么以下代码会返回” Hello asnation!th”不是” Hello natiber!这是来自Jni Load!\ 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((const unsigned char *)origin, (unsigned char *)out, &aesKey);

AES_encrypt/AES_decrypt只返回信息的一部分

AES_encrypt在16字节块上操作. 16是AE的块大小.

有效地,您截断了您的消息.

AES_decrypt(pout, outout, &aesKey);

在这里,您只解密了16个旁白.其余的缓冲液填充了0.0用作ASCII-Z终结者.


您在欧洲央行模式下有效地操作密码.欧洲央行模式可能是您需求的错误模式.欧洲央行模式只有在一个密钥下对一条消息进行加密时才安全.否则,攻击者学会了两次加密相同的消息.

此外,如果 唯一的安全该消息小于块大小.如果消息大于块大小,则欧洲央行模式可能会泄漏信息.


您可能应该使用CBC模式.您还应该使用EVP_*函数而不是AES_encrypt和AES_decrypt.请参阅 evp对称加密和解密 Openssl Wiki.

如果您仅加密数据,则缺乏完整性和真实性保证.因此,密码文本是可延展的,这通常是一件坏事.在这种情况下,最好使用EAX,CCM或GCM之类的模式. For that, see EVP Authenticated Encryption and Decryption.

其他推荐答案

每个调用aes_encrypt加密一个AES块… 16字节.这就是为什么一个通话后,您最终在加密的缓冲区中精确地获得了16个字符.

以上所述是小编给大家介绍的AES_encrypt/AES_decrypt只返回信息的一部分,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对77isp云服务器技术网的支持!

原文链接:https://77isp.com/post/26031.html

=========================================

https://77isp.com/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。