使用Openssl EVP库加密和使用Openssl enc terminal命令解密失败

使用Openssl EVP库加密和使用Openssl enc terminal命令解密失败,c,security,encryption,openssl,C,Security,Encryption,Openssl,我正在尝试使用OpenSSL EVP库对字符串进行加密,然后从linux终端使用OpenSSL命令进行解密。 用于解密的OpenSSL命令: openssl enc -aes-256-cbc -base64 -salt -d -md md5 -k <passphrase> -in encrypt.txt -out plain.txt 将加密字符串从上面编码为base64的代码: int CBase64::encode(const unsigned char* msg, const

我正在尝试使用OpenSSL EVP库对字符串进行加密,然后从linux终端使用OpenSSL命令进行解密。 用于解密的OpenSSL命令:

openssl enc -aes-256-cbc -base64 -salt -d -md md5 -k <passphrase> -in encrypt.txt -out plain.txt
将加密字符串从上面编码为base64的代码:

int CBase64::encode(const unsigned char* msg, const size_t msg_len, char** b64_msg) {
  size_t bytes_encoded = 0;
  bytes_encoded = EVP_EncodeBlock((unsigned char *) *b64_msg, msg, msg_len);
  return bytes_encoded;
}
键和IV派生

void CAES::init_key_iv(const std::string& pass, const unsigned char* salt, unsigned char* key, unsigned char* iv )
{
  const unsigned char * pass_key = reinterpret_cast<const unsigned char*>( pass.c_str() );
  const size_t pass_key_len ( pass.size() );
  EVP_BytesToKey(CAES::cipher_type, CAES::msg_digest_type, salt, pass_key, pass_key_len, 1, key, iv);
}
案例1:

const char* password = "@N";
const char* msg = "neo4j";
在尝试解密时,我得到以下信息:

bad decrypt
140589946300064:error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt:evp_enc.c:539:
error reading input file
案例2:

const char* password = "eemnsis";
const char* msg = "This is long message, repeating 10 times.This is long message, repeating 10 times.This is long message, repeating 10 times.This is long message, repeating 10 times.This is long message, repeating 10 times.This is long message, repeating 10 times.This is long message, repeating 10 times.This is long message, repeating 10 times.This is long message, repeating 10 times.This is long message, repeating 10 times.";
在尝试解密时,我得到以下信息:

bad decrypt
140589946300064:error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt:evp_enc.c:539:
error reading input file

我怀疑是Base64编码

在用于解密的
openssl
语句中,使用
-base64
选项时不使用
-A
选项。因此,需要一个格式化的Base64字符串,即在每个64字节之后,末尾有换行符,请参阅

但是,当前的
encode
函数不执行此操作,而是将整个Base64字符串写入一行

这个问题可以通过以下方法解决:

  • -A
    选项添加到
    openssl
    语句中进行解密:
    -base64-A

  • 或者修改
    encode
    方法以包括换行符,例如使用等):


我怀疑是Base64编码

在用于解密的
openssl
语句中,使用
-base64
选项时不使用
-A
选项。因此,需要一个格式化的Base64字符串,即在每个64字节之后,末尾有换行符,请参阅

但是,当前的
encode
函数不执行此操作,而是将整个Base64字符串写入一行

这个问题可以通过以下方法解决:

  • -A
    选项添加到
    openssl
    语句中进行解密:
    -base64-A

  • 或者修改
    encode
    方法以包括换行符,例如使用等):


谢谢您的评论<代码>EVP_ENCODE_CTX_new和
EVP_ENCODE_CTX_free
对我不可用。提醒:使用
openssl
解密时,您也可以使用
-a
-选项!否则,您将需要找到一种与您的环境兼容的Base64编码,该编码考虑了换行。很难推荐任何东西,因为我不了解您的环境,但在Internet上有许多实现,例如。这里,在
Base64Encode
函数中设置标志
BIO\u FLAGS\u BASE64\u NO\u NL
,将BASE64字符串写入一行。可能这个方法可以调整以考虑换行(我还没有尝试过)。谢谢你的评论<代码>EVP_ENCODE_CTX_new和
EVP_ENCODE_CTX_free
对我不可用。提醒:使用
openssl
解密时,您也可以使用
-a
-选项!否则,您将需要找到一种与您的环境兼容的Base64编码,该编码考虑了换行。很难推荐任何东西,因为我不了解您的环境,但在Internet上有许多实现,例如。这里,在
Base64Encode
函数中设置标志
BIO\u FLAGS\u BASE64\u NO\u NL
,将BASE64字符串写入一行。这种方法可能适合于考虑换行(不过我还没有尝试过)。
int CBase64::encode(const unsigned char* msg, const size_t msg_len, char** b64_msg) {
    int len, total = 0;
    EVP_ENCODE_CTX *ectx = EVP_ENCODE_CTX_new();
    EVP_EncodeInit(ectx);
    EVP_EncodeUpdate(ectx, (unsigned char *)*b64_msg, &len, msg, msg_len);
    total += len;
    EVP_EncodeFinal(ectx, (unsigned char *)*b64_msg + len, &len);
    total += len;
    EVP_ENCODE_CTX_free(ectx);
    return total;
}