Encryption 使用AES_*函数和EVP_*函数进行加密

Encryption 使用AES_*函数和EVP_*函数进行加密,encryption,cryptography,openssl,aes,evp-cipher,Encryption,Cryptography,Openssl,Aes,Evp Cipher,我有一些数据是使用openssl(AES.*)函数加密的。我希望更新此代码以使用更新的(EVP.*)函数。但是应该能够解密使用旧代码加密的数据 我已将新旧代码粘贴到下面。加密/解密的内容不同。i、 我不能互换使用它们。这意味着如果不使用旧代码进行解密然后重新加密,我就无法升级代码 EVP\u BytesToKey的参数是否有任何值,以便aes\u key在这两种情况下都是相同的。或者使用(EVP.*)函数是否有其他方法来实现同样的功能?我尝试了几个不同的值,用于摘要,轮次,并尝试将iv设为空,但

我有一些数据是使用openssl(
AES.*
)函数加密的。我希望更新此代码以使用更新的(
EVP.*
)函数。但是应该能够解密使用旧代码加密的数据

我已将新旧代码粘贴到下面。加密/解密的内容不同。i、 我不能互换使用它们。这意味着如果不使用旧代码进行解密然后重新加密,我就无法升级代码

EVP\u BytesToKey
的参数是否有任何值,以便
aes\u key
在这两种情况下都是相同的。或者使用(
EVP.*
)函数是否有其他方法来实现同样的功能?我尝试了几个不同的值,用于
摘要
轮次
,并尝试将
iv设为空
,但没有真正起作用,即它没有提供与旧方法相同的输出

使用
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;
}

谢谢

您的
AES.*
代码中没有任何密钥派生,因此如果您想保持完全兼容,您不应该在新的
EVP.
代码中使用任何密钥派生,例如
EVP.\u BytesToKey


不,没有办法让
EVP\u BytesToKey
输出与上述相同的密钥,因为加密散列用于生成输出。

我尝试避免
EVP\u BytesToKey
,并直接将
用户密钥
与NULL
iv
一起使用,但这也不行。我建议引入向后兼容代码,让人们使用新函数。第一个示例使用原始密钥,而第二个示例使用密钥派生函数(
EVP\u BytesToKey
)。ECB模式不使用初始化向量。AES加密始终在16字节块(AES blocksize)上运行,因此您正在加密字符串
“纯文本”
之后的垃圾邮件,因为该字符串只有10字节。调用
Final
时,
EVP\u-Encypt
正在添加PKCS填充。您不应该使用
AES\u-encrypt
和friends。您应该使用
EVP.*
函数。
EVP.*
功能使用硬件,如AES-NI(如果可用)。请参见OpenSSL wiki上的。事实上,您可能应该使用经过身份验证的加密,因为它同时提供机密性和真实性。请参见OpenSSL wiki上的。用于某些内部组件。以前使用MD5,1.1.0切换到SHA256。请注意,此更改不会影响
EVP\u BytesToKey
openssl enc
等命令。
#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:");
}