C Openssl EVP加密/解密不工作

C Openssl EVP加密/解密不工作,c,openssl,C,Openssl,应用程序的目的是提取$MFT,对其进行加密并将其保存在磁盘上。代码的第二部分是解密它并以清晰的形式保存它。 由于某种原因,解密过程不起作用,我得到的只是胡言乱语,显然相同的4096字节一遍又一遍地重复。 我知道代码是脏的,我尽量减少它,但如果有人发现任何明显的问题,请告诉我 谢谢 char publicKey[]="-----BEGIN PUBLIC KEY-----\n"\ "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCg

应用程序的目的是提取$MFT,对其进行加密并将其保存在磁盘上。代码的第二部分是解密它并以清晰的形式保存它。 由于某种原因,解密过程不起作用,我得到的只是胡言乱语,显然相同的4096字节一遍又一遍地重复。 我知道代码是脏的,我尽量减少它,但如果有人发现任何明显的问题,请告诉我

谢谢

    char publicKey[]="-----BEGIN PUBLIC KEY-----\n"\
                 "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAy8Dbv8prpJ/0kKhlGeJY\n"\
                 "ozo2t60EG8L0561g13R29LvMR5hyvGZlGJpmn65+A4xHXInJYiPuKzrKUnApeLZ+\n"\
                 "vw1HocOAZtWK0z3r26uA8kQYOKX9Qt/DbCdvsF9wF8gRK0ptx9M6R13NvBxvVQAp\n"\
                 "fc9jB9nTzphOgM4JiEYvlV8FLhg9yZovMYd6Wwf3aoXK891VQxTr/kQYoq1Yp+68\n"\
                 "i6T4nNq7NWC+UNVjQHxNQMQMzU6lWCX8zyg3yH88OAQkUXIXKfQ+NkvYQ1cxaMoV\n"\
                 "PpY72+eVthKzpMeyHkBn7ciumk5qgLTEJAfWZpe4f4eFZj/Rc8Y8Jj2IS5kVPjUy\n"\
                 "wQIDAQAB\n"\
                 "-----END PUBLIC KEY-----\n";
rsa_pkey = createRSA(publicKey,1);
if (!EVP_PKEY_assign_RSA(pkey, rsa_pkey))
{
    printf("EVP_PKEY_assign_RSA: failed.\n");
    return 1;
}
EVP_CIPHER_CTX_init(&ctx);
ek = malloc(EVP_PKEY_size(pkey));

if (!EVP_SealInit(&ctx, EVP_aes_128_cbc(), &ek, &eklen, iv, &pkey, 1))
{
    printf("EVP_SealInit: failed.\n");
}
eklen_n = htonl(eklen);

DWORD BytesWritten2;
if(WriteFile(outputMFTfile, &eklen_n, sizeof(eklen_n), &BytesWritten2, NULL))
{
    printf("Written %d bytes to the file header [EK LEN]\n",BytesWritten2);
}
if(WriteFile(outputMFTfile, ek, eklen, &BytesWritten2, NULL))
{
    printf("Written %d bytes to the file header [EK]\n",BytesWritten2);
}
if(WriteFile(outputMFTfile, iv, EVP_CIPHER_iv_length(EVP_aes_128_cbc()), &BytesWritten2, NULL))
{
    printf("Written %d bytes to the file header [IV]\n",BytesWritten2);
}

while (ReadFile(hRawDisk, FINAL_MFT_BUFFER, 4096, &bytesRead, NULL))
    {
        bytesCounter = bytesCounter+(unsigned long long)bytesRead;
        if (bytesCounter<final_length)
        {
            if (!EVP_SealUpdate(&ctx, buffer_out, &len_out, FINAL_MFT_BUFFER, bytesRead))
            {
                printf("FAILED SEAL UPDATE \n");
            }
            WriteFile(outputMFTfile, buffer_out, len_out, &BytesWritten, NULL);

        }
        else
        {
            break;
        }
    }
    if (!EVP_SealFinal(&ctx, buffer_out, &len_out))
{
    printf("FINAL SEAL FAILED\n");
}
else
{
    DWORD BytesWritten;
    WriteFile(outputMFTfile, buffer_out, len_out, &BytesWritten, NULL);

}

EVP_CIPHER_CTX_cleanup(&ctx);
根据请求创建RSA代码:

RSA * createRSA(unsigned char * key,int public)
{
RSA *rsa= NULL;
BIO *keybio ;
keybio = BIO_new_mem_buf(key, -1);
if (keybio==NULL)
{
    printf( "Failed to create key BIO");
    return 0;
}
if(public)
{
    rsa = PEM_read_bio_RSA_PUBKEY(keybio, &rsa,NULL, NULL);
}
else
{
    rsa = PEM_read_bio_RSAPrivateKey(keybio, &rsa,NULL, NULL);
}
if(rsa == NULL)
{
    printf( "Failed to create RSA");
}

return rsa;
}
您能发布createRSA代码吗?调用EVP_OpenUpdate时,len的值是多少?为什么不使用bytesRead的值呢?
RSA * createRSA(unsigned char * key,int public)
{
RSA *rsa= NULL;
BIO *keybio ;
keybio = BIO_new_mem_buf(key, -1);
if (keybio==NULL)
{
    printf( "Failed to create key BIO");
    return 0;
}
if(public)
{
    rsa = PEM_read_bio_RSA_PUBKEY(keybio, &rsa,NULL, NULL);
}
else
{
    rsa = PEM_read_bio_RSAPrivateKey(keybio, &rsa,NULL, NULL);
}
if(rsa == NULL)
{
    printf( "Failed to create RSA");
}

return rsa;
}