【问题标题】:RSA/ECB/PKCS1Padding decryption in PHP 7.2PHP 7.2 中的 RSA/ECB/PKCS1Padding 解密
【发布时间】:2019-02-04 13:51:22
【问题描述】:

从今天早上开始,我一直在努力让它发挥作用,但我已经被困在这件事上好几个小时了。 这是我的公钥:https://pastebin.com/EBszJhSi 我有一个字符串需要加密。

String = "你好"

这是我下面的代码...

function RSAEncryption($text)
{

    $encrypted = 'hey';
    $publicKey = "file:/".PUBLIC_KEY;
    $plaintext = "Hello";
    $pubkey = openssl_pkey_get_public(file_get_contents(PUBLIC_KEY));
    openssl_public_encrypt($plaintext, $encrypted, re($publicKey), OPENSSL_PKCS1_PADDING);
    echo $encrypted;   //encrypted string
    return $encrypted;
}

这不返回任何内容。一片空白。

var_dump(openssl_public_encrypt($plaintext, $encrypted, re($publicKey), OPENSSL_PKCS1_PADDING));

这将返回“假”。我也尝试了多个库,如 phpseclib,这还有另一个问题。我已经尝试了 phpseclib 的两个版本,1.0 和 2.0。 phpseclib 的问题是文件和一些变量丢失了,即使我是从官方来源下载的。

无论如何,有人可以帮我解决这个问题吗?

编辑:

PUBLIC_KEY 的值为/location/keys/publickey.pem

re()函数:

function re($key_file_path)
{
    $handle = fopen($key_file_path, "r");
    // echo "Key Contents : " . fread($handle, filesize($key_file_path)) . "<br>";
    return nl2br(fread($handle, filesize($key_file_path)));
}

【问题讨论】:

    标签: php rsa public-key-encryption phpseclib php-7.2


    【解决方案1】:

    使用 phpseclib:

    $key = '---- BEGIN SSH2 PUBLIC KEY ----
    Comment: "imported-openssh-key"
    AAAAB3NzaC1yc2EAAAABJQAAAQEAgsYRVei5nVln0cX9D/x5OcscdO5WCsmyZUEN
    dHhfgVD8UklasxcXElKoL0UEer9nvJWMILAU/ZMHbf0O1SaiYbhFmDFyHi/CfwT6
    QHD2mu7qLbadXXs0OiGiTUPwZX2Sux2uoxm0ZwfxjSbO85rlJ7Yg0ZjXkRiw+4qT
    OQNyYEq4Vt6R/BwIdf5Yt75+7Nzlm5HHi4TPNE63YJJTdazJQ1OWgdZWIZjk4M9K
    Zl8x9qNRsKd2GC1G6CGq+L1DOgBbPVWPE7DGUVYJYYF609Iau11LXS6d2FBDUS3S
    xna7mtmlZQNEvSRtctuojWfwWI2k1Ac/DW3RJ+M1ccN78dseEw==
    ---- END SSH2 PUBLIC KEY ----';
    
    $key = preg_replace('#----.*?----#', '', $key);
    $key = preg_replace('#Comment: .*#', '', $key);
    $key = str_replace(["\r", "\n"], '', $key);
    
    $key = 'ssh-rsa ' . $key;
    
    $rsa = new RSA();
    $rsa->loadKey($key);
    
    echo $rsa;
    

    回显密钥通常是查看密钥是否成功加载的好方法。如果您注释掉 preg_replace's、str_replace'ssh-rsa' . $key 位(即,如果您尝试直接加载密钥)它不会加载,但如果它们就位,那么它会加载。

    此技术不适用于 OpenSSL,因为 base64 编码的密钥结构最终是 SSH 格式的密钥,而 OpenSSL 不支持这些。相比之下,phpseclib 的格式与您的密钥完全相同,但格式不同。 phpseclib 期望密钥的格式与它们在 ~/.ssh/authorized_keys 文件中的格式相同。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-12
      • 1970-01-01
      • 2014-08-16
      • 1970-01-01
      • 2013-09-30
      • 1970-01-01
      • 1970-01-01
      • 2021-09-06
      相关资源
      最近更新 更多