我使用下面常用的库进行加密.我想从Mcrypt将其升级到OpenSSL,以便我不再使用已弃用的库.
我试图找出这是否可能.我对此做了一些研究,但我发现了相互矛盾的信息:
这篇文章说,使用用Mcrypt加密的OpenSSL无法解密数据. /sf/answers/1382394611/
但是,这篇文章说可以使用填充.看来我的函数使用了填充.这是否是使这项工作所需的正确填充类型? /sf/answers/2213033931/
<?php
namespace Utilities\Encryption;
/**
* A class to handle secure encryption and decryption of arbitrary data
*
* Note that this is not just straight encryption. It also has a few other
* features in it to make the encrypted data far more secure. Note that any
* other implementations used to decrypt data will have to do the same exact
* operations.
*
* Security Benefits:
*
* - Uses Key stretching
* …Run Code Online (Sandbox Code Playgroud) 目前我们在我们的系统上有一个mcrypt实现,用于在PHP应用程序中隐藏一些敏感数据.现在我们有了一个新的要求,我们必须将crypt模块更改为openssl.另一件重要的事情是我们使用密码河豚和模式ecb.所以我开始测试有什么区别以及如何使用openssl解密mcrypt加密字符串.
我使用标准的PHP函数:
两种方法都会产生不同的结果.第二件事是在两种类型的给定密码(河豚)和模式(ecb)中需要不同的IV长度(openssl = 0和mcrypt = 56).
有没有人知道如何在没有大量迁移工作的情况下轻松更改模块?
提前致谢!
更新:
这是代码,我测试了它:
<?php
function say($message){
if(!is_string($message)){
if(!isset($_SERVER["HTTP_USER_AGENT"])) echo "<pre>";
echo var_export($message, true) . ((!isset($_SERVER["HTTP_USER_AGENT"]) ? "\n" : "<br />"));
if(!isset($_SERVER["HTTP_USER_AGENT"])) echo "</pre>";
}else{
echo $message . ((!isset($_SERVER["HTTP_USER_AGENT"]) ? "\n" : "<br />"));
}
}
say("= Begin raw encryption");
$key = "anotherpass";
$str = "does it work";
say(" Params:");
say(" - String to encrypt '".$str."'");
say(" - Key: ".$key);
say("");
$params = array(
"openssl" => array(
"cipher" => "BF",
"mode" …Run Code Online (Sandbox Code Playgroud) 在node.js中,我使用build in函数来加密数据,如下所示:
var text = "Yes";
var password = "123456";
var encrypt = crypto.createCipher('aes-256-cbc', password);
var encryptOutput1 = encrypt.update(text, 'base64', 'base64');
var encryptOutput2 = encrypt.final('base64');
var encryptedText = encryptOutput1 + encryptOutput2;
Run Code Online (Sandbox Code Playgroud)
输出(加密文本)是:OnNINwXf6U8XmlgKJj48iA ==
然后我用PHP解密它:
$encrypted = 'OnNINwXf6U8XmlgKJj48iA==';
(or $encrypted = base64_decode('OnNINwXf6U8XmlgKJj48iA==') );
$dtext2 = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, $encrypted, MCRYPT_MODE_CBC);
echo "Decrypted: $dtext2";
Run Code Online (Sandbox Code Playgroud)
我会得到一些有趣的角色,我无法解密它.我尝试使用/不使用base64_decode或MCRYPT_RIJNDAEL_128 ..都失败了.
然后我检查PHP中的加密方式,它看起来与node.js的输出有很大的不同.
$text = "Yes";
$key = "123456";
$eText = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $text, MCRYPT_MODE_CBC);
echo "Encrypted: $eText \n";
echo "base64: " . base64_encode($eText) . " \n";
$dtext1 = …Run Code Online (Sandbox Code Playgroud) 在PHP中,我是RSA加密要由.NET应用程序解密的消息...但我不断从.NET获得"坏键"异常....
对于RSA加密,我使用PEAR类Crypt_RSA->加密公钥(这是一个模数,指数对)我从.NET中的工作加密系统获得...
我想最简单的问题是 - >"坏键"是否意味着它无法解密任何消息?IE,它没有正确加密?
更难的问题是 - > RSA加密是否有任何特定的东西导致.NET和PHP之间的怪癖?
我通过Apache和Node.js服务器之间的不安全连接发送数据.我需要在PHP中加密数据并在Node.js中解密.我花了两天时间试图让它工作,但是我只是设法让消息签名工作,没有加密.我尝试通过AES128-CBC,AES256-CBC,DES,AES128,AES256作为算法,但没有什么效果好..
我在PHP中试过这个:
$data = json_encode(Array('mk' => $_SESSION['key'], 'algorithm' => 'SHA1', 'username' => $_SESSION['userid'], 'expires' => $expires));
$payload = openssl_encrypt($data, 'des', '716c26ef');
return base64_encode($payload);
Run Code Online (Sandbox Code Playgroud)
在Node.js中:
var enc_json = new Buffer(response[1], 'base64');
var decipher = crypto.createDecipher('des', '716c26ef');
var json = decipher.update(enc_json).toString('ascii');
json += decipher.final('ascii');
Run Code Online (Sandbox Code Playgroud)
除了错误的解密数据,我得到如下错误:
TypeError: error:0606508A:digital envelope routines:EVP_DecryptFinal_ex:data not multiple of block length
TypeError: error:0606506D:digital envelope routines:EVP_DecryptFinal_ex:wrong final block length
Run Code Online (Sandbox Code Playgroud)
我需要一个简单的加密,因为数据不是太敏感(没有密码或用户数据),但数据只能由收件人读取.密钥长度可以是任何东西,但加密/解密的过程必须尽可能简单,请不要使用IV.
因此,随着时间的推移,mcrypt将进入PHP 7.2.当然还有另一种选择:openssl.
我发现很难从mcrypt切换到openssl,使用AES 256 CBC并保留IV.我对密码学有点新意,所以我真的不知道所有内容,但我理解基础知识.
假设我有以下代码
function encrypt($masterPassword, $data)
{
$keySize = mcrypt_get_key_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CBC);
$ivSize = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CBC);
$iv = mcrypt_create_iv($ivSize, MCRYPT_DEV_URANDOM);
$key = mb_substr(hash('SHA256', $masterPassword), 0, $keySize);
$encrypted = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $data, MCRYPT_MODE_CBC, $iv);
return base64_encode($iv . $encrypted);
}
function decrypt($masterPassword, $base64)
{
$keySize = mcrypt_get_key_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CBC);
$ivSize = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CBC);
$key = mb_substr(hash('SHA256', $masterPassword), 0, $keySize);
$data = base64_decode($base64);
$iv = substr($data, 0, $ivSize);
$encrypted = substr($data, $ivSize, strlen($data));
$decrypted = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, $encrypted, MCRYPT_MODE_CBC, $iv);
return trim($decrypted); …Run Code Online (Sandbox Code Playgroud)