1

AES_*openssl ( ) 関数を使用して暗号化されたデータがあります。このコードを更新して、新しい ( EVP_*) 関数を使用するようにします。ただし、古いコードを使用して暗号化されたデータを復号化できるはずです。

古いコードと新しいコードの両方を下に貼り付けました。暗号化/復号化されたコンテンツが異なります。つまり、それらを同じ意味で使用することはできません。これは、古いコードを使用して復号化してから再暗号化することなく、コードをアップグレードできないことを意味します。

どちらの場合も派生が同じにEVP_BytesToKeyなるように、パラメーターの値はありますか。または、( ) 関数aes_keyを使用して同じことを達成する他の方法はありますか? EVP_*に対していくつかの異なる値を試しdigestroundsを作成しようとしましiv NULLたが、実際には機能しませんでした。つまり、古い方法と同じ出力が得られません。

AES_*関数を使用したコード

#include <stdio.h>
#include <openssl/aes.h>
#include <print_util.h>

static const unsigned char user_key[] = {
   0x00, 0x01, 0x02, 0x03,
   0x10, 0x11, 0x12, 0x13,
   0x20, 0x21, 0x22, 0x23,
   0x30, 0x31, 0x32, 0x33
};

int main()
{
    unsigned char p_text[]="plain text";
    unsigned char c_text[16];
    unsigned char d_text[16];

    AES_KEY aes_key;

    AES_set_encrypt_key(user_key, 128, &aes_key);
    AES_encrypt(p_text, c_text, &aes_key);

    printf("plain text = %s\n", p_text);
    printbuf((char*)c_text, 16, "cipher text = ");

    AES_set_decrypt_key(user_key, 128, &aes_key);
    AES_decrypt(c_text, d_text, &aes_key);
    printf("plain text (decrypted) = %s \n", d_text);

    return 0;
}

EVP_*関数を使用したコード。(暗号化コードは以下にあり、復号化コードも同様です)。

#include <strings.h>
#include <openssl/evp.h>
#include <print_util.h>

static const unsigned char user_key[16] = {
   0x00, 0x01, 0x02, 0x03,
   0x10, 0x11, 0x12, 0x13,
   0x20, 0x21, 0x22, 0x23,
   0x30, 0x31, 0x32, 0x33
};

int main()
{
    EVP_CIPHER_CTX *ctx = (EVP_CIPHER_CTX*)malloc(sizeof(EVP_CIPHER_CTX));
    EVP_CIPHER_CTX_init(ctx);

    const EVP_CIPHER *cipher = EVP_aes_128_ecb(); // key size 128, mode ecb
    const EVP_MD *digest = EVP_md5();
    int rounds = 10;
    unsigned char aes_key[EVP_MAX_KEY_LENGTH];
    unsigned char aes_iv[EVP_MAX_IV_LENGTH];

    EVP_BytesToKey(cipher, digest, NULL, user_key, 16, rounds, aes_key, aes_iv);

    EVP_EncryptInit(ctx, cipher, aes_key, aes_iv);

    unsigned char p_text[]="plain text"; int p_len = sizeof(p_text);
    unsigned char c_text[16]; int c_len = 16;
    int t_len;

    EVP_EncryptUpdate(ctx, c_text, &c_len, p_text, p_len);
    EVP_EncryptFinal(ctx, (c_text + c_len), &t_len);

    c_len += t_len;

    printf("==> p_text: %s\n", p_text);
    printbuf((char*)c_text, c_len, "==> c_text:");
}

ありがとう

4

1 に答える 1

2

コードにはキーの派生がありません。したがって、完全な互換性を維持したい場合は、新しいコードAES_*などでキーの派生を使用しないでください。EVP_BytesToKeyEVP_

いいえ、EVP_BytesToKey出力を生成するために暗号化ハッシュが使用されるため、出力を上記と同じキーにする方法はありません。

于 2014-12-31T00:54:36.730 に答える