![](/img/trans.png)
[英]PhpStorm Fatal error: Class 'Crypt_RSA' not found (phpseclib)
[英]How to decrypt data using phpseclib class Crypt_RSA that was encrypted by travist/jsencrypt
我正在使用带有 nginx、mysql、php7.3 的 linux ubuntu 服务器
<?php
//session_start();
$rsa = new Crypt_RSA();
extract($rsa->createKey());
$rsa->loadKey($privatekey);
$_SESSION['pr']=(empty($_SESSION['pr'])) ? $rsa : $_SESSION['pr'];
$rsa->loadKey($publickey);
$_SESSION['pu']=(empty($_SESSION['pu'])) ? $rsa : $_SESSION['pu'];
?>
<br /><input type="button" value="Show Encrypted" onclick="alert(crypted);"/> <input type="button" value="Show Decrypted" onclick="alert(decrypt);"/><br />
<script type="text/javascript">
var crypt = new JSEncrypt();
var public_key = '<?php echo der2pem($_SESSION["pu"], "RSA PUBLIC KEY";?>';
crypt.setPublicKey(public_key);
var input='i\'ve got a power';
var crypted=crypt.encrypt(input);
var decrypt=crypt.decrypt(crypted);
alert(crypted);
alert(decrypt);
</script>
<?php
// here i put the crypted var showed in alert
$var=base64_decode('##put your variable here');
$rsa->loadKey($_SESSION['pr']);
$dec=$rsa->decrypt($var);
echo '<br />'.$dec;
?>
嘿,纽伯特! 感谢您的回答,您确实帮助我弄清楚了我遇到的确切问题:当我使用 crypt.encrypt 函数而不设置密钥时,它会自己创建一个密钥对,然后自己设置它,所以我不会能够使用保存在我的 php 会话中的密钥解密消息。 但下一个问题是 crypt.setKey 函数需要的 pem rsa 格式。 所以现在我想问你知道如何将 b64 编码的 $rsa 转换为 pem 格式,我试图在 key 的两边添加相应的行,但它没有帮助。 我是否应该将其分解为每行末尾带有“\\n”的 64 字节行? 已经在这里找到了这样的功能
尝试在 phpseclib 中执行实际解密操作之前添加它:
$rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_PKCS1);
默认情况下,phpseclib 使用更安全但不太常见的 OAEP 填充。
正如 neubert 所说,我必须添加这一行 $rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_PKCS1); 在执行加密操作之前,然后使用此处的函数将 RSA 密钥从 DER 转换为 PEM 格式,然后在 crypt.setPublicKey() 中进行设置:
<?php
function der2pem($der_data, $type='CERTIFICATE') {
$pem = chunk_split(base64_encode($der_data), 64, "\n");
$pem = "-----BEGIN ".$type."-----\n".$pem."-----END ".$type."-----\n";
return $pem;
}
?>
谢谢!!!
我遇到了同样的问题,那是因为编码问题,所以请确保在 php 端
$enc = base64_decode ($request->encrypted);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.