杉哥的个人博客

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);

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
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 '';
}
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 ''; }
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 '';
}