gpt4 book ai didi

openssl - AES_encrypt/AES_decrypt 只返回消息的一部分

转载 作者:行者123 更新时间:2023-12-05 00:22:28 26 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





AES ECB encrypt/decrypt only decrypts the first 16 bytes

(2 个回答)


4年前关闭。




我不知道为什么下面的代码会返回“Hello native!Th”而不是“Hello native!This is from 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操作 16 字节块。 16 是 AES 的块大小。

实际上,您截断了您的消息。

AES_decrypt(pout, outout, &aesKey);



在这里,您只解密了 16 个字节。缓冲区的其余部分用 0 回填。 0 用作 ASCII-Z 终止符。

您正在 ECB 模式下有效地操作密码。 ECB 模式可能是您需要的错误模式。 ECB 模式只有在用一个 key 加密一条消息时才是安全的。否则,攻击者会了解到同一条消息被加密了两次。

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

您可能应该使用 CBC 模式。您还应该使用 EVP_*函数而不是 AES_encryptAES_decrypt .见 EVP Symmetric Encryption and Decryption在 OpenSSL 维基上。

如果您只是对数据进行加密,那么您就缺乏完整性和真实性的保证。所以密文是有延展性的,这通常是一件坏事。在这种情况下,最好使用 EAX、CCM 或 GCM 等模式。为此,请参阅 EVP Authenticated Encryption and Decryption .

关于openssl - AES_encrypt/AES_decrypt 只返回消息的一部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29837830/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com