我的想法是在客户端服务器模型中进行文件加密,我使用openssl evp进行加密。我需要将密文存储在文本文件中并将其发送到客户端。但我无法这样做,因为我发现密码文本中存在无效字符,无法存储在文件中。
这是我的加密代码:
EVP_CIPHER_CTX_init(&ctx);
EVP_CipherInit_ex(&ctx, EVP_aes_256_ctr(), NULL, NULL, NULL,
do_encrypt);
OPENSSL_assert(EVP_CIPHER_CTX_key_length(&ctx) == 32);
OPENSSL_assert(EVP_CIPHER_CTX_iv_length(&ctx) == 16);
EVP_CipherInit_ex(&ctx, NULL, NULL, key, iv, do_encrypt);
//receive the file contents in chunks of 1024 bytes
while ((inlen = recv(connfd, inbuf, sizeof inbuf, 0)) > 0) {
fprintf(stdout,"\nReceived %d bytes",inlen);
fflush(stdout);
fprintf(stdout,"\nOriginal: %s",inbuf);
fflush(stdout);
//use encrypt_update() to encrypt the chunks
if(!EVP_CipherUpdate(&ctx, outbuf, &outlen, inbuf, inlen)) {
/* Error */
EVP_CIPHER_CTX_cleanup(&ctx);
return 0;
}
//write the encrypted text to out file
fprintf(stdout,"\nEncrypted: %s %d",outbuf, inlen);
fflush(stdout);
fwrite(outbuf, sizeof(char), outlen, fp);
//clear the buffer
memset(inbuf,0, strlen(inbuf));
memset(outbuf,0, strlen(outbuf));
}
//use encrypt_final() to encrypt the final letf out block of chunk is any
if(!EVP_CipherFinal_ex(&ctx, outbuf, &outlen)) {
/* Error */
EVP_CIPHER_CTX_cleanup(&ctx);
return 0;
}
//write the encrypted text to out file
fwrite(outbuf, sizeof(char), outlen, fp);
EVP_CIPHER_CTX_cleanup(&ctx); //cleanup
fclose(fp); //close the file
我引用了此链接,其中报告并解决了解密的无效字符问题。
Issues with encrypting a file using openssl evp api(aes256cbc)
我希望有人可以帮助我。
提前致谢。
答案 0 :(得分:1)
使用openssl evp aes_256_ctr()模式加密时生成的字符无效...
...因为我发现密码文本中存在无效字符,无法存储在文件中
我认为这是你的问题。它不太正确。
您可以在文件中存储任何内容(任何字符)。 C字符串略有不同,但您没有使用字符串。
所有字符同样可能在密文中(与任何其他字符同样可能,如0x00,0x01,......'A','B',......'a','b',...... ,0xFE,0xFF)。
fprintf(stdout,“\ nOriginal:%s”,inbuf);
如果inbuf
具有嵌入式NULL
,则可能会出现问题。我以为你在处理文件而不是字符串?
memset(inbuf,0, strlen(inbuf)); memset(outbuf,0, strlen(outbuf));
正如铱星所说,这些不是必需的。你应该使用像recv
这样的函数的返回值(并且不依赖于像NULL
这样的可分辨字符,因为它同样可能在密文中(与其他任何字符一样可能,如0x00,0x01 ,. ..'A','B',......'a','b',...,0xFE,0xFF)。
EVP_CIPHER_CTX_init(&ctx);
EVP_CipherInit_ex(&ctx, EVP_aes_256_ctr(), NULL, NULL, NULL, do_encrypt);
...
您也忽略了返回值。这通常是一个坏主意。