当前位置: 首页 > 知识库问答 >
问题:

AES用OpenSSL加密,用mcrypt解密

谷梁驰
2023-03-14

我正在使用以下函数通过Qt中的OpenSSL库加密我的数据:

QByteArray Crypto::Encrypt(QByteArray source, QString password)
{
  EVP_CIPHER_CTX en;

  unsigned char *key_data;
  int key_data_len;

  QByteArray ba = password.toLatin1();
  key_data = (unsigned char*)ba.data();
  key_data_len = strlen((char*)key_data);

  int nrounds = 28;
  unsigned char key[32], iv[32];

  EVP_BytesToKey(EVP_aes_256_cbc(), EVP_sha1(), NULL, key_data, key_data_len, nrounds, key, iv);

QByteArray bkey = reinterpret_cast<const char*>(key) //EDIT: Contains the key afterwards
QByteArray biv = reinterpret_cast<const char*>(iv) //EDIT: Is Null afterwards

  EVP_CIPHER_CTX_init(&en);
  EVP_EncryptInit_ex(&en, EVP_aes_256_cbc(), NULL, key, iv);

  char *input = source.data();
  char *out;
  int len = source.size();

  int c_len = len + 16, f_len = 0;
  unsigned char *ciphertext = (unsigned char *)malloc(c_len);

  EVP_EncryptInit_ex(&en, NULL, NULL, NULL, NULL);
  EVP_EncryptUpdate(&en, ciphertext, &c_len, (unsigned char *)input, len);
  EVP_EncryptFinal_ex(&en, ciphertext+c_len, &f_len);

  len = c_len + f_len;

  out = (char*)ciphertext;

  EVP_CIPHER_CTX_cleanup(&en);

  return QByteArray(out, len);
}

“源”在“123456789012345678901234567890123456789012ABC”中。
“密码”为“1HA!DH==SJAH48S8AK!?SKIITFI120XX”。

所以...如果我正确的话,那么EVP_BytesToKey()应该从密码中生成一个密钥,并提供数据以在后面解密字符串。

对base64编码的密钥是:“aqkrzd/zwmfu0vaqjyswsrkfjfs28pqjxym20ueynne=”
我不使用salt,所以没有IV(应该为null)。

因此Base64中的QByteArray bkey给我留下“aqkrzd/zwmfu0vaqjyswsrkfjfs28pqjxym20ueynne=”
QByteArray bvi给我null

加密文本为“CIUQILBZO+WJBR19IIOVRVC1DQGVRASTWO0K67TTRS51HB8ABJE8S4UXVB2D7DKR”。

现在我正在使用下面的PHP函数再次用生成的密钥解密密文:

<?php
function decrypt_data($data, $iv, $key) {
    $cypher = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CBC, '');

    //if(is_null($iv)) {
    //    $ivlen = mcrypt_enc_get_iv_size($cypher);
    //    $iv = substr($data, 0, $ivlen);
    //    $data = substr($data, $ivlen);
    //}

    // initialize encryption handle
    if (mcrypt_generic_init($cypher, $key, $iv) != -1) {
            // decrypt
            $decrypted = mdecrypt_generic($cypher, $data);

            // clean up
            mcrypt_generic_deinit($cypher);
            mcrypt_module_close($cypher);

            return $decrypted;
    }

    return false;
}

$ctext = "CiUqILbZo+WJBr19IiovRVc1dqGvrastwo0k67TTrs51HB8AbJe8S4uxvB2D7Dkr";
$key = "aQkrZD/zwMFU0VAqjYSWsrkfJfS28pQJXym20UEYNnE=";

$res = decrypt_data(base64_decode($ctext), null, base64_decode($key));

echo $res;
?>

现在我希望得到类似“12345678901234567890123456789012ABC”的响应。
我得到的是“7890123456789012ABC”。

我的字符串似乎是以正确的方式解密的,但它被切成两半,只显示最后19个字符。有人能帮我一下吗?我是加密的新手,不知道到底哪里出了问题。

共有1个答案

许俊晤
2023-03-14

这很可能是因为你那部分的曲解。你说:

我不使用盐,所以没有IV(应该为空)。

但完全没有理由会出现这种情况。evp_bytestokey方法提供了密钥和iv。关键显然是正确的,但IV不是。这将导致纯文本中出现随机字符(IV只更改第一个块)。由于此块可能包含控制字符和其他内容,因此它可能无法很好地显示。

请用您的Qt码再试一次,这一次打印出IV和钥匙...

 类似资料:
  • 由于 mcrypt 被认为是过时的,我的任务是升级当前代码以使用 openssl。听起来很简单,但是...经过几天的尝试和失败,我觉得自己疯了。 我的问题是:有什么方法可以用以前用mcrypt加密的openssl数据解密吗?我读过很多关于这个问题的帖子,大多数帖子都说,在运行mcrypt之前,需要对数据进行手动填充。问题是,mcrypted数据已经加密(使用mcrypt提供的自动空填充),并驻留在

  • 我正在尝试使用带有相同密钥和 iv 的 AES 加密相同的文本。我使用 bash 方法和 ruby 的 openssl stdlib,并对加密结果进行 b64 编码。但结果不同!我试图理解为什么。这是我所做的: 红宝石(1.9.3-p448) 砰砰�� -iv参数设置为上面计算的iv_hex值。 ========================================= 我仔细检查了静脉注

  • 问题内容: 我必须使用openssl命令行或C api加密xml文件。输出应为Base64。 一个Java程序将用于解密。该程序由客户提供,不能更改(他们正在将这些代码用于旧版应用程序)。正如您在下面的代码中看到的那样,客户提供了一个密码短语,因此将使用SecretKeySpec方法生成密钥。 Java代码: 我已经测试了几个命令,例如: 但是,使用Java无法成功解密给定的输出。为了进行测试,我

  • 我是密码学的新手。我的要求是对使用openssl加密/解密的文本进行解密/加密。我们在Openssl中使用的算法是aes-256-cbc。因此,我尝试在我的应用程序中实现相同的功能。到目前为止,在谷歌搜索了很多次之后,我所能做的就是。。 我的openssl命令是 我的密钥长度是32位IV是16位 Thnx...

  • 我编写的程序必须与基于PHP的web服务交换加密数据。我使用C++和OpenSSL在CBC模式下用AES-128加密数据。我将Base64编码的数据(IV和密文)发送到HTTP服务器,PHP必须用mcrypt解密数据。然而,只有第1块被成功解密,其他块都成为垃圾。我完全不明白:我们怎么只能在CBC模式下解密第1块?如果IV、密钥大小/块大小/轮数等密钥或算法设置错误,则不能正确接收到解密后的第一块

  • 或者唯一的方法是运行一个脚本,它将用mcrypt解密我存储的所有加密数据,并用openssl编码? 谢谢