Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/245.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有可能从PEAR密码迁移到PHPSecLib RSA吗?_Php_Encryption_Rsa_Pear_Phpseclib - Fatal编程技术网

有可能从PEAR密码迁移到PHPSecLib RSA吗?

有可能从PEAR密码迁移到PHPSecLib RSA吗?,php,encryption,rsa,pear,phpseclib,Php,Encryption,Rsa,Pear,Phpseclib,我们不久前迁移到PHPSecLib,但没有迁移由旧的PEAR\Crypt\u RSA库加密的遗留数据。我们已经到了需要将数据迁移到PHPSecLib的RSA格式的地步。在调查这件事时,我偶然发现。我试图在响应中应用该建议,但未能使其成功解密我们的数据。它并没有出错,只是看起来仍然被加密或编码。我们目前正在运行phpseclib2.0.6,我怀疑指令是针对1.x的 以下是我改编的解密流程的粗略版本(基于论坛线程): PEAR's Crypt_RSA中的漏洞 所以我在玩这个。PEAR的Crypt_R

我们不久前迁移到PHPSecLib,但没有迁移由旧的PEAR\Crypt\u RSA库加密的遗留数据。我们已经到了需要将数据迁移到PHPSecLib的RSA格式的地步。在调查这件事时,我偶然发现。我试图在响应中应用该建议,但未能使其成功解密我们的数据。它并没有出错,只是看起来仍然被加密或编码。我们目前正在运行phpseclib2.0.6,我怀疑指令是针对1.x的

以下是我改编的解密流程的粗略版本(基于论坛线程):


PEAR's Crypt_RSA中的漏洞

所以我在玩这个。PEAR的Crypt_RSA(最新版本)中有一个bug,可能会阻止它工作。下面的代码演示:

$key_pair = new Crypt_RSA_KeyPair(1024);
$privkey = $key_pair->getPrivateKey();
$pubkey = $key_pair->getPublicKey();
$a = $privkey->toString();
$b = $pubkey->toString();

echo $a == $b ? 'same' : 'different';
你会认为a美元和b美元是不同的,不是吗?他们不是。这是因为RSA/KeyPair.php执行以下操作:

$this->_public_key = &$obj;
...
$this->_private_key = &$obj;
如果删除了符号AND,它将正常工作,但默认情况下它们位于代码中

到目前为止,这似乎是一个尚未解决的问题

也许它在PHP4上的表现不同,但我不知道

解密数据

假设上面的bug对您来说不是问题,那么以下内容对我来说是有效的(使用phpseclib2.0):

使用toPEMString()生成的私钥

使用PEAR的Crypt_RSA,您可以通过另一种方式生成私钥:

$key_pair->toPEMString();
此方法在不更改代码的情况下工作。如果使用此方法生成私钥,则私钥从
----BEGIN RSA私钥------
开始。如果是这种情况,则不需要使用我编写的
loadKey
函数。您可以这样做:

$key = new RSA();
$key->loadKey('...');
$plaintext = decrypt($key, $ciphertext);
echo $plaintext;

“…它似乎仍然被加密或编码…”在不显示代码的情况下,此问题应作为离题结束。寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为、特定的问题或错误以及在问题本身中重现它所需的最短代码。没有明确问题陈述的问题对其他读者没有用处。看:@JamesKPolk,谢谢你的提醒。我认为这与其说是一个调试问题,不如说是一个“这件事真的可能吗?”的问题,但尽管如此,我还是提供了一个粗略的代码流示例。我还修改了文章的标题,以尝试符合我的意图。@bgrahamfs-
$key->loadKey(“…”)
基本上会尝试每种支持的密钥格式,直到找到一种加载密钥的格式为止。支持的密钥格式之一是接受数组的RSA::PUBLIC_FORMAT_RAW。它是唯一一种接受数组作为输入的键格式:感谢您的澄清和伟大的代码示例。我现在已经有了加密和解密的粗略概念证明。
$key_pair->toPEMString();
$key = new RSA();
$key->loadKey('...');
$plaintext = decrypt($key, $ciphertext);
echo $plaintext;