近在整接口对接;对方用的是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 '';
}
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 ''; }