相关疑难解决方法(0)

PHP AES加密/解密

我在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‰Â—

php encryption cryptography aes encryption-symmetric

46
推荐指数
6
解决办法
20万
查看次数

将我的加密库从Mcrypt升级到OpenSSL

我使用下面常用的库进行加密.我想从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)

php encryption openssl mcrypt

20
推荐指数
1
解决办法
5909
查看次数

MCrypt rijndael-128到OpenSSL aes-128-ecb转换

由于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. …

php encryption cryptography mcrypt php-openssl

14
推荐指数
2
解决办法
1万
查看次数

php:mcrypt_encrypt到openssl_encrypt,以及OPENSSL_ZERO_PADDING问题

对于给定的$ 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$ivmcrypt_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_DATAtrue)会导致空字符串...

既不使用$mode = '3DES';也不$options = true工作... :(

还有其他线索吗?我正在使用"OpenSSL 1.0.2g 2016年3月1日".

已经读过这个 q&a,但它对我没有帮助.不是唯一 一个有填充问题的人,但到目前为止还没有解决方案.(第二个答案谈到添加填充到mcrypt调用,我真的想从openssl加密调用中删除填充...

php openssl 3des mcrypt php-openssl

13
推荐指数
1
解决办法
1万
查看次数

准备在PHP 7.2中删除Mcrypt

因此,随着时间的推移,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 openssl mcrypt php-7.1

7
推荐指数
1
解决办法
6752
查看次数

AES 在 PHP 中使用 OpenSSL 加密/在 Node.js 中解密

我正在使用 PHP 和 Nodejs 使用 OpenSSL 进行对称加密。PHP 使用 OpenSSL 库,Node.js 解密基于实现的加密。问题是 Node.js 中解密的文本只是部分正确

用于加密的 PHP 函数

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)

nodejs中的解密

var cipher = new Buffer(data.cipher, 'base64');
var iv …
Run Code Online (Sandbox Code Playgroud)

php node.js php-openssl

5
推荐指数
1
解决办法
7958
查看次数

如何使用以前使用mcrypt加密的OpenSSL解密字符串?

由于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进行编码?

谢谢

php mcrypt php-openssl

5
推荐指数
1
解决办法
1721
查看次数

从Mcrypt与Blowfish和ECB一起移动到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)

php openssl blowfish mcrypt

5
推荐指数
1
解决办法
2297
查看次数

使用pyOpenSSL从证书或其他连接信息中提取公钥

我目前正在尝试编写一个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主持的M2Crypto

对不起,我没想到我无法将证书与连接关联起来.我已经添加了必须将公钥存储在协议实例中的要求.因此,使用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)

python twisted pyopenssl public-key

3
推荐指数
1
解决办法
1万
查看次数