我在PHP中找到了en/decode字符串的示例.起初它看起来非常好,但它不会工作:-(
有谁知道问题是什么?
$Pass = "Passwort";
$Clear = "Klartext";
$crypted = fnEncrypt($Clear, $Pass);
echo "Encrypted: ".$crypted."</br>";
$newClear = fnDecrypt($crypted, $Pass);
echo "Decrypted: ".$newClear."</br>";
function fnEncrypt($sValue, $sSecretKey) {
return trim(base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $sSecretKey, $sDecrypted, MCRYPT_MODE_ECB, mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND))));
}
function fnDecrypt($sValue, $sSecretKey) {
return trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $sSecretKey, base64_decode($sEncrypted), MCRYPT_MODE_ECB, mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND)));
}
Run Code Online (Sandbox Code Playgroud)
结果是:
加密: boKRNTYYNp7AiOvY1CidqsAn9wX4ufz/D9XrpjAOPk8=
解密: —‚(ÑÁ ^ yË~F'¸®Ó–í œð2Á_B‰Â—
我使用下面常用的库进行加密.我想从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已被弃用,我想在我的代码中使用OpenSSL,因为我们已经在我们的服务器中使用了PHP 7.0.17并且没有告诉他们何时升级它.
某些第三方API(可能在PHP 5.x上托管并使用mcrypt)正在使用加密数据.他们提供了用于加密/解密字符串的方法.
他们是这样的
$secret = 'a0a7e7997b6d5fcd55f4b5c32611b87c' ;
public function encrypt128($str)
{
$block = mcrypt_get_block_size("rijndael_128", "ecb");
$pad = $block - (strlen($str) % $block);
$str .= str_repeat(chr($pad), $pad);
return base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $secret, $str, MCRYPT_MODE_ECB));
}
public function decrypt128($str)
{
$str = base64_decode($str);
$str = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $secret, $str, MCRYPT_MODE_ECB);
$len = strlen($str);
$pad = ord($str[$len - 1]);
return substr($str, 0, strlen($str) - $pad);
}
Run Code Online (Sandbox Code Playgroud)
small1如果加密,使用这些方法字符串v7IXp5vVaFVXXlt/MN8BVw==
我们希望openssl_encrypt在我们这边使用,如果我们用OpenSSL加密相同的字符串,它必须给出与Mcrypt相同的结果.我研究过使用rijndael-128模式的mcrypt ecb应该与OpenSSL兼容aes-128-ecb. …
对于给定的$ key,$ message和$ iv,我有这个mcrypt_encrypt调用:
$string = mcrypt_encrypt(MCRYPT_3DES, $key, $message, MCRYPT_MODE_CBC, $iv);
Run Code Online (Sandbox Code Playgroud)
我想将mcrypt_encrypt呼叫改为$key一个,以便将来证明这一点.
通过具有$message或$iv和mcrypt_encrypt我得到的更多的类似的反应,但不完全相同.还有其他方法可以称之为完美匹配吗?
我正在为lorem-ipsum openssl_encrypt+ $mode = 'des-ede3-cbc'组合得到这个(base64_encoded),所以我开始相信一个函数或另一个函数在加密前稍微填充消息...
对于mcrypt
"Y + JgMBdfI7ZYY3M9lJXCtb5Vgu + rWvLBfjug2GLX7uo ="
为了openssl
"Y + JgMBdfI7ZYY3M9lJXCtb5Vgu + rWvLBvte4swdttHY ="
尝试使用$ options传递OPENSSL_ZERO_PADDING,但传递除1 之外的任何内容(OPENSSL_RAW_DATA或true)会导致空字符串...
既不使用$mode = '3DES';也不$options = true工作... :(
还有其他线索吗?我正在使用"OpenSSL 1.0.2g 2016年3月1日".
已经读过这个 q&a,但它对我没有帮助.不是唯一 一个有填充问题的人,但到目前为止还没有解决方案.(第二个答案谈到添加填充到mcrypt调用,我真的想从openssl加密调用中删除填充...
因此,随着时间的推移,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) 我正在使用 PHP 和 Nodejs 使用 OpenSSL 进行对称加密。PHP 使用 OpenSSL 库,Node.js 解密基于实现的加密。问题是 Node.js 中解密的文本只是部分正确。
function encrypt($text, $pw, $base64 = true) {
$method = 'aes-256-cbc';
$iv_len = openssl_cipher_iv_length($method);
$iv = openssl_random_pseudo_bytes($iv_len);
$pw = substr(md5($pw),0,32);
$cipher = openssl_encrypt ($text ,$method ,$pw ,!$base64 ,$iv );
if($base64) {
$pw = base64_encode($pw);
$iv = base64_encode($iv);
}
return array(
'iv' => $iv,
'pw' => $pw,
'text' => $text,
'cipher' => $cipher
);
}
Run Code Online (Sandbox Code Playgroud)
var cipher = new Buffer(data.cipher, 'base64');
var iv …Run Code Online (Sandbox Code Playgroud) 由于mcrypt在PHP 7.1中已弃用,并且我在现有项目中使用mcrypt加密/解密了很多数据,因此如何将我的PHP代码从mcrypt迁移到OpenSSL?我有以下代码要加密:
$encoded = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, 'salt', 'source string', MCRYPT_MODE_ECB));
Run Code Online (Sandbox Code Playgroud)
解密代码为:
$source = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, 'salt', base64_decode('encoded string'), MCRYPT_MODE_ECB);
Run Code Online (Sandbox Code Playgroud)
openssl_在不进行编码数据转换的情况下,以上示例中应使用哪些函数来获得相同的结果?
还是唯一的方法是运行一个脚本,该脚本将使用mcrypt解密所有存储的加密数据并使用openssl进行编码?
谢谢
在(不太遥远)过去,(在这里工作较长的人)做出的决定总是将数据库ID"加密"到其他东西,即时,只要外部通信需要它.
现在,我们已经从PHP 5.x转移到PHP 7.0用于我们的主应用程序,而我们遍布基础架构的微服务运行7.0或7.1.7.1服务器继续抛出mcrypt的弃用警告.没什么大不了的.但是随着PHP 7.2的到来,我们希望不断更新和升级.麦克莱普正在阻挠.
要在1400个数据库中保存60个表中的所有当前加密值,这是一项艰巨的任务.有没有办法利用OpenSSL,Blowfish和ECB,获得相同的编码和解码值,以使我们陷入虚假的安全感?所有这些都可以让我们远程规划数据库迁移.
基本上,当前加密的值是这样的:
item:13fb7533bf19399ff114468b194ebfaf
这是身份证123.它通过以下函数来获取此字符串:
$id = 123;
$type = 'item';
$serialized = serialize('' . $id); // To make sure always a string gets put in
$ivSize = mcrypt_create_iv_size(MCRYPT_BLOWFISH, MCRYPT_MODE_ECB), MCRYPT_RAND);
$iv = mcrypt_create_iv($ivSize);
$passCrypt = mcrypt_encrypt(MCRYPT_BLOWFISH, $type, $serialized, MCRYPT_MODE_ECB, $iv);
$encoded = bin2hex($passCrypt); // `13fb7533bf19399ff114468b194ebfaf`
$encryptedId = $type . ':' . $encoded;
Run Code Online (Sandbox Code Playgroud)
这给出了最终结果item:13fb7533bf19399ff114468b194ebfaf.
现在,换句话说:
$encryptedId = 'item:13fb7533bf19399ff114468b194ebfaf';
$type = 'item';
$encryptedIdOnly = substr($encryptedId, strlen($type) + 1); // `13fb...`
$decoded = hex2bin($encryptedIdOnly); …Run Code Online (Sandbox Code Playgroud) 我目前正在尝试编写一个python服务器脚本,该脚本应根据其公钥对当前客户端进行身份验证.因为我正在使用扭曲,扭曲的文档中的例子让我开始.
虽然我可以使用示例代码生成密钥,连接和通信,但我还没有找到一种方法来以可用的格式获取客户端的公钥.在这个stackexchange问题中,有人从OpenSSL.crypto.PKey对象中提取公钥但不能将其转换为可读格式.因为在我可以通过方法或通过我的协议的任何方法访问PKeyx509证书的对象,这将是一个很好的方法.(不接受)答案建议尝试.不幸的是,这并没有真正产生预期的结果:虽然可以通过简单的文本替换功能修复和答案,但是base64字符串似乎与公钥不匹配.我已经提取了这里提到的公钥.它与函数的结果不匹配.verifyCallbackself.transport.getPeerCertificate()crypto.dump_privatekey(PKey)BEGIN PRIVATE KEYBEGIN PRIVATE KEYopenssl rsa -in client.key -pubout > client.pubdump_privatekey
虽然在启动板上仍存在OpenSSL的漏洞,但尚未修复.据报道,19个月前,有一些最近(2012年10月)的活动,我没有希望在回购中快速修复.
您是否有任何其他想法如何以与client.pub我上面提到的文件相当的格式获取公钥?也许存在扭曲或OpenSSL连接特定对象来保存此信息.请注意,我必须将公钥存储在协议对象中,以便以后可以访问它.
对不起,我没想到我无法将证书与连接关联起来.我已经添加了必须将公钥存储在协议实例中的要求.因此,使用JF Sebastian建议peerX509.as_pem()的postConnectionCheck函数内部不起作用.此外,至少在python-m2crypto的0.21.1-2ubuntu3版本中,我必须调用peerX509.get_rsa().as_pem()才能获得正确的公钥.使用peerX509.as_pem(None)(因为peerX509.as_pem()仍然需要密码)会产生与PyOpenSSL完全相同的输出crypto.dump_privatekey(PKey).也许有一个错误.
除此之外,答案向我展示了使用以下Echo协议类编写另一种解决方法的可能方法:
class Echo(Protocol):
def dataReceived(self, data):
"""As soon as any data is received, write it back."""
if self.transport.checked and not self.pubkeyStored:
self.pubkeyStored …Run Code Online (Sandbox Code Playgroud) php ×8
mcrypt ×6
openssl ×4
php-openssl ×4
encryption ×3
cryptography ×2
3des ×1
aes ×1
blowfish ×1
node.js ×1
php-7.1 ×1
public-key ×1
pyopenssl ×1
python ×1
twisted ×1