使用phpseclib进行RSA和AES混合加密/解密失败

SPQRInc

我想使用非对称密钥对字符串进行加密和解密。

由于字符串可能更大,因此我决定尝试这样的混合解决方案:

<?php

use phpseclib\Crypt\RSA;
use phpseclib\Crypt\Rijndael;
use phpseclib\Crypt\Random;


function generateKeys()
{
    $rsa = new RSA();

    return $rsa->createKey();
}

function encrypt($plaintext, $asym_key, $key_length = 150)
{
    $rsa = new RSA();
    $rij = new Rijndael();

    $sym_key = Random::string($key_length);

    $rij->setKey($sym_key);
    $ciphertext = $rij->encrypt($plaintext);
    $ciphertext = base64_encode($ciphertext);

    $rsa->loadKey($asym_key);
    $sym_key = $rsa->encrypt($sym_key);

    $sym_key = base64_encode($sym_key);
    $len     = strlen($sym_key);

    $len
         = dechex($len);
    $len = str_pad($len, 3, '0', STR_PAD_LEFT);

    $message = $len.$sym_key.$ciphertext;

    return $message;
}

function decrypt($message, $asym_key)
{
    $rsa = new RSA();
    $rij = new Rijndael();

    $len     = substr($message, 0, 3);
    $len     = hexdec($len);
    $sym_key = substr($message, 0, $len);

    $message    = substr($message, 3);
    $ciphertext = substr($message, $len);
    $ciphertext = base64_decode($ciphertext);

    $rsa->loadKey($asym_key);
    $sym_key = base64_decode($sym_key);
    $sym_key = $rsa->decrypt($sym_key);

    // Decrypt the message
    $rij->setKey($sym_key);
    $plaintext = $rij->decrypt($ciphertext);

    return $plaintext;
}

$keys      = generateKeys();
$encrypted = encrypt('test', $keys['publickey']);

print_r($encrypted);

$decrypted = decrypt($encrypted, $keys['privatekey']);

print_r($decrypted);

这是我第一次尝试的结果:

公钥

-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDsH0CaSboYlkKGRvdHxa45649H
65I41SQtsRxfYDuJ2IFIcpTPgV/bEj+V/tLVL2HagMixB9v7J9E+HVmvXkhEVM/F
h5dc404/XID4LLvrasrdh3RfPpEWZm0afT7Vt4TXx8nv0gWU/8G2iJk+uMRpSZnk
PG/WT+4geBZ9O7SUTwIDAQAB
-----END PUBLIC KEY-----

私钥

-----BEGIN RSA PRIVATE KEY-----
MIICXQIBAAKBgQDsH0CaSboYlkKGRvdHxa45649H65I41SQtsRxfYDuJ2IFIcpTP
gV/bEj+V/tLVL2HagMixB9v7J9E+HVmvXkhEVM/Fh5dc404/XID4LLvrasrdh3Rf
PpEWZm0afT7Vt4TXx8nv0gWU/8G2iJk+uMRpSZnkPG/WT+4geBZ9O7SUTwIDAQAB
AoGAKMRAkCLYiXQv6iUIfpDHwuJDq6Qla8CI7Yadom3n+aWytIJr5OOuXBFrfwcu
+XWjzGjdvYrg1R0LyFCi8l8x1J1w3x40GlskOD+4mFHoTz2/NgEp+R8mOV4fJNJu
Y98aXuY30CrDK6flwGAlBhnv1I2UmE/+Sd/Z5iAjCPG2ueECQQD7bvZG7apeb2SY
TWzEFaDDXve0lPvxDWbQPuL8V19c05Uivsc6R/a3sz0DH5BHLDYBgWDZ25Ag26Ur
XwHqJ9z/AkEA8GkZqfn674LO0mQBi1eCMlmwvMTGTmlci7GT74MdROYzz+bKr8iD
lScbYb3d+rmmv95HgabxUKFEepikaTM4sQJBAN63l6eUdslX2r+eNa4rilAFG132
aoVH3b6xNddYfbx4Hy671zYk8MIgHvdZSjABVYVX2TaharXwWgplCgkkbnkCQQDG
qVL3zwa5nRJjcRiFmM6R5OPTWZe1fANpvFhO973cDY6LImAjWkLBogtSfZ9NbNSK
gJf+X4HR6zG3TSOvexBBAkBZveL+4gvpHzQNIGvG7hX6o1s7uxnnFv0hXOK5lN+v
tYwqeLRskvXGaET2wDWSsO1TN3Pz6uPwiQBlNYYUD4L0
-----END RSA PRIVATE KEY-----

加密的消息

158uPq8BV2hi39h6aZw7nwjgi0AQG+mYZnrBcdBNztj3uoGEptY4Q5jeBR+BHVSiwhrUbCf0EiRGekFHRTmNnr+glafIMaTsJABWQRDoUCMefz9hPz8G/JcLcg9/7XhQmtOeceAIWG0lkh/lsUCP3uKvRBv5sbjHgJkhUDcbM9P/zrQLuP0Qq+wLPfxa1yE907DvXJ4dRUJVJF9F+esi51ucQMU5GYQS48ThlmBvh69zUCf0NX6s9k5cCzGT42RW7hF3yHEwcr9lOZLAhq1tn9Z8qM0pNrUdHAcB6N2Hv5qDbr/rFw9fX0vKts8DM782ljpi9CF4dTyMdzKpKrl4Sgu+w==0vwVKQT8cL0VEEa32bQuLw==

现在,我想解密它:

decrypt($encrypted, $keys['privatekey']);

返回此错误:

PHP注意:/home/vagrant/code/vendor/phpseclib/phpseclib/phpseclib/Crypt/RSA.php中的解密错误位于第2580行

彼得

您没有在中正确分解消息decrypt

$sym_key = substr($message, 0, $len);

这包括长度。你可能想写

$sym_key = substr($message, 3, $len);

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用Linux使用AES进行文件加密/解密

使用AES和Base64编码进行加密和解密

RSA和AES解密和加密问题

如何在Golang中使用RSA密钥对进行AES加密和解密

在JAVA上使用RSA进行加密和解密的问题

使用RSA进行AES密钥交换的AES加密通信

RSA在Java和Go之间进行加密和解密

在Windows上使用openssl C ++进行RSA加密/解密错误

使用AES进行文件加密解密

使用C ++和WinCrypt库进行RSA加密以及使用C#进行解密

如何使用由travist / jsencrypt加密的phpseclib类Crypt_RSA解密数据

使用OpenSSL进行AES_128_CBC加密/解密

使用Java进行RSA加密并使用JavaScript进行解密

如何使用RSA和AES算法加密和解密文件

使用JS和PHP进行RSA加密和解密

使用CryptoJS在javascript中进行AES加密/解密

RSA在C和python之间进行加密/解密

如何使用RSA / AES加密/解密较大的文件

如何使用phpseclib进行加密和使用AES算法使用Java进行解密

使用Spring Security进行AES加密/解密

使用node-forge进行加密,并使用python和RSA-OAEP进行解密

使用phpseclib使用AES进行加密,并使用CryptoJS进行解密

使用Java NetBeans对图像进行rsa加密和解密

使用RSA和AES进行加密/解密;标准?

使用CryptoJS进行AES加密并使用CodeIgniter进行解密

使用 openssl 进行 phpseclib RSA 解密

使用 AES 和 RSA 的 Android 日志加密

RSA 加密、PHP 加密 (phpseclib) 和 JavaScript 解密 (crypto.subtle)

RSA解密使用Web加密api在Java和浏览器之间失败