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在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/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。
数据库技术 2022-03-28
网站技术 2022-11-26
网站技术 2023-01-07
网站技术 2022-11-17
Windows相关 2022-02-23
网站技术 2023-01-14
Windows相关 2022-02-16
Windows相关 2022-02-16
Linux相关 2022-02-27
数据库技术 2022-02-20
抠敌 2023年10月23日
嚼餐 2023年10月23日
男忌 2023年10月22日
瓮仆 2023年10月22日
簿偌 2023年10月22日
扫码二维码
获取最新动态