C输出与openssl输出不同

时间:2016-02-04 14:00:18

标签: c openssl

给出以下openssl示例prog

#include <openssl/evp.h>

int do_crypt(FILE* in, FILE* out, int do_encrypt)
{
    /* Allow enough space in output buffer for additional block */
    unsigned char inbuf[1024], outbuf[1024 + EVP_MAX_BLOCK_LENGTH];
    int inlen, outlen;
    EVP_CIPHER_CTX* ctx;
    /* Bogus key and IV: we'd normally set these from
     * another source.
     */
    unsigned char key[] = "0123456789abcdeF";
    unsigned char iv[] = "1234567887654321";

    /* Don't set key or IV right away; we want to check lengths */
    ctx = EVP_CIPHER_CTX_new();
    EVP_CipherInit_ex(ctx, EVP_aes_128_cbc(), NULL, NULL, NULL, do_encrypt);
    OPENSSL_assert(EVP_CIPHER_CTX_key_length(ctx) == 16);
    OPENSSL_assert(EVP_CIPHER_CTX_iv_length(ctx) == 16);

    /* Now we can set key and IV */
    EVP_CipherInit_ex(ctx, NULL, NULL, key, iv, do_encrypt);

    for (;;) {
        inlen = fread(inbuf, 1, 1024, in);
        if (inlen <= 0)
            break;
        if (!EVP_CipherUpdate(ctx, outbuf, &outlen, inbuf, inlen)) {
            /* Error */
            EVP_CIPHER_CTX_free(ctx);
            return 0;
        }
        fwrite(outbuf, 1, outlen, out);
    }
    if (!EVP_CipherFinal_ex(ctx, outbuf, &outlen)) {
        /* Error */
        EVP_CIPHER_CTX_free(ctx);
        return 0;
    }
    fwrite(outbuf, 1, outlen, out);

    EVP_CIPHER_CTX_free(ctx);
    return 1;
}

int main(int argc, char* argv[])
{
    FILE *fpIn;
    FILE *fpOut;

    fpIn = fopen("text-in.txt", "rb");
    fpOut = fopen("text-out.txt", "wb");

    int test = do_crypt(fpIn, fpOut, 1);

    fclose(fpIn);
    fclose(fpOut);

    return 0;

}

我希望

openssl aes-128-cbc -in text-in.txt  -K 0123456789abcdeF -iv 1234567887654321

会创建相同的输出。但它并没有。 C编程可以解密它加密的文件。但它无法解密用openssl加密的文件。

1 个答案:

答案 0 :(得分:1)

加密密钥和IV实际上不是文本而是二进制数据。

在命令行上执行加密时,function onAuthenticationSuccess(Request $request, TokenInterface $token) { $user = $token->getUser(); $lastLogin = new \DateTime(); $record = new LoginRecord(); $record->setDate($lastLogin); $user->addLoginRecord($record); $this->container->get('doctrine')->getEntityManager()->flush(); // redirect the user for example return new RedirectResponse($this->container->get('router')->generate('login_success')); } -K参数希望以十六进制输入。

因此,您传入的密钥实际上是:

-iv

IV是:

\x01\x23\x45\x67\x89\xab\xcd\xef\x00\x00\x00\x00\x00\x00\x00\x00

两者的尾部填充为0,因为指定的密钥太短。

为了匹配程序的输出,您需要传入您指定的字符的十六进制代码。例如,\x12\x34\x56\x78\x87\x65\x43\x21\x00\x00\x00\x00\x00\x00\x00\x00 130231a61F等等:

46