Openssl EVP加密/解密无法正常工作

时间:2015-11-01 16:12:23

标签: c openssl

该应用程序的目的是拉出$ 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);

以下代码用于解密(我删除了提供私钥并初始化EVP的部分):

HANDLE decryptedMFTfile=CreateFile("MFT_decrypted.dat",GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
DWORD BytesWritten2;
while(bytesRead>0)
{
    ReadFile(encryptedMFT,buffer,sizeof(buffer),&bytesRead,NULL);

    if (!EVP_OpenUpdate(&ctx, buffer_out, &len_out, buffer, len))
    {
        printf("EVP OPEN FAILED \n");
    }
    WriteFile(decryptedMFTfile, &buffer_out, sizeof(buffer_out), &BytesWritten2, NULL);

}
根据请求

创建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;
}

0 个答案:

没有答案