0

我的想法是在客户端服务器模型中进行文件加密,我使用 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

我参考了这个链接,其中报告并解决了带有解密的无效字符的问题。

使用 openssl evp api(aes256cbc) 加密文件的问题

我希望有人可以在这里帮助我。

提前致谢。

4

1 回答 1

1

使用 openssl evp aes_256_ctr() 模式加密时生成的无效字符...

...因为我发现密文中存在无法存储在文件中的无效字符

我认为这是你的问题。它不太正确。

您可以在文件中存储任何内容(任何字符)。C-strings 有点不同,但你不是在使用字符串。

所有字符在密文中的概率均等(与任何其他字符的概率相同,例如 0x00、0x01、...'A'、'B'、...'a'、'b'、...、0xFE、 0xFF)。


fprintf(stdout,"\n原件:%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);
...

您也忽略了返回值。这通常是个坏主意。

于 2014-12-21T13:04:45.800 回答