我正在使用以下函数通过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个字符。有人能帮我一下吗?我是加密的新手,不知道到底哪里出了问题。
这很可能是因为你那部分的曲解。你说:
我不使用盐,所以没有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编码? 谢谢