杉哥的个人博客

php与java的rsa加密互通问题

近在整接口对接;对方用的是java,里面用到了RSA加密模式,我用php写,结果不行,发过去以后,对方表示无法解密

去官网看了下openssl_private_encrypt的OPENSSL_NO_PADDING形式;

For a 1024 bit key length => encrypted number of raw bytes is always a block of 128 bytes (1024 bits) by RSA design.
For a 2048 bit key length => encrypted number of raw bytes is always a block of 256 bytes (2048 bits) by RSA design.

然后就手动填充了ASCII 0;补全256字节就解决了
$Str = str_pad($Str, 256, “\0”, STR_PAD_LEFT);

public function rsaEncrypt($privateKey, $Str)
{
    //将字符串分块
    //加上标准头尾标签
    $res = "-----BEGIN RSA PRIVATE KEY-----" . PHP_EOL .
        wordwrap($privateKey, 64, PHP_EOL, true)
        . PHP_EOL . "-----END RSA PRIVATE KEY-----";
    $Res = openssl_pkey_get_private($res);
    if ($Res) {
        $Str = str_pad($Str, 256, "\0", STR_PAD_LEFT);
        if (openssl_private_encrypt($Str, $EncryptRes, $Res, OPENSSL_NO_PADDING)) {
            return base64_encode($EncryptRes);
        }
    }
    return '';
}