【问题标题】:Phpseclib equivalent to Java RSA EncryptionPhpseclib 等效于 Java RSA 加密
【发布时间】:2016-03-15 05:12:20
【问题描述】:

我正在尝试使用 Cipher cipher = Cipher.getInstance("RSA"); 和 PHP 和 phpseclib 重现 Java 加密。

我尝试了很多方法,但似乎数据没有正确加密

$rsa = new Crypt_RSA();
$rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_OAEP);
$rsa->loadKey($pub_key);
$ciphertext = $rsa->encrypt($plaintext);

我尝试了不同的组合,比如

$rsa->setMGFHash('sha512');
$rsa->setHash('sha512');
//$rsa->setMGFHash('sha256');
//$rsa->setHash('sha256');

没有成功。

我错过了什么吗?

【问题讨论】:

    标签: java php encryption public-key-encryption phpseclib


    【解决方案1】:

    永远不要使用像这样不完整的密码字符串:

    Cipher cipher = Cipher.getInstance("RSA");
    

    这并没有指定填充,因此取决于默认安全提供者喜欢的填充。这可能会默认为:

    Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
    

    这将兼容

    $rsa = new Crypt_RSA();
    $rsa->loadKey($pub_key);
    $rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_PKCS1);
    $ciphertext = $rsa->encrypt($plaintext);
    

    但您不应再使用 PKCS#1 v1.5 填充。你真的应该使用 OAEP (meaning):

    Cipher cipher = Cipher.getInstance("RSA/ECB/OAEPWithSHA-256AndMGF1Padding");
    

    和 phpseclib 等效的应该是

    $rsa = new Crypt_RSA();
    $rsa->loadKey($pub_ley);
    $rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_OAEP);
    $rsa->setHash('sha256');
    $ciphertext = $rsa->encrypt($plaintext);
    

    【讨论】:

    • 感谢您的回复,很遗憾,我无法访问 Java 代码:/。我已经尝试过CRYPT_RSA_ENCRYPTION_PKCS1,但没有成功。
    • 当我尝试使用CRYPT_RSA_ENCRYPTION_PKCS1 时,$ciphertext 已经相同,而 Java 代码每次都会生成不同的密钥。我想 `Cipher.getInstance("RSA");` 正在使用 OAEP ?
    • 填充通常是随机的。 PKCS#1 v1.5 填充的类型 1 变体不使用随机化,因此对于相同的密钥和明文,每个密文都是相同的。如果要检查随机版本之间的兼容性,则需要在 Java 中加密并在 PHP 中解密,反之亦然。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-07
    • 2023-04-02
    • 1970-01-01
    • 2017-08-26
    • 2014-04-27
    • 2015-08-31
    • 2012-10-06
    相关资源
    最近更新 更多