【发布时间】:2017-11-10 21:20:32
【问题描述】:
我们不久前迁移到 PHPSecLib,但没有迁移由旧 PEAR\Crypt_RSA 库加密的遗留数据。我们已经到了需要将数据迁移到 PHPSecLib 的 RSA 格式的地步。在调查这个问题时,我遇到了this old forum thread。我试图在响应中应用该建议,但无法成功解密我们的数据。它没有出错或任何东西,它似乎仍然被加密或编码。我们目前正在运行 PHPSecLib 2.0.6,我怀疑这些说明是针对 1.x 的。
这是我改编的解密流程的粗略版本(基于论坛主题):
$rsaDecryptor = new RSA();
// The Private Key is encrypted based off a password
$mc = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_ECB, '');
$iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($mc), MCRYPT_DEV_URANDOM);
$keySize = mcrypt_enc_get_key_size($mc);
$key = substr($rsaDecryptor->password, 0, $keySize);
mcrypt_generic_init($mc, $key, $iv);
$privateKey = mdecrypt_generic($mc, base64_decode($privateKey));
mcrypt_generic_deinit($mc);
mcrypt_module_close($mc);
list($privateKeyModulus, $privateKeyExponent) = unserialize(base64_decode($privateKey));
$privateKeyExponent = new BigInteger(strrev($privateKeyExponent), 256);
$privateKeyModulus = new BigInteger(strrev($privateKeyModulus), 256);
$rsaDecryptor->modulus = $privateKeyModulus;
$rsaDecryptor->exponent = $privateKeyExponent;
$rsaDecryptor->publicExponent = $privateKeyExponent;
$rsaDecryptor->k = strlen($this->decRSA->modulus->toBytes());
// ciphertext is the raw encrypted string created by PEAR\Crypt_RSA
$value = base64_decode($ciphertext);
$value = new BigInteger($value, 256);
$value = $rsaDecryptor->_exponentiate($value)->toBytes();
$value = substr($value, 1);
【问题讨论】:
-
"...它似乎仍然被加密或编码..." 如果不显示您的代码,这个问题应该作为题外话关闭。寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为、特定的问题或错误以及在问题本身中重现它所需的最短代码。没有明确问题陈述的问题对其他读者没有用处。见:How to create a Minimal, Complete, and Verifiable example
-
@JamesKPolk,感谢您的提醒。我认为这与其说是一个调试问题,不如说是一个“这件事真的可能吗?”问题,但话虽如此,我已经提供了一个粗略的代码流示例。我还修改了帖子的标题以尝试符合我的意图。
标签: php encryption rsa pear phpseclib